From 6bb6c571552920e9feda1873cac84f39190934b9 Mon Sep 17 00:00:00 2001 From: SA Date: Fri, 11 Apr 2025 00:58:59 +0200 Subject: [PATCH] squash --- .dockerignore | 3 + .flake8 | 4 + .gitignore | 6 +- .pre-commit-config.yaml | 16 - Dockerfile | 17 +- Dockerfile-ci | 42 + Dockerfile-client | 13 + client/.dockerignore | 29 - client/.vscode/extensions.json | 3 - client/.vscode/settings.json | 12 +- client/Dockerfile | 16 - client/Dockerfile.dev | 15 - client/configs/build-templates.js | 92 - client/configs/emmet/snippets.json | 5 - client/configs/parse-config.mjs | 42 + client/configs/vars.js | 21 - client/configs/vars.mjs | 49 + client/extra.d.ts | 10 + client/fluid-player/.babelrc | 3 + client/fluid-player/.editorconfig | 15 + .../.github/ISSUE_TEMPLATE/bug_report.md | 41 + .../.github/ISSUE_TEMPLATE/feature_request.md | 20 + .../.github/ISSUE_TEMPLATE/question.md | 13 + .../.github/pull_request_template.md | 16 + client/fluid-player/.gitignore | 25 + client/fluid-player/.npmignore | 9 + client/fluid-player/CHANGELOG.md | 372 + client/fluid-player/CONTRIBUTING.md | 54 + client/fluid-player/LICENSE | 21 + client/fluid-player/README.md | 23 + client/fluid-player/e2e/ads_linear.spec.ts | 181 + client/fluid-player/e2e/controls.spec.ts | 69 + client/fluid-player/e2e/functions/network.ts | 21 + client/fluid-player/e2e/functions/video.ts | 86 + .../e2e/snapshots/baseline-sv-grid.png | Bin 0 -> 490589 bytes .../fluid-player/e2e/suggested_videos.spec.ts | 37 + client/fluid-player/package-lock.json | 7233 +++++ client/fluid-player/package.json | 60 + client/fluid-player/playwright.config.ts | 73 + client/fluid-player/src/browser.js | 19 + client/fluid-player/src/css/fluidplayer.css | 1590 + .../fluid-player/src/css/suggestedVideos.css | 143 + client/fluid-player/src/fluidplayer.js | 3469 +++ client/fluid-player/src/index.d.ts | 222 + client/fluid-player/src/index.js | 33 + client/fluid-player/src/modules/adsupport.js | 1751 ++ client/fluid-player/src/modules/cardboard.js | 343 + client/fluid-player/src/modules/miniplayer.js | 385 + client/fluid-player/src/modules/streaming.js | 299 + client/fluid-player/src/modules/subtitles.js | 225 + .../src/modules/suggestedVideos.js | 197 + client/fluid-player/src/modules/timeline.js | 202 + client/fluid-player/src/modules/utils.js | 326 + client/fluid-player/src/modules/vast.js | 1122 + client/fluid-player/src/modules/vpaid.js | 543 + client/fluid-player/src/polyfills.js | 77 + client/fluid-player/src/static/close-icon.svg | 4 + .../fluid-player/src/static/fluid-icons.svg | 353 + .../fluid-player/src/static/fluid-spinner.svg | 7 + .../src/static/miniplayer-toggle-off.svg | 3 + .../src/static/miniplayer-toggle-on.svg | 3 + .../fluid-player/src/static/skip-backward.svg | 5 + .../fluid-player/src/static/skip-forward.svg | 18 + client/fluid-player/src/types.ts | 546 + .../test/html/custom_context.tpl.html | 43 + .../fluid-player/test/html/dash_live.tpl.html | 29 + .../test/html/dash_live_vast.tpl.html | 44 + .../fluid-player/test/html/dash_vod.tpl.html | 29 + .../test/html/dash_vod_vast.tpl.html | 44 + .../test/html/e2e/ads_linear.html | 48 + .../fluid-player/test/html/e2e/controls.html | 37 + .../html/e2e/suggested_videos_e2e.tpl.html | 42 + .../fluid-player/test/html/hls_live.tpl.html | 29 + .../test/html/hls_live_vast.tpl.html | 44 + .../fluid-player/test/html/hls_vod.tpl.html | 29 + .../test/html/hls_vod_suggested_videos.html | 51 + .../test/html/hls_vod_vast.tpl.html | 44 + .../html/player-reinitialization.tpl.html | 82 + .../test/html/skip_return.tpl.html | 42 + .../test/html/special-cases/_README.md | 18 + .../internal-vast-click-tracking-issue.html | 38 + .../html/special-cases/issue-702.tpl.html | 34 + .../test/html/suggested_videos_ads.tpl.html | 66 + .../html/suggested_videos_subtitles.tpl.html | 57 + .../fluid-player/test/html/vod_basic.tpl.html | 31 + .../test/html/vod_basic_autohide.tpl.html | 39 + .../test/html/vod_basic_by_ref.tpl.html | 32 + .../html/vod_basic_cta_from_config.tpl.html | 42 + .../html/vod_basic_cta_from_vast.tpl.html | 50 + ...sic_cta_from_vast_no_friendly_url.tpl.html | 41 + .../test/html/vod_basic_multiple.tpl.html | 43 + .../test/html/vod_basic_subtitles.tpl.html | 35 + .../test/html/vod_basic_vr.tpl.html | 34 + .../test/html/vod_basic_vr_autoplay.tpl.html | 35 + .../test/html/vod_basic_vtt.tpl.html | 38 + .../test/html/vod_basic_vtt_static.tpl.html | 1857 ++ .../fluid-player/test/html/vod_event_api.html | 72 + .../test/html/vod_extended.tpl.html | 75 + .../test/html/vod_live_ad.tpl.html | 49 + .../test/html/vod_miniplayer.tpl.html | 136 + .../test/html/vod_responsive.tpl.html | 69 + .../test/html/vod_vast__linear.html | 60 + .../test/html/vod_vast__non_linear.html | 60 + .../test/html/vod_vast_ad_buffet.tpl.html | 42 + .../vod_vast_ad_buffet_with_error.tpl.html | 44 + .../test/html/vod_vast_ad_pod.tpl.html | 42 + .../vod_vast_ad_pod_from_wrapper.tpl.html | 42 + .../html/vod_vast_ad_pod_truncated.tpl.html | 46 + ...st_followAdditionalWrappers_false.tpl.html | 43 + ...ast_followAdditionalWrappers_true.tpl.html | 41 + .../test/html/vod_vast_on-demand.html | 65 + .../html/vod_vast_waterfall_false.tpl.html | 47 + ...d_vast_waterfall_false_http_error.tpl.html | 47 + .../html/vod_vast_waterfall_true.tpl.html | 47 + ...od_vast_waterfall_true_http_error.tpl.html | 47 + .../test/html/vod_vast_wrapper.tpl.html | 41 + .../html/vod_vast_wrapper_cyclical.tpl.html | 43 + .../test/html/vod_vpaid_linear.html | 41 + .../vod_vpaid_linear_viewableImpresson.html | 80 + .../test/html/vod_vpaid_non_linear.html | 41 + client/fluid-player/test/index.html | 57 + client/fluid-player/test/static/logo.png | Bin 0 -> 6228 bytes .../test/static/special-cases/fp-215-2.xml | 108 + .../test/static/special-cases/fp-215.xml | 37 + .../test/static/subtitles/deutsch.vtt | 309 + .../test/static/subtitles/english.vtt | 357 + .../static/suggested_videos_example_v1.json | 396 + .../static/suggested_videos_example_v2.json | 383 + .../static/suggested_videos_example_v3.json | 170 + .../fluid-player/test/static/thumbnails.jpg | Bin 0 -> 998422 bytes .../fluid-player/test/static/thumbnails.vtt | 607 + client/fluid-player/test/static/vast4.xsd | 1284 + .../test/static/vast_ad_buffet.xml | 126 + .../test/static/vast_ad_buffet_with_error.xml | 105 + .../fluid-player/test/static/vast_ad_pod.xml | 170 + client/fluid-player/test/static/vast_cta.xml | 76 + .../test/static/vast_cta_no_friendly_url.xml | 73 + client/fluid-player/test/static/vast_hls.xml | 52 + .../fluid-player/test/static/vast_linear.xml | 72 + .../test/static/vast_linear_e2e.xml | 72 + .../fluid-player/test/static/vast_no_ad.xml | 3 + .../test/static/vast_nonlinear.xml | 46 + .../fluid-player/test/static/vast_wrapper.xml | 23 + .../test/static/vast_wrapper_cyclical.xml | 23 + .../vast_wrapper_fallbackOnNoAd_false.xml | 151 + ...rapper_fallbackOnNoAd_false_http_error.xml | 151 + .../vast_wrapper_fallbackOnNoAd_true.xml | 151 + ...wrapper_fallbackOnNoAd_true_http_error.xml | 151 + ...wrapper_followAdditionalWrappers_false.xml | 23 + ..._wrapper_followAdditionalWrappers_true.xml | 23 + .../test/static/vast_wrapper_to_ad_pod.xml | 23 + .../test/static/video-thumbnail.jpg | Bin 0 -> 109919 bytes .../fluid-player/test/static/vpaid_linear.xml | 67 + .../test/static/vpaid_nonlinear.xml | 42 + client/fluid-player/vendor/webvtt.js | 702 + client/fluid-player/webpack.config.js | 185 + client/fluid-player/yarn.lock | 3899 +++ client/index.html | 13 + client/jsconfig.json | 9 - client/package-lock.json | 24207 ++++++++++------ client/package.json | 121 +- client/scripts/validate.mjs | 32 + client/src/api/_index.js | 2 - client/src/api/account/account.ts | 19 + .../src/api/account/administrator/account.ts | 11 + .../src/api/account/administrator/accounts.ts | 46 + .../api/account/administrator/change-roles.ts | 22 + client/src/api/account/administrator/index.ts | 3 + .../src/api/account/auto-import-keys/get.ts | 19 + .../src/api/account/auto-import-keys/index.ts | 2 + .../api/account/auto-import-keys/revoke.ts | 15 + client/src/api/account/change-password.ts | 24 + client/src/api/account/dms/get.ts | 22 + client/src/api/account/dms/index.ts | 2 + client/src/api/account/dms/review.ts | 21 + .../api/account/favorites/favorite-post.ts | 25 + .../api/account/favorites/favorite-profile.ts | 17 + .../favorites/get-favourite-artists.ts | 15 + .../account/favorites/get-favourite-posts.ts | 15 + client/src/api/account/favorites/index.ts | 4 + client/src/api/account/index.ts | 4 + client/src/api/account/moderator/index.ts | 5 + .../moderator/profile-link-requests.ts | 30 + client/src/api/account/notifications.ts | 17 + client/src/api/account/profiles.ts | 42 + client/src/api/authentication/index.ts | 3 + client/src/api/authentication/login.ts | 28 + client/src/api/authentication/logout.ts | 9 + client/src/api/authentication/register.ts | 20 + client/src/api/dms/all.ts | 29 + client/src/api/dms/has-pending.ts | 8 + client/src/api/dms/index.ts | 3 + client/src/api/dms/profile.ts | 27 + client/src/api/files/archive-file.ts | 35 + client/src/api/files/index.ts | 2 + client/src/api/files/search-by-hash.ts | 56 + client/src/api/imports/create-import.ts | 26 + client/src/api/imports/get-import.ts | 9 + client/src/api/imports/index.ts | 2 + client/src/api/kemono/_index.js | 14 - client/src/api/kemono/api.js | 100 - client/src/api/kemono/dms.js | 22 - client/src/api/kemono/favorites.js | 142 - client/src/api/kemono/kemono-fetch.js | 46 - client/src/api/kemono/posts.js | 26 - client/src/api/paysites/_index.js | 1 - client/src/api/posts/announcements.ts | 9 + client/src/api/posts/flag.ts | 14 + client/src/api/posts/index.ts | 7 + client/src/api/posts/popular.ts | 74 + client/src/api/posts/post.ts | 71 + client/src/api/posts/posts.ts | 35 + client/src/api/posts/random.ts | 15 + client/src/api/posts/revision.ts | 39 + client/src/api/profiles/discord/index.ts | 29 + client/src/api/profiles/fancards.ts | 9 + client/src/api/profiles/index.ts | 6 + client/src/api/profiles/links.ts | 21 + client/src/api/profiles/posts.ts | 58 + client/src/api/profiles/profile.ts | 22 + client/src/api/profiles/profiles.ts | 12 + client/src/api/profiles/random.ts | 14 + client/src/api/shares/index.ts | 3 + client/src/api/shares/profile.ts | 37 + client/src/api/shares/share.ts | 15 + client/src/api/shares/shares.ts | 24 + client/src/api/tags/all.ts | 14 + client/src/api/tags/index.ts | 2 + client/src/api/tags/profile.ts | 29 + client/src/browser/hooks/index.ts | 3 + client/src/browser/hooks/use-client.tsx | 38 + client/src/browser/hooks/use-interval.tsx | 27 + .../browser/hooks/use-route-path-pattern.tsx | 11 + client/src/browser/storage/local/index.ts | 81 + client/src/components/_index.scss | 11 + client/src/components/advs/ads.tsx | 82 + client/src/components/advs/index.ts | 1 + client/src/components/buttons/_index.scss | 1 + .../buttons}/buttons.scss | 0 client/src/components/buttons/buttons.tsx | 21 + client/src/components/buttons/index.ts | 1 + .../{pages => }/components/cards/_index.scss | 4 +- .../{pages => }/components/cards/base.scss | 2 +- client/src/components/cards/base.tsx | 41 + .../cards}/card_list.scss | 9 +- client/src/components/cards/card_list.tsx | 122 + client/src/components/cards/dm.module.scss | 3 + .../src/{pages => }/components/cards/dm.scss | 2 +- client/src/components/cards/dm.tsx | 86 + client/src/components/cards/index.ts | 7 + .../components/cards/no_results.scss | 2 +- client/src/components/cards/no_results.tsx | 21 + .../{pages => }/components/cards/post.scss | 28 +- client/src/components/cards/post.tsx | 133 + .../cards/profile.scss} | 2 +- client/src/components/cards/profile.tsx | 132 + client/src/components/cards/share.tsx | 28 + .../dangerous-content/dangerous.tsx | 44 + .../src/components/dangerous-content/index.ts | 1 + client/src/components/dates/_index.scss | 1 + client/src/components/dates/index.ts | 1 + .../dates}/timestamp.scss | 0 client/src/components/dates/timestamp.tsx | 27 + .../components/details/details.module.scss | 6 + client/src/components/details/details.tsx | 19 + client/src/components/details/index.ts | 1 + client/src/components/errors/api-error.tsx | 183 + client/src/components/errors/error-view.tsx | 81 + client/src/components/errors/fetch-error.tsx | 46 + client/src/components/errors/index.ts | 1 + .../src/components/errors/invalid-error.tsx | 35 + client/src/components/flash_messages.tsx | 19 + client/src/components/formatting/index.ts | 1 + .../src/components/formatting/pre.module.scss | 5 + client/src/components/formatting/pre.tsx | 11 + .../src/components/forms/client.module.scss | 7 + client/src/components/forms/client.tsx | 97 + client/src/components/forms/index.ts | 6 + client/src/components/forms/inputs/base.tsx | 12 + client/src/components/forms/inputs/hidden.tsx | 9 + client/src/components/forms/inputs/index.ts | 6 + .../src/components/forms/inputs/integer.tsx | 10 + client/src/components/forms/inputs/number.tsx | 15 + client/src/components/forms/inputs/radio.tsx | 10 + client/src/components/forms/inputs/select.tsx | 18 + client/src/components/forms/inputs/text.tsx | 10 + client/src/components/forms/label.tsx | 19 + .../src/components/forms/router.module.scss | 7 + client/src/components/forms/router.tsx | 76 + .../components/forms/sections/fieldset.tsx | 28 + client/src/components/forms/sections/index.ts | 5 + .../src/components/forms/sections/integer.tsx | 36 + .../forms/sections/radio-group.module.scss | 6 + .../components/forms/sections/radio-group.tsx | 16 + .../forms/sections/radio.module.scss | 23 + .../src/components/forms/sections/radio.tsx | 37 + .../src/components/forms/sections/section.tsx | 10 + .../src/components/forms/sections/select.tsx | 34 + client/src/components/forms/sections/text.tsx | 26 + client/src/components/forms/sections/types.ts | 18 + client/src/components/forms/submit_button.tsx | 19 + client/src/components/forms/types.ts | 11 + client/src/components/images/_index.scss | 2 + .../images}/fancy_image.scss | 0 client/src/components/images/fancy_image.tsx | 57 + .../images}/image_link.scss | 0 client/src/components/images/image_link.tsx | 31 + client/src/components/images/index.ts | 2 + .../components/importer_states.scss | 0 client/src/components/layout/_index.scss | 2 + .../src/components/layout/footer.module.scss | 6 + client/src/components/layout/footer.tsx | 33 + client/src/components/layout/index.ts | 2 + .../layout}/shell.scss | 17 +- client/src/components/layout/shell.tsx | 425 + .../layout}/sidebar.scss | 2 +- client/src/components/layout/sidebar.tsx | 143 + client/src/components/links/_index.scss | 1 + client/src/components/links/index.ts | 9 + .../links}/links.scss | 3 +- client/src/components/links/links.tsx | 152 + .../components/lists/description.module.scss | 43 + client/src/components/lists/description.tsx | 75 + client/src/components/lists/index.ts | 12 + client/src/components/loading/_index.scss | 1 + client/src/components/loading/index.ts | 1 + .../loading}/loading_icon.scss | 0 .../src/components/loading/loading_icon.tsx | 19 + .../src/components/meta/block-component.tsx | 27 + client/src/components/meta/index.ts | 2 + client/src/components/meta/types.ts | 18 + client/src/components/modal/index.ts | 1 + client/src/components/modal/modal.module.scss | 17 + client/src/components/modal/modal.tsx | 47 + client/src/components/overviews/index.ts | 10 + .../components/overviews/overview.module.scss | 42 + client/src/components/overviews/overview.tsx | 35 + client/src/components/pages/_index.scss | 1 + client/src/components/pages/account.tsx | 68 + client/src/components/pages/error.module.scss | 5 + client/src/components/pages/error.tsx | 42 + client/src/components/pages/index.ts | 10 + client/src/components/pages/profile.tsx | 39 + .../components => components/pages}/site.scss | 3 +- client/src/components/pages/site.tsx | 47 + client/src/components/pagination/_index.scss | 2 + .../pagination/collection.module.scss | 7 + client/src/components/pagination/index.ts | 5 + .../components/pagination/local.module.scss | 95 + client/src/components/pagination/local.tsx | 148 + .../pagination/pagination-info.module.scss | 7 + .../components/pagination/pagination-info.tsx | 26 + .../pagination/pagination.module.scss | 99 + .../src/components/pagination/pagination.tsx | 147 + .../src/components/pagination/paginator.scss | 61 + .../src/components/pagination/paginator.tsx | 150 + .../pagination}/paginator_new.scss | 2 +- .../components/pagination/paginator_new.tsx | 153 + .../components/pagination/wrapper.module.scss | 1 + client/src/components/pagination/wrapper.tsx | 12 + .../src/{pages => }/components/tooltip.scss | 2 +- client/src/components/tooltip.tsx | 26 + client/src/css/_index.scss | 2 +- client/src/css/attributes.scss | 2 +- client/src/css/base.scss | 41 +- client/src/css/blocks/form.scss | 2 +- client/src/css/config/variables.scss | 28 +- client/src/css/config/variables/sass.scss | 31 + client/src/css/legacy.scss | 174 +- client/src/css/sass-mixins.scss | 2 +- client/src/development/entry.js | 1 - client/src/development/entry.scss | 3 - .../account}/_index.scss | 0 client/src/entities/account/index.ts | 41 + client/src/entities/account/lib/auth.ts | 51 + .../entities/account/lib/favorite-posts.ts | 185 + .../account/lib/favourite-profiles.ts | 172 + client/src/entities/account/lib/roles.ts | 29 + .../account}/notification.scss | 0 client/src/entities/account/notification.tsx | 27 + client/src/entities/account/notifications.ts | 8 + .../src/entities/account/preview.module.scss | 19 + client/src/entities/account/preview.tsx | 41 + .../account}/service_key.scss | 0 client/src/entities/account/service_key.tsx | 71 + client/src/entities/account/types.ts | 75 + .../administrator/account-overview.tsx | 80 + client/src/entities/administrator/index.ts | 1 + client/src/entities/dms/index.ts | 1 + client/src/entities/dms/types.ts | 18 + client/src/entities/files/index.ts | 6 + client/src/entities/files/types.ts | 49 + client/src/entities/paysites/index.ts | 3 + client/src/entities/paysites/lib/validate.ts | 11 + client/src/entities/paysites/list.ts | 101 + client/src/entities/paysites/types.ts | 6 + .../entities/posts/announcement.module.scss | 33 + client/src/entities/posts/announcement.tsx | 32 + .../entities/posts/discord-server.module.scss | 21 + client/src/entities/posts/discord-server.tsx | 35 + client/src/entities/posts/discord.module.scss | 64 + client/src/entities/posts/discord.tsx | 158 + client/src/entities/posts/index.ts | 21 + .../entities/posts/overview/body.module.scss | 15 + client/src/entities/posts/overview/body.tsx | 337 + .../src/entities/posts/overview/clean-body.ts | 111 + .../posts/overview/flag-button.module.scss | 183 + .../entities/posts/overview/flag-button.tsx | 182 + .../posts/overview/footer.module.scss | 3 + client/src/entities/posts/overview/footer.tsx | 186 + client/src/entities/posts/overview/header.tsx | 276 + .../posts/overview/overview.module.scss | 7 + .../src/entities/posts/overview/overview.tsx | 92 + client/src/entities/posts/overview/types.ts | 32 + client/src/entities/posts/overview/video.tsx | 96 + client/src/entities/posts/period.ts | 15 + client/src/entities/posts/types.ts | 153 + client/src/entities/profiles/headers.tsx | 185 + client/src/entities/profiles/index.ts | 4 + client/src/entities/profiles/lib/get.ts | 152 + client/src/entities/profiles/tabs.tsx | 119 + client/src/entities/profiles/types.ts | 23 + client/src/entities/tags/index.ts | 2 + client/src/entities/tags/lib/get.ts | 7 + client/src/entities/tags/types.ts | 4 + client/src/env/derived-vars.js | 4 - client/src/env/derived-vars.ts | 30 + client/src/env/env-vars.js | 31 - client/src/env/env-vars.ts | 139 + client/src/index.scss | 3 + client/src/index.tsx | 24 + client/src/js/account.js | 1 - client/src/js/admin.js | 7 - client/src/js/admin.scss | 3 - client/src/js/component-factory.js | 35 - client/src/js/favorites.js | 207 - client/src/js/feature-detect.js | 13 - client/src/js/global.js | 18 - client/src/js/global.scss | 2 - client/src/js/moderator.js | 7 - client/src/js/moderator.scss | 1 - client/src/js/page-loader.js | 37 - client/src/js/pending-review-dms.js | 19 - client/src/js/resumable.js | 1242 - client/src/jsconfig.json | 21 - client/src/lib/_index.js | 1 - client/src/lib/api/error-v2.ts | 42 + client/src/lib/api/error.ts | 33 + client/src/lib/api/fetch.ts | 149 + client/src/lib/api/index.ts | 4 + client/src/lib/api/types.ts | 25 + client/src/lib/api/v2.ts | 145 + client/src/lib/errors/error.ts | 11 + client/src/lib/errors/index.ts | 2 + client/src/lib/errors/invalid.ts | 16 + client/src/lib/fetch/errors.ts | 36 + client/src/lib/fetch/fetch.ts | 18 + client/src/lib/fetch/index.ts | 2 + client/src/lib/http/headers.ts | 12 + client/src/lib/http/index.ts | 2 + client/src/lib/http/status.ts | 66 + client/src/lib/imports/lib.js | 148 - client/src/lib/numbers/index.ts | 3 + client/src/lib/pagination/index.ts | 7 + client/src/lib/pagination/lib.ts | 51 + client/src/lib/pagination/types.ts | 8 + client/src/lib/types/index.ts | 19 + client/src/lib/urls/account.ts | 94 + client/src/lib/urls/administrator.ts | 29 + client/src/lib/urls/artists.ts | 45 + client/src/lib/urls/authentication.ts | 21 + client/src/lib/urls/dms.ts | 16 + client/src/lib/urls/documentation.ts | 7 + client/src/lib/urls/files.ts | 35 + client/src/lib/urls/importer.ts | 7 + client/src/lib/urls/index.ts | 58 + client/src/lib/urls/internal-url.ts | 40 + client/src/lib/urls/kemono.ts | 13 + client/src/lib/urls/moderator.ts | 7 + client/src/lib/urls/posts.ts | 113 + client/src/lib/urls/profiles.ts | 126 + client/src/lib/urls/shares.ts | 21 + client/src/lib/urls/tags.ts | 8 + client/src/pages/2257.tsx | 49 + client/src/pages/_index.js | 43 - client/src/pages/_index.scss | 9 +- client/src/pages/account/_index.js | 2 - client/src/pages/account/_index.scss | 2 +- .../src/pages/account/administrator/_index.js | 4 - .../pages/account/administrator/_index.scss | 1 - .../account/administrator/account.module.scss | 6 + .../pages/account/administrator/account.tsx | 102 + .../account/administrator/account_files.html | 20 - .../account/administrator/account_info.html | 21 - .../pages/account/administrator/accounts.html | 141 - .../administrator/accounts.module.scss | 6 + .../pages/account/administrator/accounts.scss | 3 +- .../pages/account/administrator/accounts.tsx | 174 + .../account/administrator/dashboard.html | 18 - .../administrator/dashboard.module.scss | 6 + .../pages/account/administrator/dashboard.tsx | 28 + .../account/administrator/mods_actions.html | 18 - .../pages/account/administrator/shell.html | 18 - .../pages/account/administrator/shell.scss | 1 - client/src/pages/account/change_password.html | 44 - client/src/pages/account/change_password.js | 45 - client/src/pages/account/change_password.tsx | 116 + .../account/components/notification.html | 20 - .../pages/account/components/service_key.html | 50 - client/src/pages/account/favorites/legacy.tsx | 6 + .../pages/account/favorites/posts.module.scss | 14 + client/src/pages/account/favorites/posts.tsx | 185 + .../account/favorites/profiles.module.scss | 14 + .../src/pages/account/favorites/profiles.tsx | 190 + client/src/pages/account/home.html | 80 - client/src/pages/account/home.scss | 5 + client/src/pages/account/home.tsx | 130 + client/src/pages/account/keys.html | 53 - client/src/pages/account/keys.scss | 2 +- client/src/pages/account/keys.tsx | 113 + client/src/pages/account/login.html | 50 - client/src/pages/account/login.tsx | 95 + client/src/pages/account/moderator/_index.js | 4 - .../src/pages/account/moderator/_index.scss | 2 +- .../account/moderator/creator_links.html | 55 - .../pages/account/moderator/creator_links.js | 22 - .../pages/account/moderator/dashboard.html | 18 - .../src/pages/account/moderator/dashboard.tsx | 23 + client/src/pages/account/moderator/files.html | 11 - .../pages/account/moderator/profile_links.tsx | 140 + client/src/pages/account/notifications.html | 27 - client/src/pages/account/notifications.scss | 2 +- client/src/pages/account/notifications.tsx | 40 + client/src/pages/account/register.html | 73 - client/src/pages/account/register.js | 96 - client/src/pages/account/register.tsx | 185 + client/src/pages/all_dms.html | 50 - client/src/pages/all_dms.scss | 2 +- client/src/pages/all_dms.tsx | 154 + client/src/pages/artist/announcements.html | 77 - client/src/pages/artist/dms.html | 56 - client/src/pages/artist/fancards.html | 64 - client/src/pages/artist/linked_accounts.html | 58 - client/src/pages/artist/linked_accounts.js | 32 - .../src/pages/artist/new_linked_account.html | 84 - client/src/pages/artist/new_linked_account.js | 111 - client/src/pages/artist/shares.html | 56 - client/src/pages/artist/tags.html | 66 - client/src/pages/artists.html | 101 - client/src/pages/artists.js | 400 - client/src/pages/authentication/logout.tsx | 9 + client/src/pages/components/_index.js | 10 - client/src/pages/components/_index.scss | 16 - client/src/pages/components/ads.html | 29 - client/src/pages/components/buttons.html | 7 - client/src/pages/components/card_list.html | 11 - client/src/pages/components/card_list.js | 116 - client/src/pages/components/cards/_index.js | 151 - .../src/pages/components/cards/account.html | 29 - .../src/pages/components/cards/account.scss | 9 - client/src/pages/components/cards/base.html | 26 - client/src/pages/components/cards/dm.html | 70 - .../pages/components/cards/no_results.html | 18 - client/src/pages/components/cards/post.html | 117 - client/src/pages/components/cards/share.html | 66 - client/src/pages/components/cards/user.html | 93 - client/src/pages/components/fancy_image.html | 23 - client/src/pages/components/fancy_image.js | 59 - .../pages/components/file_hash_search.html | 20 - .../pages/components/file_hash_search.scss | 5 - .../src/pages/components/flash_messages.html | 9 - client/src/pages/components/footer.html | 5 - client/src/pages/components/forms/base.html | 8 - .../pages/components/forms/submit_button.html | 9 - client/src/pages/components/headers.html | 76 - client/src/pages/components/image_link.html | 25 - client/src/pages/components/image_link.js | 78 - .../src/pages/components/import_sidebar.html | 11 - .../src/pages/components/importer_states.html | 4 - client/src/pages/components/links.html | 56 - client/src/pages/components/links.js | 53 - client/src/pages/components/lists/_index.scss | 2 - client/src/pages/components/lists/base.html | 18 - client/src/pages/components/lists/base.scss | 23 - client/src/pages/components/lists/faq.html | 18 - client/src/pages/components/lists/faq.scss | 10 - client/src/pages/components/loading_icon.html | 9 - client/src/pages/components/loading_icon.js | 9 - .../src/pages/components/meta/attributes.html | 7 - .../pages/components/navigation/_index.scss | 5 - .../pages/components/navigation/account.html | 0 .../pages/components/navigation/account.scss | 1 - .../src/pages/components/navigation/base.html | 23 - .../src/pages/components/navigation/base.scss | 24 - .../pages/components/navigation/global.html | 35 - .../pages/components/navigation/global.scss | 110 - .../pages/components/navigation/local.html | 18 - .../pages/components/navigation/local.scss | 16 - .../pages/components/navigation/sidebar.html | 75 - client/src/pages/components/paginator.html | 72 - client/src/pages/components/paginator.js | 12 - .../src/pages/components/paginator_new.html | 116 - client/src/pages/components/shell.html | 221 - client/src/pages/components/shell.js | 106 - client/src/pages/components/site.html | 27 - client/src/pages/components/site_section.html | 13 - .../src/pages/components/support_sidebar.html | 8 - client/src/pages/components/tabs.html | 68 - client/src/pages/components/timestamp.html | 14 - client/src/pages/components/timestamp.js | 39 - client/src/pages/components/tooltip.html | 22 - client/src/pages/components/tooltip.js | 65 - client/src/pages/contact.tsx | 17 + client/src/pages/development/_index.scss | 2 - client/src/pages/development/closure.html | 26 - .../pages/development/components/_index.scss | 2 - .../pages/development/components/forms.html | 17 - .../pages/development/components/forms.scss | 31 - .../pages/development/components/inputs.html | 25 - .../pages/development/components/inputs.scss | 11 - .../src/pages/development/components/nav.html | 15 - client/src/pages/development/config.html | 45 - .../src/pages/development/design/_index.scss | 1 - .../development/design/current/home.html | 14 - client/src/pages/development/design/home.html | 16 - .../development/design/upcoming/home.html | 14 - .../pages/development/design/wip/_index.scss | 1 - .../pages/development/design/wip/home.html | 34 - .../pages/development/design/wip/home.scss | 2 - client/src/pages/development/home.html | 52 - client/src/pages/development/shell.html | 18 - .../src/pages/development/test_entries.html | 51 - client/src/pages/discord-channel.module.scss | 5 + client/src/pages/discord-channel.tsx | 77 + client/src/pages/discord.html | 27 - client/src/pages/discord.module.scss | 5 + client/src/pages/discord.tsx | 39 + client/src/pages/dmca.tsx | 144 + .../src/pages/documentation/api.module.scss | 4 + client/src/pages/documentation/api.tsx | 27 + client/src/pages/error.html | 9 - client/src/pages/errors/404.tsx | 22 + client/src/pages/errors/errors.module.scss | 13 + client/src/pages/fanboximports.tsx | 38 + client/src/pages/favorites.html | 111 - client/src/pages/favorites.scss | 16 - client/src/pages/favorites.tsx | 6 + client/src/pages/file/archive.module.scss | 35 + client/src/pages/file/archive.tsx | 176 + client/src/pages/file/legacy.tsx | 40 + client/src/pages/gumroad-and-co.tsx | 54 + client/src/pages/help/faq.html | 48 - client/src/pages/help/license.html | 26 - client/src/pages/help/posts.html | 25 - client/src/pages/home.html | 58 - client/src/pages/home.scss | 24 +- client/src/pages/home.tsx | 102 + .../pages/importer/importer_list.module.scss | 5 + client/src/pages/importer/importer_list.tsx | 438 + client/src/pages/importer/importer_ok.tsx | 14 + .../importer/importer_status.module.scss | 5 + .../pages/{ => importer}/importer_status.scss | 2 +- client/src/pages/importer/importer_status.tsx | 138 + .../src/pages/importer/importer_tutorial.tsx | 154 + .../importer/importer_tutorial_fanbox.tsx | 79 + client/src/pages/importer/index.ts | 1 + client/src/pages/importer_list.html | 269 - client/src/pages/importer_list.js | 174 - client/src/pages/importer_ok.html | 11 - client/src/pages/importer_status.html | 60 - client/src/pages/importer_status.js | 164 - client/src/pages/importer_tutorial.html | 76 - .../src/pages/importer_tutorial_fanbox.html | 38 - client/src/pages/matrix.tsx | 42 + client/src/pages/post-revision.module.scss | 5 + client/src/pages/post-revision.tsx | 208 + client/src/pages/post.html | 420 - client/src/pages/post.js | 375 - client/src/pages/post.module.scss | 5 + client/src/pages/post.scss | 39 +- client/src/pages/post.tsx | 202 + client/src/pages/post/data.tsx | 30 + client/src/pages/posts.html | 57 - client/src/pages/posts.js | 35 - client/src/pages/posts.tsx | 219 + client/src/pages/posts/archive.html | 53 - client/src/pages/posts/popular.html | 114 - client/src/pages/posts/popular.tsx | 378 + client/src/pages/posts/random.tsx | 10 + client/src/pages/{user.scss => profile.scss} | 2 +- client/src/pages/profile.tsx | 255 + .../src/pages/{artist => profile}/_index.scss | 1 + client/src/pages/profile/announcements.tsx | 107 + client/src/pages/{artist => profile}/dms.scss | 2 +- client/src/pages/profile/dms.tsx | 101 + .../pages/{artist => profile}/fancards.scss | 9 +- client/src/pages/profile/fancards.tsx | 123 + .../{artist => profile}/linked_accounts.scss | 0 client/src/pages/profile/linked_accounts.tsx | 100 + .../profile/new-linked-profile.module.scss | 3 + .../src/pages/profile/new-linked-profile.tsx | 277 + client/src/pages/{ => profile}/tags.scss | 2 +- client/src/pages/profile/tags.tsx | 73 + client/src/pages/profiles.module.scss | 7 + client/src/pages/profiles.tsx | 327 + client/src/pages/profiles/random.tsx | 10 + client/src/pages/profiles/updated.tsx | 97 + client/src/pages/review_dms/dms.js | 14 - client/src/pages/review_dms/dms.scss | 2 +- client/src/pages/review_dms/review_dms.html | 81 - .../pages/review_dms/review_dms.module.scss | 3 + client/src/pages/review_dms/review_dms.tsx | 157 + client/src/pages/schema.html | 7 - client/src/pages/search_hash.html | 12 - client/src/pages/search_hash.js | 43 - client/src/pages/search_hash.module.scss | 21 + client/src/pages/search_hash.tsx | 149 + client/src/pages/search_results.html | 41 - client/src/pages/search_results.js | 0 client/src/pages/share.html | 31 - client/src/pages/share.tsx | 54 + client/src/pages/shares-all.tsx | 75 + client/src/pages/shares.html | 49 - client/src/pages/shares.tsx | 107 + client/src/pages/success.html | 8 - client/src/pages/swagger_schema.html | 32 - client/src/pages/tags-all.tsx | 36 + client/src/pages/tags.html | 31 - client/src/pages/updated.html | 28 - client/src/pages/updated.js | 23 - client/src/pages/upload.html | 87 - client/src/pages/upload.js | 57 - client/src/pages/upload.tsx | 179 + client/src/pages/user.html | 91 - client/src/pages/user.js | 122 - client/src/router.tsx | 17 + client/src/routes.tsx | 438 + client/src/templates/page.html | 17 - client/src/types/global.d.ts | 93 - client/src/utils/_index.js | 217 - client/src/utils/kemono-error.js | 23 - client/static/boosty.svg | 1 + client/static/favicon-coomer.ico | Bin 0 -> 15086 bytes client/static/small_icons/boosty.png | Bin 0 -> 154 bytes .../small_icons/{canfans.png => candfans.png} | Bin client/static/sort.svg | 1 + client/tsconfig.json | 25 + client/vite.config.mjs | 179 + client/vite.dev.mjs | 65 + client/vite.prod.mjs | 32 + client/webpack.config.js | 118 +- client/webpack.dev.js | 55 +- client/webpack.prod.js | 52 +- config.example.json | 8 +- config.example.production.json | 31 + ...1110_00_DASAD-add-favorite-counts-table.py | 62 + .../20250328_01_KV3ap-add-reason-to-flags.py | 31 + db/schema/public/accounts.sql | 52 + db/schema/public/artists.sql | 107 + db/schema/public/dms.sql | 64 + db/schema/public/extensions.sql | 5 + db/schema/public/files.sql | 67 + db/schema/public/posts/comments.sql | 34 + db/schema/public/posts/discord.sql | 59 + db/schema/public/posts/fanbox.sql | 62 + db/schema/public/posts/posts.sql | 115 + db/schema/public/posts/triggers.sql | 27 + db/schema/public/schema.sql | 157 + db/schema/public/shares.sql | 33 + docker-compose.yaml | 79 + docs/FAQ.md | 253 +- docs/code-style.md | 15 + docs/database.md | 37 + docs/develop-docker.md | 42 + docs/develop-linux.md | 147 + docs/develop-windows-client.md | 37 + docs/develop.md | 133 +- docs/features/accounts.md | 3 - docs/projects/_index.md | 3 - docs/projects/favorites1dot5.md | 18 - docs/projects/file-upload.md | 30 - docs/projects/moderation-system.md | 42 - docs/templates/feature-template.md | 10 - docs/templates/project-template.md | 16 - docs/todos.md | 31 - nginx.conf | 15 +- pyproject.toml | 1 + requirements.txt | 8 +- schema/config.schema.json | 642 + schema/config.ts | 103 + schema/public/api.yaml | 3329 +++ src/__main__.py | 2 +- src/cmd/__init__.py | 7 +- src/cmd/daemon.py | 51 +- src/cmd/web.py | 12 +- src/config.py | 94 +- src/internals/database/database.py | 9 +- src/internals/serializers/post.py | 2 +- src/lib/account.py | 73 +- src/lib/administrator.py | 123 +- src/lib/announcements.py | 48 +- src/lib/api/__init__.py | 14 + src/lib/api/v1.py | 18 + src/lib/api/v2.py | 69 + src/lib/artist.py | 193 +- src/lib/favorites.py | 76 +- src/lib/filehaus.py | 121 +- src/lib/files.py | 119 +- src/lib/notification.py | 60 +- src/lib/pagination.py | 43 +- src/lib/post.py | 438 +- src/lib/posts.py | 197 +- src/pages/account/__init__.py | 1 - src/pages/account/administrator/__init__.py | 1 - src/pages/account/administrator/blueprint.py | 157 - src/pages/account/administrator/types.py | 42 - src/pages/account/blueprint.py | 270 - src/pages/account/moderator/__init__.py | 1 - src/pages/account/moderator/blueprint.py | 59 - src/pages/account/moderator/types.py | 21 - src/pages/api/__init__.py | 50 +- src/pages/api/schema.yaml | 1378 - src/pages/api/v1/account.py | 222 + src/pages/api/v1/authentication.py | 122 + src/pages/api/v1/comments.py | 54 +- src/pages/api/v1/creators.py | 447 +- src/pages/api/v1/dms.py | 67 +- src/pages/api/v1/favorites.py | 16 +- src/pages/api/v1/files.py | 123 +- src/pages/api/v1/flags.py | 30 - src/pages/api/v1/importer.py | 175 +- src/pages/api/v1/moderator.py | 40 + src/pages/api/v1/posts.py | 539 +- src/pages/api/v2/__init__.py | 47 + src/pages/api/v2/account/__init__.py | 33 + .../api/v2/account/administrator/__init__.py | 23 + .../api/v2/account/administrator/account.py | 81 + .../api/v2/account/administrator/accounts.py | 45 + src/pages/artists.py | 457 +- src/pages/artists_types.py | 7 - src/pages/creator_link_requests.py | 26 - src/pages/dms.py | 58 - src/pages/favorites.py | 60 - src/pages/filehaus.py | 79 - src/pages/files.py | 43 - src/pages/help.py | 16 - src/pages/home.py | 13 - src/pages/imports/__init__.py | 1 - src/pages/imports/blueprint.py | 55 - src/pages/imports/types.py | 23 - src/pages/post.py | 76 +- src/pages/posts.py | 228 - src/pages/random_.py | 45 - src/pages/review_dms.py | 47 - src/pages/revisions.py | 37 - src/server.py | 58 +- src/types/account/account.py | 35 - src/types/account/notification.py | 2 +- src/types/paysites/__init__.py | 6 + src/types/paysites/boosty.py | 4 +- src/utils/datetime_.py | 23 +- 861 files changed, 77694 insertions(+), 24044 deletions(-) delete mode 100644 .pre-commit-config.yaml create mode 100644 Dockerfile-ci create mode 100644 Dockerfile-client delete mode 100644 client/.dockerignore delete mode 100644 client/.vscode/extensions.json delete mode 100644 client/Dockerfile delete mode 100644 client/Dockerfile.dev delete mode 100644 client/configs/build-templates.js delete mode 100644 client/configs/emmet/snippets.json create mode 100644 client/configs/parse-config.mjs delete mode 100644 client/configs/vars.js create mode 100644 client/configs/vars.mjs create mode 100644 client/extra.d.ts create mode 100644 client/fluid-player/.babelrc create mode 100644 client/fluid-player/.editorconfig create mode 100644 client/fluid-player/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 client/fluid-player/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 client/fluid-player/.github/ISSUE_TEMPLATE/question.md create mode 100644 client/fluid-player/.github/pull_request_template.md create mode 100644 client/fluid-player/.gitignore create mode 100644 client/fluid-player/.npmignore create mode 100644 client/fluid-player/CHANGELOG.md create mode 100644 client/fluid-player/CONTRIBUTING.md create mode 100644 client/fluid-player/LICENSE create mode 100644 client/fluid-player/README.md create mode 100644 client/fluid-player/e2e/ads_linear.spec.ts create mode 100644 client/fluid-player/e2e/controls.spec.ts create mode 100644 client/fluid-player/e2e/functions/network.ts create mode 100644 client/fluid-player/e2e/functions/video.ts create mode 100644 client/fluid-player/e2e/snapshots/baseline-sv-grid.png create mode 100644 client/fluid-player/e2e/suggested_videos.spec.ts create mode 100644 client/fluid-player/package-lock.json create mode 100644 client/fluid-player/package.json create mode 100644 client/fluid-player/playwright.config.ts create mode 100644 client/fluid-player/src/browser.js create mode 100644 client/fluid-player/src/css/fluidplayer.css create mode 100644 client/fluid-player/src/css/suggestedVideos.css create mode 100644 client/fluid-player/src/fluidplayer.js create mode 100644 client/fluid-player/src/index.d.ts create mode 100644 client/fluid-player/src/index.js create mode 100644 client/fluid-player/src/modules/adsupport.js create mode 100644 client/fluid-player/src/modules/cardboard.js create mode 100644 client/fluid-player/src/modules/miniplayer.js create mode 100644 client/fluid-player/src/modules/streaming.js create mode 100644 client/fluid-player/src/modules/subtitles.js create mode 100644 client/fluid-player/src/modules/suggestedVideos.js create mode 100644 client/fluid-player/src/modules/timeline.js create mode 100644 client/fluid-player/src/modules/utils.js create mode 100644 client/fluid-player/src/modules/vast.js create mode 100644 client/fluid-player/src/modules/vpaid.js create mode 100644 client/fluid-player/src/polyfills.js create mode 100644 client/fluid-player/src/static/close-icon.svg create mode 100644 client/fluid-player/src/static/fluid-icons.svg create mode 100644 client/fluid-player/src/static/fluid-spinner.svg create mode 100644 client/fluid-player/src/static/miniplayer-toggle-off.svg create mode 100644 client/fluid-player/src/static/miniplayer-toggle-on.svg create mode 100644 client/fluid-player/src/static/skip-backward.svg create mode 100644 client/fluid-player/src/static/skip-forward.svg create mode 100644 client/fluid-player/src/types.ts create mode 100644 client/fluid-player/test/html/custom_context.tpl.html create mode 100644 client/fluid-player/test/html/dash_live.tpl.html create mode 100644 client/fluid-player/test/html/dash_live_vast.tpl.html create mode 100644 client/fluid-player/test/html/dash_vod.tpl.html create mode 100644 client/fluid-player/test/html/dash_vod_vast.tpl.html create mode 100644 client/fluid-player/test/html/e2e/ads_linear.html create mode 100644 client/fluid-player/test/html/e2e/controls.html create mode 100644 client/fluid-player/test/html/e2e/suggested_videos_e2e.tpl.html create mode 100644 client/fluid-player/test/html/hls_live.tpl.html create mode 100644 client/fluid-player/test/html/hls_live_vast.tpl.html create mode 100644 client/fluid-player/test/html/hls_vod.tpl.html create mode 100644 client/fluid-player/test/html/hls_vod_suggested_videos.html create mode 100644 client/fluid-player/test/html/hls_vod_vast.tpl.html create mode 100644 client/fluid-player/test/html/player-reinitialization.tpl.html create mode 100644 client/fluid-player/test/html/skip_return.tpl.html create mode 100644 client/fluid-player/test/html/special-cases/_README.md create mode 100644 client/fluid-player/test/html/special-cases/internal-vast-click-tracking-issue.html create mode 100644 client/fluid-player/test/html/special-cases/issue-702.tpl.html create mode 100644 client/fluid-player/test/html/suggested_videos_ads.tpl.html create mode 100644 client/fluid-player/test/html/suggested_videos_subtitles.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_autohide.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_by_ref.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_cta_from_config.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_cta_from_vast.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_cta_from_vast_no_friendly_url.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_multiple.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_subtitles.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_vr.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_vr_autoplay.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_vtt.tpl.html create mode 100644 client/fluid-player/test/html/vod_basic_vtt_static.tpl.html create mode 100644 client/fluid-player/test/html/vod_event_api.html create mode 100644 client/fluid-player/test/html/vod_extended.tpl.html create mode 100644 client/fluid-player/test/html/vod_live_ad.tpl.html create mode 100644 client/fluid-player/test/html/vod_miniplayer.tpl.html create mode 100644 client/fluid-player/test/html/vod_responsive.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast__linear.html create mode 100644 client/fluid-player/test/html/vod_vast__non_linear.html create mode 100644 client/fluid-player/test/html/vod_vast_ad_buffet.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_ad_buffet_with_error.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_ad_pod.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_ad_pod_from_wrapper.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_ad_pod_truncated.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_followAdditionalWrappers_false.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_followAdditionalWrappers_true.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_on-demand.html create mode 100644 client/fluid-player/test/html/vod_vast_waterfall_false.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_waterfall_false_http_error.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_waterfall_true.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_waterfall_true_http_error.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_wrapper.tpl.html create mode 100644 client/fluid-player/test/html/vod_vast_wrapper_cyclical.tpl.html create mode 100644 client/fluid-player/test/html/vod_vpaid_linear.html create mode 100644 client/fluid-player/test/html/vod_vpaid_linear_viewableImpresson.html create mode 100644 client/fluid-player/test/html/vod_vpaid_non_linear.html create mode 100644 client/fluid-player/test/index.html create mode 100644 client/fluid-player/test/static/logo.png create mode 100644 client/fluid-player/test/static/special-cases/fp-215-2.xml create mode 100644 client/fluid-player/test/static/special-cases/fp-215.xml create mode 100644 client/fluid-player/test/static/subtitles/deutsch.vtt create mode 100644 client/fluid-player/test/static/subtitles/english.vtt create mode 100644 client/fluid-player/test/static/suggested_videos_example_v1.json create mode 100644 client/fluid-player/test/static/suggested_videos_example_v2.json create mode 100644 client/fluid-player/test/static/suggested_videos_example_v3.json create mode 100644 client/fluid-player/test/static/thumbnails.jpg create mode 100644 client/fluid-player/test/static/thumbnails.vtt create mode 100644 client/fluid-player/test/static/vast4.xsd create mode 100644 client/fluid-player/test/static/vast_ad_buffet.xml create mode 100644 client/fluid-player/test/static/vast_ad_buffet_with_error.xml create mode 100644 client/fluid-player/test/static/vast_ad_pod.xml create mode 100644 client/fluid-player/test/static/vast_cta.xml create mode 100644 client/fluid-player/test/static/vast_cta_no_friendly_url.xml create mode 100644 client/fluid-player/test/static/vast_hls.xml create mode 100644 client/fluid-player/test/static/vast_linear.xml create mode 100644 client/fluid-player/test/static/vast_linear_e2e.xml create mode 100644 client/fluid-player/test/static/vast_no_ad.xml create mode 100644 client/fluid-player/test/static/vast_nonlinear.xml create mode 100644 client/fluid-player/test/static/vast_wrapper.xml create mode 100644 client/fluid-player/test/static/vast_wrapper_cyclical.xml create mode 100644 client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_false.xml create mode 100644 client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_false_http_error.xml create mode 100644 client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_true.xml create mode 100644 client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_true_http_error.xml create mode 100644 client/fluid-player/test/static/vast_wrapper_followAdditionalWrappers_false.xml create mode 100644 client/fluid-player/test/static/vast_wrapper_followAdditionalWrappers_true.xml create mode 100644 client/fluid-player/test/static/vast_wrapper_to_ad_pod.xml create mode 100644 client/fluid-player/test/static/video-thumbnail.jpg create mode 100644 client/fluid-player/test/static/vpaid_linear.xml create mode 100644 client/fluid-player/test/static/vpaid_nonlinear.xml create mode 100644 client/fluid-player/vendor/webvtt.js create mode 100644 client/fluid-player/webpack.config.js create mode 100644 client/fluid-player/yarn.lock create mode 100644 client/index.html delete mode 100644 client/jsconfig.json create mode 100644 client/scripts/validate.mjs delete mode 100644 client/src/api/_index.js create mode 100644 client/src/api/account/account.ts create mode 100644 client/src/api/account/administrator/account.ts create mode 100644 client/src/api/account/administrator/accounts.ts create mode 100644 client/src/api/account/administrator/change-roles.ts create mode 100644 client/src/api/account/administrator/index.ts create mode 100644 client/src/api/account/auto-import-keys/get.ts create mode 100644 client/src/api/account/auto-import-keys/index.ts create mode 100644 client/src/api/account/auto-import-keys/revoke.ts create mode 100644 client/src/api/account/change-password.ts create mode 100644 client/src/api/account/dms/get.ts create mode 100644 client/src/api/account/dms/index.ts create mode 100644 client/src/api/account/dms/review.ts create mode 100644 client/src/api/account/favorites/favorite-post.ts create mode 100644 client/src/api/account/favorites/favorite-profile.ts create mode 100644 client/src/api/account/favorites/get-favourite-artists.ts create mode 100644 client/src/api/account/favorites/get-favourite-posts.ts create mode 100644 client/src/api/account/favorites/index.ts create mode 100644 client/src/api/account/index.ts create mode 100644 client/src/api/account/moderator/index.ts create mode 100644 client/src/api/account/moderator/profile-link-requests.ts create mode 100644 client/src/api/account/notifications.ts create mode 100644 client/src/api/account/profiles.ts create mode 100644 client/src/api/authentication/index.ts create mode 100644 client/src/api/authentication/login.ts create mode 100644 client/src/api/authentication/logout.ts create mode 100644 client/src/api/authentication/register.ts create mode 100644 client/src/api/dms/all.ts create mode 100644 client/src/api/dms/has-pending.ts create mode 100644 client/src/api/dms/index.ts create mode 100644 client/src/api/dms/profile.ts create mode 100644 client/src/api/files/archive-file.ts create mode 100644 client/src/api/files/index.ts create mode 100644 client/src/api/files/search-by-hash.ts create mode 100644 client/src/api/imports/create-import.ts create mode 100644 client/src/api/imports/get-import.ts create mode 100644 client/src/api/imports/index.ts delete mode 100644 client/src/api/kemono/_index.js delete mode 100644 client/src/api/kemono/api.js delete mode 100644 client/src/api/kemono/dms.js delete mode 100644 client/src/api/kemono/favorites.js delete mode 100644 client/src/api/kemono/kemono-fetch.js delete mode 100644 client/src/api/kemono/posts.js delete mode 100644 client/src/api/paysites/_index.js create mode 100644 client/src/api/posts/announcements.ts create mode 100644 client/src/api/posts/flag.ts create mode 100644 client/src/api/posts/index.ts create mode 100644 client/src/api/posts/popular.ts create mode 100644 client/src/api/posts/post.ts create mode 100644 client/src/api/posts/posts.ts create mode 100644 client/src/api/posts/random.ts create mode 100644 client/src/api/posts/revision.ts create mode 100644 client/src/api/profiles/discord/index.ts create mode 100644 client/src/api/profiles/fancards.ts create mode 100644 client/src/api/profiles/index.ts create mode 100644 client/src/api/profiles/links.ts create mode 100644 client/src/api/profiles/posts.ts create mode 100644 client/src/api/profiles/profile.ts create mode 100644 client/src/api/profiles/profiles.ts create mode 100644 client/src/api/profiles/random.ts create mode 100644 client/src/api/shares/index.ts create mode 100644 client/src/api/shares/profile.ts create mode 100644 client/src/api/shares/share.ts create mode 100644 client/src/api/shares/shares.ts create mode 100644 client/src/api/tags/all.ts create mode 100644 client/src/api/tags/index.ts create mode 100644 client/src/api/tags/profile.ts create mode 100644 client/src/browser/hooks/index.ts create mode 100644 client/src/browser/hooks/use-client.tsx create mode 100644 client/src/browser/hooks/use-interval.tsx create mode 100644 client/src/browser/hooks/use-route-path-pattern.tsx create mode 100644 client/src/browser/storage/local/index.ts create mode 100644 client/src/components/_index.scss create mode 100644 client/src/components/advs/ads.tsx create mode 100644 client/src/components/advs/index.ts create mode 100644 client/src/components/buttons/_index.scss rename client/src/{pages/components => components/buttons}/buttons.scss (100%) create mode 100644 client/src/components/buttons/buttons.tsx create mode 100644 client/src/components/buttons/index.ts rename client/src/{pages => }/components/cards/_index.scss (62%) rename client/src/{pages => }/components/cards/base.scss (94%) create mode 100644 client/src/components/cards/base.tsx rename client/src/{pages/components => components/cards}/card_list.scss (86%) create mode 100644 client/src/components/cards/card_list.tsx create mode 100644 client/src/components/cards/dm.module.scss rename client/src/{pages => }/components/cards/dm.scss (94%) create mode 100644 client/src/components/cards/dm.tsx create mode 100644 client/src/components/cards/index.ts rename client/src/{pages => }/components/cards/no_results.scss (66%) create mode 100644 client/src/components/cards/no_results.tsx rename client/src/{pages => }/components/cards/post.scss (74%) create mode 100644 client/src/components/cards/post.tsx rename client/src/{pages/components/cards/user.scss => components/cards/profile.scss} (96%) create mode 100644 client/src/components/cards/profile.tsx create mode 100644 client/src/components/cards/share.tsx create mode 100644 client/src/components/dangerous-content/dangerous.tsx create mode 100644 client/src/components/dangerous-content/index.ts create mode 100644 client/src/components/dates/_index.scss create mode 100644 client/src/components/dates/index.ts rename client/src/{pages/components => components/dates}/timestamp.scss (100%) create mode 100644 client/src/components/dates/timestamp.tsx create mode 100644 client/src/components/details/details.module.scss create mode 100644 client/src/components/details/details.tsx create mode 100644 client/src/components/details/index.ts create mode 100644 client/src/components/errors/api-error.tsx create mode 100644 client/src/components/errors/error-view.tsx create mode 100644 client/src/components/errors/fetch-error.tsx create mode 100644 client/src/components/errors/index.ts create mode 100644 client/src/components/errors/invalid-error.tsx create mode 100644 client/src/components/flash_messages.tsx create mode 100644 client/src/components/formatting/index.ts create mode 100644 client/src/components/formatting/pre.module.scss create mode 100644 client/src/components/formatting/pre.tsx create mode 100644 client/src/components/forms/client.module.scss create mode 100644 client/src/components/forms/client.tsx create mode 100644 client/src/components/forms/index.ts create mode 100644 client/src/components/forms/inputs/base.tsx create mode 100644 client/src/components/forms/inputs/hidden.tsx create mode 100644 client/src/components/forms/inputs/index.ts create mode 100644 client/src/components/forms/inputs/integer.tsx create mode 100644 client/src/components/forms/inputs/number.tsx create mode 100644 client/src/components/forms/inputs/radio.tsx create mode 100644 client/src/components/forms/inputs/select.tsx create mode 100644 client/src/components/forms/inputs/text.tsx create mode 100644 client/src/components/forms/label.tsx create mode 100644 client/src/components/forms/router.module.scss create mode 100644 client/src/components/forms/router.tsx create mode 100644 client/src/components/forms/sections/fieldset.tsx create mode 100644 client/src/components/forms/sections/index.ts create mode 100644 client/src/components/forms/sections/integer.tsx create mode 100644 client/src/components/forms/sections/radio-group.module.scss create mode 100644 client/src/components/forms/sections/radio-group.tsx create mode 100644 client/src/components/forms/sections/radio.module.scss create mode 100644 client/src/components/forms/sections/radio.tsx create mode 100644 client/src/components/forms/sections/section.tsx create mode 100644 client/src/components/forms/sections/select.tsx create mode 100644 client/src/components/forms/sections/text.tsx create mode 100644 client/src/components/forms/sections/types.ts create mode 100644 client/src/components/forms/submit_button.tsx create mode 100644 client/src/components/forms/types.ts create mode 100644 client/src/components/images/_index.scss rename client/src/{pages/components => components/images}/fancy_image.scss (100%) create mode 100644 client/src/components/images/fancy_image.tsx rename client/src/{pages/components => components/images}/image_link.scss (100%) create mode 100644 client/src/components/images/image_link.tsx create mode 100644 client/src/components/images/index.ts rename client/src/{pages => }/components/importer_states.scss (100%) create mode 100644 client/src/components/layout/_index.scss create mode 100644 client/src/components/layout/footer.module.scss create mode 100644 client/src/components/layout/footer.tsx create mode 100644 client/src/components/layout/index.ts rename client/src/{pages/components => components/layout}/shell.scss (96%) create mode 100644 client/src/components/layout/shell.tsx rename client/src/{pages/components/navigation => components/layout}/sidebar.scss (98%) create mode 100644 client/src/components/layout/sidebar.tsx create mode 100644 client/src/components/links/_index.scss create mode 100644 client/src/components/links/index.ts rename client/src/{pages/components => components/links}/links.scss (94%) create mode 100644 client/src/components/links/links.tsx create mode 100644 client/src/components/lists/description.module.scss create mode 100644 client/src/components/lists/description.tsx create mode 100644 client/src/components/lists/index.ts create mode 100644 client/src/components/loading/_index.scss create mode 100644 client/src/components/loading/index.ts rename client/src/{pages/components => components/loading}/loading_icon.scss (100%) create mode 100644 client/src/components/loading/loading_icon.tsx create mode 100644 client/src/components/meta/block-component.tsx create mode 100644 client/src/components/meta/index.ts create mode 100644 client/src/components/meta/types.ts create mode 100644 client/src/components/modal/index.ts create mode 100644 client/src/components/modal/modal.module.scss create mode 100644 client/src/components/modal/modal.tsx create mode 100644 client/src/components/overviews/index.ts create mode 100644 client/src/components/overviews/overview.module.scss create mode 100644 client/src/components/overviews/overview.tsx create mode 100644 client/src/components/pages/_index.scss create mode 100644 client/src/components/pages/account.tsx create mode 100644 client/src/components/pages/error.module.scss create mode 100644 client/src/components/pages/error.tsx create mode 100644 client/src/components/pages/index.ts create mode 100644 client/src/components/pages/profile.tsx rename client/src/{pages/components => components/pages}/site.scss (81%) create mode 100644 client/src/components/pages/site.tsx create mode 100644 client/src/components/pagination/_index.scss create mode 100644 client/src/components/pagination/collection.module.scss create mode 100644 client/src/components/pagination/index.ts create mode 100644 client/src/components/pagination/local.module.scss create mode 100644 client/src/components/pagination/local.tsx create mode 100644 client/src/components/pagination/pagination-info.module.scss create mode 100644 client/src/components/pagination/pagination-info.tsx create mode 100644 client/src/components/pagination/pagination.module.scss create mode 100644 client/src/components/pagination/pagination.tsx create mode 100644 client/src/components/pagination/paginator.scss create mode 100644 client/src/components/pagination/paginator.tsx rename client/src/{pages/components => components/pagination}/paginator_new.scss (94%) create mode 100644 client/src/components/pagination/paginator_new.tsx create mode 100644 client/src/components/pagination/wrapper.module.scss create mode 100644 client/src/components/pagination/wrapper.tsx rename client/src/{pages => }/components/tooltip.scss (93%) create mode 100644 client/src/components/tooltip.tsx create mode 100644 client/src/css/config/variables/sass.scss delete mode 100644 client/src/development/entry.js delete mode 100644 client/src/development/entry.scss rename client/src/{pages/account/components => entities/account}/_index.scss (100%) create mode 100644 client/src/entities/account/index.ts create mode 100644 client/src/entities/account/lib/auth.ts create mode 100644 client/src/entities/account/lib/favorite-posts.ts create mode 100644 client/src/entities/account/lib/favourite-profiles.ts create mode 100644 client/src/entities/account/lib/roles.ts rename client/src/{pages/account/components => entities/account}/notification.scss (100%) create mode 100644 client/src/entities/account/notification.tsx create mode 100644 client/src/entities/account/notifications.ts create mode 100644 client/src/entities/account/preview.module.scss create mode 100644 client/src/entities/account/preview.tsx rename client/src/{pages/account/components => entities/account}/service_key.scss (100%) create mode 100644 client/src/entities/account/service_key.tsx create mode 100644 client/src/entities/account/types.ts create mode 100644 client/src/entities/administrator/account-overview.tsx create mode 100644 client/src/entities/administrator/index.ts create mode 100644 client/src/entities/dms/index.ts create mode 100644 client/src/entities/dms/types.ts create mode 100644 client/src/entities/files/index.ts create mode 100644 client/src/entities/files/types.ts create mode 100644 client/src/entities/paysites/index.ts create mode 100644 client/src/entities/paysites/lib/validate.ts create mode 100644 client/src/entities/paysites/list.ts create mode 100644 client/src/entities/paysites/types.ts create mode 100644 client/src/entities/posts/announcement.module.scss create mode 100644 client/src/entities/posts/announcement.tsx create mode 100644 client/src/entities/posts/discord-server.module.scss create mode 100644 client/src/entities/posts/discord-server.tsx create mode 100644 client/src/entities/posts/discord.module.scss create mode 100644 client/src/entities/posts/discord.tsx create mode 100644 client/src/entities/posts/index.ts create mode 100644 client/src/entities/posts/overview/body.module.scss create mode 100644 client/src/entities/posts/overview/body.tsx create mode 100644 client/src/entities/posts/overview/clean-body.ts create mode 100644 client/src/entities/posts/overview/flag-button.module.scss create mode 100644 client/src/entities/posts/overview/flag-button.tsx create mode 100644 client/src/entities/posts/overview/footer.module.scss create mode 100644 client/src/entities/posts/overview/footer.tsx create mode 100644 client/src/entities/posts/overview/header.tsx create mode 100644 client/src/entities/posts/overview/overview.module.scss create mode 100644 client/src/entities/posts/overview/overview.tsx create mode 100644 client/src/entities/posts/overview/types.ts create mode 100644 client/src/entities/posts/overview/video.tsx create mode 100644 client/src/entities/posts/period.ts create mode 100644 client/src/entities/posts/types.ts create mode 100644 client/src/entities/profiles/headers.tsx create mode 100644 client/src/entities/profiles/index.ts create mode 100644 client/src/entities/profiles/lib/get.ts create mode 100644 client/src/entities/profiles/tabs.tsx create mode 100644 client/src/entities/profiles/types.ts create mode 100644 client/src/entities/tags/index.ts create mode 100644 client/src/entities/tags/lib/get.ts create mode 100644 client/src/entities/tags/types.ts delete mode 100644 client/src/env/derived-vars.js create mode 100644 client/src/env/derived-vars.ts delete mode 100644 client/src/env/env-vars.js create mode 100644 client/src/env/env-vars.ts create mode 100644 client/src/index.scss create mode 100644 client/src/index.tsx delete mode 100644 client/src/js/account.js delete mode 100644 client/src/js/admin.js delete mode 100644 client/src/js/admin.scss delete mode 100644 client/src/js/component-factory.js delete mode 100644 client/src/js/favorites.js delete mode 100644 client/src/js/feature-detect.js delete mode 100644 client/src/js/global.js delete mode 100644 client/src/js/global.scss delete mode 100644 client/src/js/moderator.js delete mode 100644 client/src/js/moderator.scss delete mode 100644 client/src/js/page-loader.js delete mode 100644 client/src/js/pending-review-dms.js delete mode 100644 client/src/js/resumable.js delete mode 100644 client/src/jsconfig.json delete mode 100644 client/src/lib/_index.js create mode 100644 client/src/lib/api/error-v2.ts create mode 100644 client/src/lib/api/error.ts create mode 100644 client/src/lib/api/fetch.ts create mode 100644 client/src/lib/api/index.ts create mode 100644 client/src/lib/api/types.ts create mode 100644 client/src/lib/api/v2.ts create mode 100644 client/src/lib/errors/error.ts create mode 100644 client/src/lib/errors/index.ts create mode 100644 client/src/lib/errors/invalid.ts create mode 100644 client/src/lib/fetch/errors.ts create mode 100644 client/src/lib/fetch/fetch.ts create mode 100644 client/src/lib/fetch/index.ts create mode 100644 client/src/lib/http/headers.ts create mode 100644 client/src/lib/http/index.ts create mode 100644 client/src/lib/http/status.ts delete mode 100644 client/src/lib/imports/lib.js create mode 100644 client/src/lib/numbers/index.ts create mode 100644 client/src/lib/pagination/index.ts create mode 100644 client/src/lib/pagination/lib.ts create mode 100644 client/src/lib/pagination/types.ts create mode 100644 client/src/lib/types/index.ts create mode 100644 client/src/lib/urls/account.ts create mode 100644 client/src/lib/urls/administrator.ts create mode 100644 client/src/lib/urls/artists.ts create mode 100644 client/src/lib/urls/authentication.ts create mode 100644 client/src/lib/urls/dms.ts create mode 100644 client/src/lib/urls/documentation.ts create mode 100644 client/src/lib/urls/files.ts create mode 100644 client/src/lib/urls/importer.ts create mode 100644 client/src/lib/urls/index.ts create mode 100644 client/src/lib/urls/internal-url.ts create mode 100644 client/src/lib/urls/kemono.ts create mode 100644 client/src/lib/urls/moderator.ts create mode 100644 client/src/lib/urls/posts.ts create mode 100644 client/src/lib/urls/profiles.ts create mode 100644 client/src/lib/urls/shares.ts create mode 100644 client/src/lib/urls/tags.ts create mode 100644 client/src/pages/2257.tsx delete mode 100644 client/src/pages/_index.js delete mode 100644 client/src/pages/account/_index.js delete mode 100644 client/src/pages/account/administrator/_index.js create mode 100644 client/src/pages/account/administrator/account.module.scss create mode 100644 client/src/pages/account/administrator/account.tsx delete mode 100644 client/src/pages/account/administrator/account_files.html delete mode 100644 client/src/pages/account/administrator/account_info.html delete mode 100644 client/src/pages/account/administrator/accounts.html create mode 100644 client/src/pages/account/administrator/accounts.module.scss create mode 100644 client/src/pages/account/administrator/accounts.tsx delete mode 100644 client/src/pages/account/administrator/dashboard.html create mode 100644 client/src/pages/account/administrator/dashboard.module.scss create mode 100644 client/src/pages/account/administrator/dashboard.tsx delete mode 100644 client/src/pages/account/administrator/mods_actions.html delete mode 100644 client/src/pages/account/administrator/shell.html delete mode 100644 client/src/pages/account/administrator/shell.scss delete mode 100644 client/src/pages/account/change_password.html delete mode 100644 client/src/pages/account/change_password.js create mode 100644 client/src/pages/account/change_password.tsx delete mode 100644 client/src/pages/account/components/notification.html delete mode 100644 client/src/pages/account/components/service_key.html create mode 100644 client/src/pages/account/favorites/legacy.tsx create mode 100644 client/src/pages/account/favorites/posts.module.scss create mode 100644 client/src/pages/account/favorites/posts.tsx create mode 100644 client/src/pages/account/favorites/profiles.module.scss create mode 100644 client/src/pages/account/favorites/profiles.tsx delete mode 100644 client/src/pages/account/home.html create mode 100644 client/src/pages/account/home.tsx delete mode 100644 client/src/pages/account/keys.html create mode 100644 client/src/pages/account/keys.tsx delete mode 100644 client/src/pages/account/login.html create mode 100644 client/src/pages/account/login.tsx delete mode 100644 client/src/pages/account/moderator/_index.js delete mode 100644 client/src/pages/account/moderator/creator_links.html delete mode 100644 client/src/pages/account/moderator/creator_links.js delete mode 100644 client/src/pages/account/moderator/dashboard.html create mode 100644 client/src/pages/account/moderator/dashboard.tsx delete mode 100644 client/src/pages/account/moderator/files.html create mode 100644 client/src/pages/account/moderator/profile_links.tsx delete mode 100644 client/src/pages/account/notifications.html create mode 100644 client/src/pages/account/notifications.tsx delete mode 100644 client/src/pages/account/register.html delete mode 100644 client/src/pages/account/register.js create mode 100644 client/src/pages/account/register.tsx delete mode 100644 client/src/pages/all_dms.html create mode 100644 client/src/pages/all_dms.tsx delete mode 100644 client/src/pages/artist/announcements.html delete mode 100644 client/src/pages/artist/dms.html delete mode 100644 client/src/pages/artist/fancards.html delete mode 100644 client/src/pages/artist/linked_accounts.html delete mode 100644 client/src/pages/artist/linked_accounts.js delete mode 100644 client/src/pages/artist/new_linked_account.html delete mode 100644 client/src/pages/artist/new_linked_account.js delete mode 100644 client/src/pages/artist/shares.html delete mode 100644 client/src/pages/artist/tags.html delete mode 100644 client/src/pages/artists.html delete mode 100644 client/src/pages/artists.js create mode 100644 client/src/pages/authentication/logout.tsx delete mode 100644 client/src/pages/components/_index.js delete mode 100644 client/src/pages/components/_index.scss delete mode 100644 client/src/pages/components/ads.html delete mode 100644 client/src/pages/components/buttons.html delete mode 100644 client/src/pages/components/card_list.html delete mode 100644 client/src/pages/components/card_list.js delete mode 100644 client/src/pages/components/cards/_index.js delete mode 100644 client/src/pages/components/cards/account.html delete mode 100644 client/src/pages/components/cards/account.scss delete mode 100644 client/src/pages/components/cards/base.html delete mode 100644 client/src/pages/components/cards/dm.html delete mode 100644 client/src/pages/components/cards/no_results.html delete mode 100644 client/src/pages/components/cards/post.html delete mode 100644 client/src/pages/components/cards/share.html delete mode 100644 client/src/pages/components/cards/user.html delete mode 100644 client/src/pages/components/fancy_image.html delete mode 100644 client/src/pages/components/fancy_image.js delete mode 100644 client/src/pages/components/file_hash_search.html delete mode 100644 client/src/pages/components/file_hash_search.scss delete mode 100644 client/src/pages/components/flash_messages.html delete mode 100644 client/src/pages/components/footer.html delete mode 100644 client/src/pages/components/forms/base.html delete mode 100644 client/src/pages/components/forms/submit_button.html delete mode 100644 client/src/pages/components/headers.html delete mode 100644 client/src/pages/components/image_link.html delete mode 100644 client/src/pages/components/image_link.js delete mode 100644 client/src/pages/components/import_sidebar.html delete mode 100644 client/src/pages/components/importer_states.html delete mode 100644 client/src/pages/components/links.html delete mode 100644 client/src/pages/components/links.js delete mode 100644 client/src/pages/components/lists/_index.scss delete mode 100644 client/src/pages/components/lists/base.html delete mode 100644 client/src/pages/components/lists/base.scss delete mode 100644 client/src/pages/components/lists/faq.html delete mode 100644 client/src/pages/components/lists/faq.scss delete mode 100644 client/src/pages/components/loading_icon.html delete mode 100644 client/src/pages/components/loading_icon.js delete mode 100644 client/src/pages/components/meta/attributes.html delete mode 100644 client/src/pages/components/navigation/_index.scss delete mode 100644 client/src/pages/components/navigation/account.html delete mode 100644 client/src/pages/components/navigation/account.scss delete mode 100644 client/src/pages/components/navigation/base.html delete mode 100644 client/src/pages/components/navigation/base.scss delete mode 100644 client/src/pages/components/navigation/global.html delete mode 100644 client/src/pages/components/navigation/global.scss delete mode 100644 client/src/pages/components/navigation/local.html delete mode 100644 client/src/pages/components/navigation/local.scss delete mode 100644 client/src/pages/components/navigation/sidebar.html delete mode 100644 client/src/pages/components/paginator.html delete mode 100644 client/src/pages/components/paginator.js delete mode 100644 client/src/pages/components/paginator_new.html delete mode 100644 client/src/pages/components/shell.html delete mode 100644 client/src/pages/components/shell.js delete mode 100644 client/src/pages/components/site.html delete mode 100644 client/src/pages/components/site_section.html delete mode 100644 client/src/pages/components/support_sidebar.html delete mode 100644 client/src/pages/components/tabs.html delete mode 100644 client/src/pages/components/timestamp.html delete mode 100644 client/src/pages/components/timestamp.js delete mode 100644 client/src/pages/components/tooltip.html delete mode 100644 client/src/pages/components/tooltip.js create mode 100644 client/src/pages/contact.tsx delete mode 100644 client/src/pages/development/_index.scss delete mode 100644 client/src/pages/development/closure.html delete mode 100644 client/src/pages/development/components/_index.scss delete mode 100644 client/src/pages/development/components/forms.html delete mode 100644 client/src/pages/development/components/forms.scss delete mode 100644 client/src/pages/development/components/inputs.html delete mode 100644 client/src/pages/development/components/inputs.scss delete mode 100644 client/src/pages/development/components/nav.html delete mode 100644 client/src/pages/development/config.html delete mode 100644 client/src/pages/development/design/_index.scss delete mode 100644 client/src/pages/development/design/current/home.html delete mode 100644 client/src/pages/development/design/home.html delete mode 100644 client/src/pages/development/design/upcoming/home.html delete mode 100644 client/src/pages/development/design/wip/_index.scss delete mode 100644 client/src/pages/development/design/wip/home.html delete mode 100644 client/src/pages/development/design/wip/home.scss delete mode 100644 client/src/pages/development/home.html delete mode 100644 client/src/pages/development/shell.html delete mode 100644 client/src/pages/development/test_entries.html create mode 100644 client/src/pages/discord-channel.module.scss create mode 100644 client/src/pages/discord-channel.tsx delete mode 100644 client/src/pages/discord.html create mode 100644 client/src/pages/discord.module.scss create mode 100644 client/src/pages/discord.tsx create mode 100644 client/src/pages/dmca.tsx create mode 100644 client/src/pages/documentation/api.module.scss create mode 100644 client/src/pages/documentation/api.tsx delete mode 100644 client/src/pages/error.html create mode 100644 client/src/pages/errors/404.tsx create mode 100644 client/src/pages/errors/errors.module.scss create mode 100644 client/src/pages/fanboximports.tsx delete mode 100644 client/src/pages/favorites.html delete mode 100644 client/src/pages/favorites.scss create mode 100644 client/src/pages/favorites.tsx create mode 100644 client/src/pages/file/archive.module.scss create mode 100644 client/src/pages/file/archive.tsx create mode 100644 client/src/pages/file/legacy.tsx create mode 100644 client/src/pages/gumroad-and-co.tsx delete mode 100644 client/src/pages/help/faq.html delete mode 100644 client/src/pages/help/license.html delete mode 100644 client/src/pages/help/posts.html delete mode 100644 client/src/pages/home.html create mode 100644 client/src/pages/home.tsx create mode 100644 client/src/pages/importer/importer_list.module.scss create mode 100644 client/src/pages/importer/importer_list.tsx create mode 100644 client/src/pages/importer/importer_ok.tsx create mode 100644 client/src/pages/importer/importer_status.module.scss rename client/src/pages/{ => importer}/importer_status.scss (97%) create mode 100644 client/src/pages/importer/importer_status.tsx create mode 100644 client/src/pages/importer/importer_tutorial.tsx create mode 100644 client/src/pages/importer/importer_tutorial_fanbox.tsx create mode 100644 client/src/pages/importer/index.ts delete mode 100644 client/src/pages/importer_list.html delete mode 100644 client/src/pages/importer_list.js delete mode 100644 client/src/pages/importer_ok.html delete mode 100644 client/src/pages/importer_status.html delete mode 100644 client/src/pages/importer_status.js delete mode 100644 client/src/pages/importer_tutorial.html delete mode 100644 client/src/pages/importer_tutorial_fanbox.html create mode 100644 client/src/pages/matrix.tsx create mode 100644 client/src/pages/post-revision.module.scss create mode 100644 client/src/pages/post-revision.tsx delete mode 100644 client/src/pages/post.html delete mode 100644 client/src/pages/post.js create mode 100644 client/src/pages/post.module.scss create mode 100644 client/src/pages/post.tsx create mode 100644 client/src/pages/post/data.tsx delete mode 100644 client/src/pages/posts.html delete mode 100644 client/src/pages/posts.js create mode 100644 client/src/pages/posts.tsx delete mode 100644 client/src/pages/posts/archive.html delete mode 100644 client/src/pages/posts/popular.html create mode 100644 client/src/pages/posts/popular.tsx create mode 100644 client/src/pages/posts/random.tsx rename client/src/pages/{user.scss => profile.scss} (98%) create mode 100644 client/src/pages/profile.tsx rename client/src/pages/{artist => profile}/_index.scss (80%) create mode 100644 client/src/pages/profile/announcements.tsx rename client/src/pages/{artist => profile}/dms.scss (73%) create mode 100644 client/src/pages/profile/dms.tsx rename client/src/pages/{artist => profile}/fancards.scss (75%) create mode 100644 client/src/pages/profile/fancards.tsx rename client/src/pages/{artist => profile}/linked_accounts.scss (100%) create mode 100644 client/src/pages/profile/linked_accounts.tsx create mode 100644 client/src/pages/profile/new-linked-profile.module.scss create mode 100644 client/src/pages/profile/new-linked-profile.tsx rename client/src/pages/{ => profile}/tags.scss (93%) create mode 100644 client/src/pages/profile/tags.tsx create mode 100644 client/src/pages/profiles.module.scss create mode 100644 client/src/pages/profiles.tsx create mode 100644 client/src/pages/profiles/random.tsx create mode 100644 client/src/pages/profiles/updated.tsx delete mode 100644 client/src/pages/review_dms/dms.js delete mode 100644 client/src/pages/review_dms/review_dms.html create mode 100644 client/src/pages/review_dms/review_dms.module.scss create mode 100644 client/src/pages/review_dms/review_dms.tsx delete mode 100644 client/src/pages/schema.html delete mode 100644 client/src/pages/search_hash.html delete mode 100644 client/src/pages/search_hash.js create mode 100644 client/src/pages/search_hash.module.scss create mode 100644 client/src/pages/search_hash.tsx delete mode 100644 client/src/pages/search_results.html delete mode 100644 client/src/pages/search_results.js delete mode 100644 client/src/pages/share.html create mode 100644 client/src/pages/share.tsx create mode 100644 client/src/pages/shares-all.tsx delete mode 100644 client/src/pages/shares.html create mode 100644 client/src/pages/shares.tsx delete mode 100644 client/src/pages/success.html delete mode 100644 client/src/pages/swagger_schema.html create mode 100644 client/src/pages/tags-all.tsx delete mode 100644 client/src/pages/tags.html delete mode 100644 client/src/pages/updated.html delete mode 100644 client/src/pages/updated.js delete mode 100644 client/src/pages/upload.html delete mode 100644 client/src/pages/upload.js create mode 100644 client/src/pages/upload.tsx delete mode 100644 client/src/pages/user.html delete mode 100644 client/src/pages/user.js create mode 100644 client/src/router.tsx create mode 100644 client/src/routes.tsx delete mode 100644 client/src/templates/page.html delete mode 100644 client/src/types/global.d.ts delete mode 100644 client/src/utils/_index.js delete mode 100644 client/src/utils/kemono-error.js create mode 100644 client/static/boosty.svg create mode 100644 client/static/favicon-coomer.ico create mode 100644 client/static/small_icons/boosty.png rename client/static/small_icons/{canfans.png => candfans.png} (100%) create mode 100644 client/static/sort.svg create mode 100644 client/tsconfig.json create mode 100644 client/vite.config.mjs create mode 100644 client/vite.dev.mjs create mode 100644 client/vite.prod.mjs create mode 100644 config.example.production.json create mode 100644 db/migrations/20241110_00_DASAD-add-favorite-counts-table.py create mode 100644 db/migrations/20250328_01_KV3ap-add-reason-to-flags.py create mode 100644 db/schema/public/accounts.sql create mode 100644 db/schema/public/artists.sql create mode 100644 db/schema/public/dms.sql create mode 100644 db/schema/public/extensions.sql create mode 100644 db/schema/public/files.sql create mode 100644 db/schema/public/posts/comments.sql create mode 100644 db/schema/public/posts/discord.sql create mode 100644 db/schema/public/posts/fanbox.sql create mode 100644 db/schema/public/posts/posts.sql create mode 100644 db/schema/public/posts/triggers.sql create mode 100644 db/schema/public/schema.sql create mode 100644 db/schema/public/shares.sql create mode 100644 docker-compose.yaml create mode 100644 docs/code-style.md create mode 100644 docs/database.md create mode 100644 docs/develop-docker.md create mode 100644 docs/develop-linux.md create mode 100644 docs/develop-windows-client.md delete mode 100644 docs/projects/_index.md delete mode 100644 docs/projects/favorites1dot5.md delete mode 100644 docs/projects/file-upload.md delete mode 100644 docs/projects/moderation-system.md delete mode 100644 docs/templates/feature-template.md delete mode 100644 docs/templates/project-template.md delete mode 100644 docs/todos.md create mode 100644 schema/config.schema.json create mode 100644 schema/config.ts create mode 100644 schema/public/api.yaml create mode 100644 src/lib/api/__init__.py create mode 100644 src/lib/api/v1.py create mode 100644 src/lib/api/v2.py delete mode 100644 src/pages/account/__init__.py delete mode 100644 src/pages/account/administrator/__init__.py delete mode 100644 src/pages/account/administrator/blueprint.py delete mode 100644 src/pages/account/administrator/types.py delete mode 100644 src/pages/account/blueprint.py delete mode 100644 src/pages/account/moderator/__init__.py delete mode 100644 src/pages/account/moderator/blueprint.py delete mode 100644 src/pages/account/moderator/types.py delete mode 100644 src/pages/api/schema.yaml create mode 100644 src/pages/api/v1/account.py create mode 100644 src/pages/api/v1/authentication.py delete mode 100644 src/pages/api/v1/flags.py create mode 100644 src/pages/api/v1/moderator.py create mode 100644 src/pages/api/v2/__init__.py create mode 100644 src/pages/api/v2/account/__init__.py create mode 100644 src/pages/api/v2/account/administrator/__init__.py create mode 100644 src/pages/api/v2/account/administrator/account.py create mode 100644 src/pages/api/v2/account/administrator/accounts.py delete mode 100644 src/pages/creator_link_requests.py delete mode 100644 src/pages/dms.py delete mode 100644 src/pages/favorites.py delete mode 100644 src/pages/filehaus.py delete mode 100644 src/pages/files.py delete mode 100644 src/pages/help.py delete mode 100644 src/pages/home.py delete mode 100644 src/pages/imports/__init__.py delete mode 100644 src/pages/imports/blueprint.py delete mode 100644 src/pages/imports/types.py delete mode 100644 src/pages/posts.py delete mode 100644 src/pages/random_.py delete mode 100644 src/pages/review_dms.py delete mode 100644 src/pages/revisions.py diff --git a/.dockerignore b/.dockerignore index 305b559..f4c17db 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,7 +2,9 @@ test/ storage/ dist/ client/dev/ +client/dist/ client/node_modules/ +client/fluid-player/node_modules/ __pycache__ venv .env @@ -19,3 +21,4 @@ docker-compose* node_modules npm-debug.log README.md +.history diff --git a/.flake8 b/.flake8 index 533d94a..a8fae70 100644 --- a/.flake8 +++ b/.flake8 @@ -6,6 +6,10 @@ ignore = F401 # flake struggles with endpoints returning tuples on exceptions E722 + # apparently it's both an antipattern and a best practice: + # https://www.flake8rules.com/rules/W503.html + # just python things + W503 exclude = .git, __pycache__, diff --git a/.gitignore b/.gitignore index 94a0099..6d3d19e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,6 @@ flask.cfg /config.py redis_map.py -# Dev only files -test/ .idea dev_* @@ -15,7 +13,7 @@ dev_* client/dev # Dev file server -storage/ +/storage/ # Javascript packages node_modules @@ -164,3 +162,5 @@ dmypy.json # Cython debug symbols cython_debug/ + +.history diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 0a2c97d..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,16 +0,0 @@ -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: 38b88246ccc552bffaaf54259d064beeee434539 # frozen: v4.0.1 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-added-large-files - - repo: https://github.com/pycqa/flake8 - rev: "cbeb4c9c4137cff1568659fcc48e8b85cddd0c8d" # frozen: 4.0.1 - hooks: - - id: flake8 - - repo: https://github.com/pre-commit/mirrors-autopep8 - rev: "7d14f78422aef2153a90e33373d2515bcc99038d" # frozen: v1.5.7 - hooks: - - id: autopep8 diff --git a/Dockerfile b/Dockerfile index 0cb1a1a..2544391 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,18 @@ -FROM nikolaik/python-nodejs:python3.12-nodejs18 - -RUN apt-get update && apt-get install -y libpq-dev curl jq - -RUN curl -s -L $(curl https://api.github.com/repos/tus/tusd/releases/latest -s | jq '.assets[] | select(.name=="tusd_linux_amd64.tar.gz") | .browser_download_url' -r) | tar -xzvf - -C /usr/local/bin/ --strip-components=1 tusd_linux_amd64/tusd && chmod +x /usr/local/bin/tusd +FROM python:3.12 WORKDIR /app +RUN apt-get update && apt-get install -y libpq-dev curl jq + COPY requirements.txt requirements.txt RUN pip3 install -r requirements.txt -RUN npm install -g npm - -RUN mkdir client -COPY ./client /app/client - -RUN cd client && npm ci --also=dev && cd .. - COPY . /app ENV LANG=C.UTF-8 ARG GIT_COMMIT_HASH ENV GIT_COMMIT_HASH=${GIT_COMMIT_HASH:-undefined} +ARG BUILD_DATE +ENV BUILD_DATE=${BUILD_DATE:-undefined} CMD python -m src daemon diff --git a/Dockerfile-ci b/Dockerfile-ci new file mode 100644 index 0000000..3c8dbf6 --- /dev/null +++ b/Dockerfile-ci @@ -0,0 +1,42 @@ +# Client build +FROM node:22.13 AS client-builder + +WORKDIR /app/client + +# kind of retarded but such is a price for inlining dependencies +COPY client/fluid-player/package.json client/fluid-player/package-lock.json ./fluid-player/ + +COPY client/package.json client/package-lock.json ./ + +RUN npm ci --include=dev + +COPY schema ../schema + +COPY config.json ../config.json + +COPY client ./ + +RUN npm run build + +# Server build +FROM python:3.12 AS server-builder + +RUN apt-get update \ + && apt-get install -y libpq-dev + +WORKDIR /app + +COPY requirements.txt requirements.txt +RUN pip3 install -r requirements.txt + +COPY . /app + +COPY --from=client-builder /app/client/dist ./client/dist + +ENV LANG=C.UTF-8 +ARG GIT_COMMIT_HASH +ENV GIT_COMMIT_HASH=${GIT_COMMIT_HASH:-undefined} +ARG BUILD_DATE +ENV BUILD_DATE=${BUILD_DATE:-undefined} + +CMD python -m src daemon diff --git a/Dockerfile-client b/Dockerfile-client new file mode 100644 index 0000000..fae299a --- /dev/null +++ b/Dockerfile-client @@ -0,0 +1,13 @@ +FROM node:22.13 +WORKDIR /app/client +CMD [ "npm", "run", "build" ] + +RUN npm install -g npm +COPY ./ /app +RUN npm ci --include=dev + +ENV LANG=C.UTF-8 +ARG GIT_COMMIT_HASH +ENV GIT_COMMIT_HASH=${GIT_COMMIT_HASH:-undefined} +ARG BUILD_DATE +ENV BUILD_DATE=${BUILD_DATE:-undefined} diff --git a/client/.dockerignore b/client/.dockerignore deleted file mode 100644 index f3c73a0..0000000 --- a/client/.dockerignore +++ /dev/null @@ -1,29 +0,0 @@ -# webpack output -**/dev -**/dist - -**/.classpath -**/.dockerignore -**/.env -**/.git -**/.gitignore -**/.project -**/.settings -**/.toolstarget -**/.vs -**/.vscode -**/*.code-workspace -**/*.*proj.user -**/*.dbmdl -**/*.jfm -**/azds.yaml -**/charts -**/docker-compose* -**/compose* -**/Dockerfile* -**/node_modules -**/npm-debug.log -**/obj -**/secrets.dev.yaml -**/values.dev.yaml -README.md diff --git a/client/.vscode/extensions.json b/client/.vscode/extensions.json deleted file mode 100644 index 1612a87..0000000 --- a/client/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": [] -} diff --git a/client/.vscode/settings.json b/client/.vscode/settings.json index 6a2ff3b..8b32f58 100644 --- a/client/.vscode/settings.json +++ b/client/.vscode/settings.json @@ -1,14 +1,9 @@ { + "typescript.tsdk": "./node_modules/typescript/lib", + "typescript.enablePromptUseWorkspaceTsdk": true, "files.exclude": { "node_modules": true }, - // this option does work and is required for emmet in jinja to work - "files.associations": { - "*.html": "jinja-html" - }, - "emmet.includeLanguages": { - "jinja-html": "html" - }, "search.exclude": { "**/node_modules": true, "**/bower_components": true, @@ -19,9 +14,6 @@ "javascript.preferences.importModuleSpecifierEnding": "js", "javascript.preferences.quoteStyle": "double", "javascript.format.semicolons": "insert", - "[jinja-html]": { - "editor.tabSize": 2 - }, "[javascript]": { "editor.tabSize": 2 }, diff --git a/client/Dockerfile b/client/Dockerfile deleted file mode 100644 index f0a5c79..0000000 --- a/client/Dockerfile +++ /dev/null @@ -1,16 +0,0 @@ -# syntax=docker/dockerfile:1 - -FROM node:16.14 - -ENV NODE_ENV=production - -WORKDIR /app - -COPY ["package.json", "package-lock.json", "/app/"] - -RUN npm install -g npm -RUN npm ci --also=dev - -COPY . /app - -CMD [ "npm", "run", "build" ] \ No newline at end of file diff --git a/client/Dockerfile.dev b/client/Dockerfile.dev deleted file mode 100644 index d6beb4e..0000000 --- a/client/Dockerfile.dev +++ /dev/null @@ -1,15 +0,0 @@ -# syntax=docker/dockerfile:1 - -FROM node:12.22 - -ENV NODE_ENV=development - -WORKDIR /app - -COPY ["package.json", "package-lock.json*", "./"] - -RUN npm install - -COPY . . - -CMD ["npm", "run", "dev"] diff --git a/client/configs/build-templates.js b/client/configs/build-templates.js deleted file mode 100644 index 49f560b..0000000 --- a/client/configs/build-templates.js +++ /dev/null @@ -1,92 +0,0 @@ -const path = require("path"); -const fse = require("fs-extra"); -const HTMLWebpackPlugin = require("html-webpack-plugin"); - -/** - * @typedef BuildOptions - * @property {string} fileExtension - * @property {string} outputPrefix - * @property {HTMLWebpackPlugin.Options} pluginOptions Webpack plugin options. - */ - -/** */ -class TemplateFile { - /** - * @param {fse.Dirent} dirent - * @param {string} path Absolute path to the file. - */ - constructor(dirent, path) { - this.dirent = dirent; - this.path = path; - } -} - -/** - * Builds an array of HTML webpack plugins from the provided folder. - * @param {string} basePath Absolute path to the template folder. - * @param {BuildOptions} options Build optons. - */ -function buildHTMLWebpackPluginsRecursive(basePath, options) { - /** - * @type {HTMLWebpackPlugin[]} - */ - const plugins = []; - const files = walkFolder(basePath); - - files.forEach((file) => { - const isTemplateFile = file.dirent.isFile() && file.path.endsWith(`${options.fileExtension}`); - - if (isTemplateFile) { - const outputBase = path.relative(basePath, file.path); - const outputPath = path.join(path.basename(basePath), outputBase); - - const webpackPlugin = new HTMLWebpackPlugin({ - ...options.pluginOptions, - template: file.path, - filename: outputPath, - }); - - plugins.push(webpackPlugin); - } - }); - - return plugins; -} - -/** - * @param {string} folderPath Absolute path to the folder. - * @param {TemplateFile[]} files - */ -function walkFolder(folderPath, files = [], currentCount = 0) { - const nestedLimit = 1000; - const folderContents = fse.readdirSync(folderPath, { withFileTypes: true }); - - folderContents.forEach((entry) => { - const file = entry.isFile() && entry; - const folder = entry.isDirectory() && entry; - - if (file) { - const filePath = path.join(folderPath, file.name); - files.push(new TemplateFile(file, filePath)); - return; - } - - if (folder) { - currentCount++; - - if (currentCount > nestedLimit) { - throw new Error(`The folder at "${folderPath}" contains more than ${nestedLimit} folders.`); - } - - const newFolderPath = path.join(folderPath, folder.name); - - return walkFolder(newFolderPath, files, currentCount); - } - }); - - return files; -} - -module.exports = { - buildHTMLWebpackPluginsRecursive, -}; diff --git a/client/configs/emmet/snippets.json b/client/configs/emmet/snippets.json deleted file mode 100644 index 8ec5f82..0000000 --- a/client/configs/emmet/snippets.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "html": { - "snippets": {} - } -} diff --git a/client/configs/parse-config.mjs b/client/configs/parse-config.mjs new file mode 100644 index 0000000..7433604 --- /dev/null +++ b/client/configs/parse-config.mjs @@ -0,0 +1,42 @@ +// @ts-check +import path from "node:path"; +import fs from "node:fs"; +import Ajv from "ajv"; + +const ajv = new Ajv(); + +/** + * @returns {import("../../schema/config.ts").IConfiguration} + */ +export function parseConfiguration() { + const configSchemaPath = path.resolve( + __dirname, + "..", + "..", + "schema", + "config.schema.json" + ); + const configPath = path.resolve(__dirname, "..", "..", "config.json"); + const configFileSchemaContent = fs.readFileSync(configSchemaPath, { + encoding: "utf8", + }); + const configFileContent = fs.readFileSync(configPath, { encoding: "utf8" }); + const configSchema = JSON.parse(configFileSchemaContent); + /** + * @type {import("../../schema/config.ts").IConfiguration} + */ + const config = JSON.parse(configFileContent); + + const isValid = ajv.validate(configSchema, config); + + if (!isValid) { + /** + * @type {import("ajv").ErrorObject, unknown>[]} + */ + // @ts-expect-error + const errors = ajv.errors + throw new AggregateError(errors, "Failed to validate the config.") + } + + return config; +} diff --git a/client/configs/vars.js b/client/configs/vars.js deleted file mode 100644 index 997dea1..0000000 --- a/client/configs/vars.js +++ /dev/null @@ -1,21 +0,0 @@ -const path = require("path"); - -require("dotenv").config({ - path: path.resolve(__dirname, "..", ".."), -}); - -const kemonoSite = process.env.KEMONO_SITE || "http://localhost:5000"; -const nodeEnv = process.env.NODE_ENV || "production"; -const iconsPrepend = process.env.ICONS_PREPEND || ""; -const bannersPrepend = process.env.BANNERS_PREPEND || ""; -const thumbnailsPrepend = process.env.THUMBNAILS_PREPEND || ""; -const creatorsLocation = process.env.CREATORS_LOCATION || ""; - -module.exports = { - kemonoSite, - nodeEnv, - iconsPrepend, - bannersPrepend, - thumbnailsPrepend, - creatorsLocation, -}; diff --git a/client/configs/vars.mjs b/client/configs/vars.mjs new file mode 100644 index 0000000..7c61414 --- /dev/null +++ b/client/configs/vars.mjs @@ -0,0 +1,49 @@ +// @ts-check +import { parseConfiguration } from "./parse-config.mjs"; + +export const configuration = parseConfiguration(); +export const { webserver } = configuration; +export const apiServerBaseURL = configuration.webserver.base_url; +export const sentryDSN = configuration.sentry_dsn_js; +export const apiServerPort = !apiServerBaseURL + ? undefined + : configuration.webserver?.port; +export const siteName = configuration.webserver.ui.home.site_name || "Kemono"; +export const favicon = configuration.webserver.ui.favicon || "./static/favicon.ico"; +export const homeBackgroundImage = + configuration.webserver.ui.home.home_background_image; +export const homeMascotPath = configuration.webserver.ui.home.mascot_path; +export const homeLogoPath = configuration.webserver.ui.home.logo_path; +export const homeWelcomeCredits = configuration.webserver.ui.home.welcome_credits; +export const homeAnnouncements = configuration.webserver.ui.home.announcements; +// TODO: in development it should point to webpack server +export const kemonoSite = configuration.site || "http://localhost:5000"; +export const paysiteList = configuration.webserver.ui.config.paysite_list; +export const artistsOrCreators = + configuration.webserver.ui.config.artists_or_creators ?? "Artists"; +export const disableDMs = configuration.webserver.ui.sidebar?.disable_dms ?? true; +export const disableFAQ = configuration.webserver.ui.sidebar?.disable_faq ?? true; +export const disableFilehaus = + configuration.webserver.ui.sidebar?.disable_filehaus ?? true; +export const sidebarItems = configuration.webserver.ui.sidebar_items; +export const footerItems = configuration.webserver.ui.footer_items; +export const bannerGlobal = configuration.webserver.ui.banner?.global; +export const AnnouncementBannerGlobal = configuration.webserver.ui.banner?.announcement_global; +export const bannerWelcome = configuration.webserver.ui.banner?.welcome; +export const headerAd = configuration.webserver.ui.ads?.header; +export const middleAd = configuration.webserver.ui.ads?.middle; +export const footerAd = configuration.webserver.ui.ads?.footer; +export const sliderAd = configuration.webserver.ui.ads?.slider; +export const videoAd = configuration.webserver.ui.ads?.video; +export const isArchiveServerEnabled = configuration.archive_server?.enabled ?? false; +export const analyticsEnabled = configuration.webserver.ui.matomo?.enabled ?? false; +export const analyticsCode = configuration.webserver.ui.matomo?.plain_code; +export const iconsPrepend = webserver.ui.files_url_prepend?.icons_base_url || ""; +export const bannersPrepend = webserver.ui.files_url_prepend?.banners_base_url || ""; +export const thumbnailsPrepend = + webserver.ui.files_url_prepend?.thumbnails_base_url || ""; +export const isFileServingEnabled = Boolean( + configuration.archive_server?.file_serving_enabled +); +export const gitCommitHash = process.env.GIT_COMMIT_HASH; +export const buildDate = process.env.BUILD_DATE; diff --git a/client/extra.d.ts b/client/extra.d.ts new file mode 100644 index 0000000..f741f1f --- /dev/null +++ b/client/extra.d.ts @@ -0,0 +1,10 @@ +// required for typescript not to choke on css modules +declare module '*.scss' { + const classes: { [key: string]: string }; + export = classes; +} + +declare module '*.yaml' { + const data: any + export default data +} diff --git a/client/fluid-player/.babelrc b/client/fluid-player/.babelrc new file mode 100644 index 0000000..1320b9a --- /dev/null +++ b/client/fluid-player/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env"] +} diff --git a/client/fluid-player/.editorconfig b/client/fluid-player/.editorconfig new file mode 100644 index 0000000..7d87ba5 --- /dev/null +++ b/client/fluid-player/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[package.json] +indent_size = 2 + +[*.{js, css}] +indent_size = 4 diff --git a/client/fluid-player/.github/ISSUE_TEMPLATE/bug_report.md b/client/fluid-player/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..7a4f71f --- /dev/null +++ b/client/fluid-player/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug, needs triage +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots or Links** +If applicable, add screenshots or links to help explain your problem. **DO NOT** include links to NSFW webpages. Preferably create code to reproduce using https://jsfiddle.net + +**Desktop (please complete the following information if relevant):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information if relevant):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Affected version** +For example, v3.0.0 + +**Additional context** +Add any other context about the problem here. diff --git a/client/fluid-player/.github/ISSUE_TEMPLATE/feature_request.md b/client/fluid-player/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..e2c46f1 --- /dev/null +++ b/client/fluid-player/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: feature request, needs triage +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/client/fluid-player/.github/ISSUE_TEMPLATE/question.md b/client/fluid-player/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..1962d96 --- /dev/null +++ b/client/fluid-player/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,13 @@ +--- +name: Question +about: Question or clarification about Fluid Player or related technologies +title: '' +labels: question, needs triage +assignees: '' + +--- + +A clear and concise description of what the problem is. + +**Additional context** +Add any other context or screenshots about the request here. diff --git a/client/fluid-player/.github/pull_request_template.md b/client/fluid-player/.github/pull_request_template.md new file mode 100644 index 0000000..ce16278 --- /dev/null +++ b/client/fluid-player/.github/pull_request_template.md @@ -0,0 +1,16 @@ +**IMPORTANT: Please do not create a Pull Request without creating an issue first.** + +*Any change needs to be discussed before proceeding. Failure to do so may result in the rejection of the pull request.* + +## Proposed Changes + +1. ... +2. ... +3. ... + +## Relevant issues + +Closes #... +Closes #... +Closes #... +Related #... diff --git a/client/fluid-player/.gitignore b/client/fluid-player/.gitignore new file mode 100644 index 0000000..fa8c7d7 --- /dev/null +++ b/client/fluid-player/.gitignore @@ -0,0 +1,25 @@ +node_modules/ +dist/ +dist-cdn/ + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# E2E +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/client/fluid-player/.npmignore b/client/fluid-player/.npmignore new file mode 100644 index 0000000..73d1c4e --- /dev/null +++ b/client/fluid-player/.npmignore @@ -0,0 +1,9 @@ +test +.idea +e2e +.editorconfig +yarn.lock +webpack.config.js +dist +dist-cdn +.github diff --git a/client/fluid-player/CHANGELOG.md b/client/fluid-player/CHANGELOG.md new file mode 100644 index 0000000..2216964 --- /dev/null +++ b/client/fluid-player/CHANGELOG.md @@ -0,0 +1,372 @@ +# CHANGELOG + +## 3.46.0 (2024-12-12) +* [Pull #854](https://github.com/fluid-player/fluid-player/pull/854) Add support for automatic landscape screen orientation + +## 3.45.0 (2024-12-09) +* [Pull #859](https://github.com/fluid-player/fluid-player/pull/859) Create E2E project for Fluid Player +* [Pull #857](https://github.com/fluid-player/fluid-player/pull/857) Live Indicator + +## 3.44.0 (2024-11-14) +* [Pull #851](https://github.com/fluid-player/fluid-player/pull/851) Mobile on click show control bar instead of pausing video + +## 3.43.0 (2024-11-13) +* [Pull #855](https://github.com/fluid-player/fluid-player/pull/855) Fluidplayer doesn't play Wrapper ads + +## 3.42.0 (2024-11-05) +* [Pull #836](https://github.com/fluid-player/fluid-player/pull/836) FallbackVastTags may not be working + +## 3.41.0 (2024-11-04) +* [Pull #850](https://github.com/fluid-player/fluid-player/pull/850) New event system breaks current implementations + +## 3.40.0 (2024-10-24) +* [Pull #844](https://github.com/fluid-player/fluid-player/pull/844) MiniPlayer Follow Up > Improving UX and be Google compliant +* [Pull #846](https://github.com/fluid-player/fluid-player/pull/846) Rounded corners on player +* [Pull #848](https://github.com/fluid-player/fluid-player/pull/848) Uncaught TypeError: Cannot read properties of undefined (reading 'Parser') when using subtitles + +## 3.39.0 (2024-10-15) +* [Pull #842](https://github.com/fluid-player/fluid-player/pull/842) Ads events +* [Pull #843](https://github.com/fluid-player/fluid-player/pull/843) Mid Roll is not working with Live stream videos + +## 3.38.0 (2024-10-02) +* [Pull #838](https://github.com/fluid-player/fluid-player/pull/838) TheatreAdvanced is not working and breaks player + +## 3.37.0 (2024-09-17) +* [Pull #821](https://github.com/fluid-player/fluid-player/pull/821) Added support for VAST ViewableImpression +* [Pull #833](https://github.com/fluid-player/fluid-player/pull/833) doubleclickFullscreen not working + +## 3.36.0 (2024-09-05) +* [Pull #832](https://github.com/fluid-player/fluid-player/pull/832) Show quality change icon in player when working with hls (m3u8) + +## 3.35.0 (2024-08-01) +* [Pull #825](https://github.com/fluid-player/fluid-player/pull/825) Fix image freezing +* [Pull #826](https://github.com/fluid-player/fluid-player/pull/826) Ads cannot be displayed when XML content has two Creative tags + +## 3.34.0 (2024-07-11) +* [Pull #819](https://github.com/fluid-player/fluid-player/pull/819) When users don't have suggested videos, there's a console error + +## 3.33.0 (2024-07-02) +* [Pull #818](https://github.com/fluid-player/fluid-player/pull/818) Suggested Videos Feature in Fluid Player + +## 3.32.0 (2024-03-21) +* [Pull #804](https://github.com/fluid-player/fluid-player/pull/804) htmlOnPauseBlock not being displayed with last version of FP + +## 3.31.0 (2024-01-25) +* [Pull #788](https://github.com/fluid-player/fluid-player/pull/788) Fluid Player doesn't work with Next.js +* [Pull #791](https://github.com/fluid-player/fluid-player/pull/791) Impression events aren't called for some VAST tags within the VAST wrapper chain + +## 3.30.0 (2024-01-11) +* [Pull #789](https://github.com/fluid-player/fluid-player/pull/789) Uncaught TypeError: Cannot set properties of null (setting 'slotIframe') while testing on VOD with VPAID Non Linear + +## 3.29.0 (2023-12-14) +* [Pull #783](https://github.com/fluid-player/fluid-player/pull/783) Fix test cases in the development sever +* [Pull #785](https://github.com/fluid-player/fluid-player/pull/785) FluidPlayer > Error > onPauseRoll In Video Banner VAST + +## 3.28.0 (2023-11-16) +* [Pull #776](https://github.com/fluid-player/fluid-player/pull/776) Fluid Player doesn't work with shadow DOM + +## 3.27.0 (2023-10-19) +* [Pull #771](https://github.com/fluid-player/fluid-player/pull/771) Method loadVpaid create frame without body + +## 3.26.0 (2023-10-12) +* [Pull #768](https://github.com/fluid-player/fluid-player/pull/768) Stretch posterImage to playerwindow +* [Pull #769](https://github.com/fluid-player/fluid-player/pull/769) Events don't differ from Ad and Main video + +## 3.25.0 (2023-09-21) +* [Pull #766](https://github.com/fluid-player/fluid-player/pull/766) adClickable and CTA parameters don't work when 2 VAST ad is loaded + +## 3.24.0 (2023-09-08) +* [Pull #763](https://github.com/fluid-player/fluid-player/pull/763) Player can't be restarted by destroying it and initializing it again + +## 3.23.0 (2023-08-28) +* [Pull #757](https://github.com/fluid-player/fluid-player/pull/757) Preload doesn't work for .m3u8 files when the player is serving in-stream ads +* [Pull #760](https://github.com/fluid-player/fluid-player/pull/760) Lighthouse says: Does not use passive listeners to improve scrolling performance + +## 3.22.0 (2023-08-17) +* [Pull #755](https://github.com/fluid-player/fluid-player/pull/755) Percentages are not accepted for "timer" property + +## 3.21.0 (2023-08-08) +* [Pull #748](https://github.com/fluid-player/fluid-player/pull/748) CurrentTime reset after switch HLS source on IOS +* [Pull #752](https://github.com/fluid-player/fluid-player/pull/752) Add "controlForwardBackward" setting inside the player instead of the control bar + +## 3.20.0 (2023-07-24) +* [Pull #749](https://github.com/fluid-player/fluid-player/pull/749) Mouse disappears +* [Pull #750](https://github.com/fluid-player/fluid-player/pull/750) In mobile and when using .m3u8 files, user needs to click the player twice in order to play the video + +## 3.19.0 (2023-07-12) +* [Pull #746](https://github.com/fluid-player/fluid-player/pull/746) Could not find a declaration file for module 'fluid-player' + +## 3.18.0 (2023-06-30) +* [Pull #744](https://github.com/fluid-player/fluid-player/pull/744) Failed to resolve import "cheerio/lib/api/traversing" + +## 3.17.0 (2023-06-16) +* [Pull #734](https://github.com/fluid-player/fluid-player/pull/734) MiniPlayer Mobile support +* [Pull #735](https://github.com/fluid-player/fluid-player/pull/735) MiniPlayer position configuration +* [Pull #739](https://github.com/fluid-player/fluid-player/pull/739) MiniPlayer Activate miniplayer when scrolling goes out of viewport +* [Pull #740](https://github.com/fluid-player/fluid-player/pull/740) MiniPlayer Allowing trigger MiniPlayer by code +* [Pull #736](https://github.com/fluid-player/fluid-player/pull/736) Fluid player doesn't track clicks on some sites + +## 3.16.0 (2023-05-31) +* [Pull #721](https://github.com/fluid-player/fluid-player/pull/721) Fluid Player loads midRoll even if timer is longer than main video +* [Pull #732](https://github.com/fluid-player/fluid-player/pull/732) MiniPlayer MVP + +## 3.15.0 (2023-05-09) +* [Pull #727](https://github.com/fluid-player/fluid-player/pull/727) Player required 2 clicks to play video New Iphone 11 Pro Chrome + +## 3.14.0 (2023-04-27) +* [Pull #722](https://github.com/fluid-player/fluid-player/pull/722) Support Video Waterfall VAST Response + +## 3.13.0 (2023-03-09) +* [Pull #714](https://github.com/fluid-player/fluid-player/pull/714) Support Video Waterfall VAST Response + +## 3.12.0 (2023-01-10) +* [Pull #707](https://github.com/fluid-player/fluid-player/pull/707) Decrease volumes & revenue on In-stream zones + +## 3.11.1 (2023-01-03) +* Update dependencies + +## 3.11.0 (2023-01-03) +* [Pull #614](https://github.com/fluid-player/fluid-player/pull/614) Add check for process being defined +* [Pull #561](https://github.com/fluid-player/fluid-player/pull/561) Allow customizing playbackRates + +## 3.10.0 (2022-12-15) +* [Pull #687](https://github.com/fluid-player/fluid-player/pull/687) LocalStorage not available in Chrome incognito mode is breaking JS +* [Pull #704](https://github.com/fluid-player/fluid-player/pull/704) In ad serving, the skip button when is without time delay it should trigger immediately the "skip ad" + +## 3.9.0 (2022-10-18) +* [Pull #688](https://github.com/fluid-player/fluid-player/pull/688) Selecting subtitle by default + +## 3.8.0 (2022-10-07) +* [Pull #685](https://github.com/fluid-player/fluid-player/pull/685) Fluidplayer > 'autoHide' in Desktop only works when the cursor is on top of the player. +* [Pull #689](https://github.com/fluid-player/fluid-player/pull/689) Mobile view_ Error in console and wrong positioning of the CTA text + +## 3.7.0 (2022-09-28) +* [Pull #650](https://github.com/fluid-player/fluid-player/pull/650) Play main video after preRoll ends not work + +## 3.6.0 (2022-08-24) +* [Pull #666](https://github.com/fluid-player/fluid-player/pull/666) CTA Overlay > cannot be removed by publisher + +## 3.5.0 (2022-07-20) +* [Pull #669](https://github.com/fluid-player/fluid-player/pull/669) Video CTA / Fluid Player +* [Pull #671](https://github.com/fluid-player/fluid-player/pull/671) Video CTA - update FP to support new CTA structure from VAST Tag + +## 3.4.0 (2022-07-05) +* [Pull #652](https://github.com/fluid-player/fluid-player/pull/652) Video on demand and linear VPAID does not work on iOS Safari +* [Pull #664](https://github.com/fluid-player/fluid-player/pull/664) Video CTA / Fluid Player + +## 3.3.0 (2022-06-22) +* [Pull #656](https://github.com/fluid-player/fluid-player/pull/656) Video CTA / Fluid Player + +## 3.2.1 (2022-05-17) +* Update dependencies + +## 3.2.0 +* [Pull #641](https://github.com/fluid-player/fluid-player/pull/641) FluidPlayer > Streaming files compatibility + +## 3.1.0 +* [Pull #619](https://github.com/fluid-player/fluid-player/pull/619) Looping videos show loading spinner for a split second before looping +* [Pull #621](https://github.com/fluid-player/fluid-player/pull/621) FluidPlayer> Mouse disappears +* [Pull #622](https://github.com/fluid-player/fluid-player/pull/622) contextMenu.links labels are not working after play +* [Pull #628](https://github.com/fluid-player/fluid-player/pull/628) Overlay html over video (also in fullscreen) + +## 3.0.4 +* [Pull #489](https://github.com/fluid-player/fluid-player/pull/489) Fix issues with nonLinear ads not closing + +## 3.0.3 +* [Pull #478](https://github.com/fluid-player/fluid-player/pull/478) Ensure options is object, fix dash debug + +## 3.0.2 +* [Pull #473](https://github.com/fluid-player/fluid-player/pull/473) Responsive test case +* [Pull #474](https://github.com/fluid-player/fluid-player/pull/474) Fix issues related to missing ended event +* [Pull #472](https://github.com/fluid-player/fluid-player/pull/472) Small refactor, add auto-hide test case +* [Pull #471](https://github.com/fluid-player/fluid-player/pull/471) Move X seconds forward/back +* [Pull #470](https://github.com/fluid-player/fluid-player/pull/470) Custom context +* [Pull #469](https://github.com/fluid-player/fluid-player/pull/469) Prevent hidden menus after cssmin optimization +* [Pull #468](https://github.com/fluid-player/fluid-player/pull/468) Config callbacks + +## 3.0.1 +* [Pull #457](https://github.com/fluid-player/fluid-player/pull/430) Fix ad skip button not showing properly +* [Pull #450](https://github.com/fluid-player/fluid-player/pull/430) Static thumbnail configuration +* [Pull #458](https://github.com/fluid-player/fluid-player/pull/430) Fix dash.js initialization and swap Vtt.js to Videojs fork + +## 3.0.0 +* [Pull #441](https://github.com/fluid-player/fluid-player/pull/441) Major release - see pull request for full changelist. + +## 2.4.11 +* [Pull #430](https://github.com/fluid-player/fluid-player/pull/430) Add destroy function + +## 2.4.10 +* [Pull #399](https://github.com/fluid-player/fluid-player/pull/399) Adding VR Features to player (experimental) + +## 2.4.9 +* [Pull #398](https://github.com/fluid-player/fluid-player/pull/398) Add support for VPAID (2.0) + +## 2.4.8 +* [Pull #374](https://github.com/fluid-player/fluid-player/pull/374) Skip ad button on VAST preroll opening a new blank tab + +## 2.4.7 +* [Pull #361](https://github.com/fluid-player/fluid-player/pull/361) Adding subtitles, multiple ad-roll, fallback vast ad, fixing dash playback, double click to fullscreen +* [Pull #354](https://github.com/fluid-player/fluid-player/pull/354) VAST Multiple mediafile support, announce proper error codes and some bug fixes +* [Pull #356](https://github.com/fluid-player/fluid-player/pull/356) Seeked and ended html5 event listeners + +## 2.4.6 +* [Pull #358](https://github.com/fluid-player/fluid-player/pull/358) fix bug with dash js api + +## 2.4.5 +* [Pull #325](https://github.com/fluid-player/fluid-player/pull/325) Add poster image size option (posterImageSize) +* [Pull #330](https://github.com/fluid-player/fluid-player/pull/330) Add showPlayButton config to display Play button on ad +* [Pull #306](https://github.com/fluid-player/fluid-player/pull/306) Remove unsupported browser layout parts +* [Pull #331](https://github.com/fluid-player/fluid-player/pull/331) Add ability to change controls titles +* [Pull #332](https://github.com/fluid-player/fluid-player/pull/332) Fix multiple videos play +* [Pull #335](https://github.com/fluid-player/fluid-player/pull/335) Improve timecode +* [Pull #336](https://github.com/fluid-player/fluid-player/pull/336) Add title +* [Pull #334](https://github.com/fluid-player/fluid-player/pull/334) Add ability to set preload value + +## 2.4.4 +* [Pull #289](https://github.com/fluid-player/fluid-player/pull/289) Fix window.getComputedStyle call on null +* [Pull #290](https://github.com/fluid-player/fluid-player/pull/290) Prevent multi click event on download btn +* [Pull #293](https://github.com/fluid-player/fluid-player/pull/293) Check if Hls already exposed in window + +## 2.4.3 +* [Pull #266](https://github.com/fluid-player/fluid-player/pull/266) Fix play pause issue on mobile +* [Pull #268](https://github.com/fluid-player/fluid-player/pull/268) Fix iOS scrubbing bugs +* [Pull #270](https://github.com/fluid-player/fluid-player/pull/270) Fix for iOS switching to unsupported file types + +## 2.4.2 +* [Pull #235](https://github.com/fluid-player/fluid-player/pull/235) [Pull #236](https://github.com/fluid-player/fluid-player/pull/236) Fix the controls randomly disappearing on scrubbing clicks + +## 2.4.1 +* [Pull #228](https://github.com/fluid-player/fluid-player/pull/228) Persistent volume settings from before mute on page navigation +* [Pull #229](https://github.com/fluid-player/fluid-player/pull/229) Link to FP on menu button working correctly +* [Pull #230](https://github.com/fluid-player/fluid-player/pull/230) Fix for right click on initial play button +* [Pull #227](https://github.com/fluid-player/fluid-player/pull/227) Optional parameter to disable clickthrough layer on instream ads +* [Pull #231](https://github.com/fluid-player/fluid-player/pull/231) Fixes for how thumbnails are drawn and mouse event detection + +## 2.4.0 +* [Pull #214](https://github.com/fluid-player/fluid-player/pull/241) Avoid looping VAST Ad +* [Pull #206](https://github.com/fluid-player/fluid-player/pull/206) Fix tracking impression events for nonLinear ads +* [Pull #221](https://github.com/fluid-player/fluid-player/pull/221) Fix VAST loading issue by AdBlock +* [Pull #207](https://github.com/fluid-player/fluid-player/pull/207) Add support for HD icon on quality select +* [Pull #209](https://github.com/fluid-player/fluid-player/pull/209) Advanced theatre mode +* [Pull #208](https://github.com/fluid-player/fluid-player/pull/208) Compress files +* [Pull #179](https://github.com/fluid-player/fluid-player/pull/179) Fix to prevent changing speed during ads +* [Pull #217](https://github.com/fluid-player/fluid-player/pull/217) Prevent video size change on quality switch +* [Pull #213](https://github.com/fluid-player/fluid-player/pull/213) Controls to stay working with adblock and fix for double event on mobile touch +* [Pull #212](https://github.com/fluid-player/fluid-player/pull/212) Poster image to fit player size +* [Pull #186](https://github.com/fluid-player/fluid-player/pull/186) Fix for source switch on Edge +* [Pull #219](https://github.com/fluid-player/fluid-player/pull/219) Play / pause icon fix and progress bar to disappear correctly +* [Pull #218](https://github.com/fluid-player/fluid-player/pull/218) Optional theatre settings + +## 2.3.0 +* [Pull #192](https://github.com/fluid-player/fluid-player/pull/191) Persist user settings across pages for volume, speed, quality and theatre mode +* [Pull #194](https://github.com/fluid-player/fluid-player/pull/194) Fix for play event on video click for certain devices +* [Pull #193](https://github.com/fluid-player/fluid-player/pull/193) Option to set adText and adTextPosition on a per ad basis +* [Pull #184](https://github.com/fluid-player/fluid-player/pull/184) Fix for thumbnails appearing incorrectly on mobile +* [Pull #181](https://github.com/fluid-player/fluid-player/pull/181) Fix for poster image for dash file +* [Pull #195](https://github.com/fluid-player/fluid-player/pull/195) Loading icon while player is waiting +* [Pull #200](https://github.com/fluid-player/fluid-player/pull/200) Ad text positioning fix +* [Pull #196](https://github.com/fluid-player/fluid-player/pull/196) Fix for issue causing controls to hide incorrectly +* [Pull #191](https://github.com/fluid-player/fluid-player/pull/191) Scrubbing to no longer trigger Fluid on.pause event + +## 2.2.2 +* [Pull #175](https://github.com/fluid-player/fluid-player/pull/175) Fullscreen mode variable correct place +* [Pull #177](https://github.com/fluid-player/fluid-player/pull/177) Fix fadeOut/fadeIn opacity to correct values in the end of animation +* [Pull #180](https://github.com/fluid-player/fluid-player/pull/180) Adding VASTAdTagURI support + +## 2.2.1 +* [Pull #153](https://github.com/fluid-player/fluid-player/pull/153) CDATA media file ignores whitespace correctly +* [Pull #154](https://github.com/fluid-player/fluid-player/pull/154) onPauseRoll not showing on source switch +* [Pull #155](https://github.com/fluid-player/fluid-player/pull/155) iOS native fullscreen +* [Pull #156](https://github.com/fluid-player/fluid-player/pull/156) CSS fixes for progress bar and logo +* [Pull #157](https://github.com/fluid-player/fluid-player/pull/157) Fix for onMainVideoEnded firing correctly +* [Pull #158](https://github.com/fluid-player/fluid-player/pull/158) Play / Pause animation to not show when changing source +* [Pull #159](https://github.com/fluid-player/fluid-player/pull/159) Theatre mode to not show in iframe +* [Pull #148](https://github.com/fluid-player/fluid-player/pull/148) Fix for currentTime being set for iOS and safari for ads and source switch +* [Pull #165](https://github.com/fluid-player/fluid-player/pull/165) Fix for video duration if passed as 00:00:00 in the VAST file +* [Pull #167](https://github.com/fluid-player/fluid-player/pull/167) Allow for individual images to be set in .vtt file +* [Pull #169](https://github.com/fluid-player/fluid-player/pull/169) Preview Thumbnail image locations - Ability to set relative path +* [Pull #168](https://github.com/fluid-player/fluid-player/pull/168) Show custom error if XML content-type is wrong +* [Pull #166](https://github.com/fluid-player/fluid-player/pull/166) Bug fix for Error 202 showing up periodically in the console +* [Pull #149](https://github.com/fluid-player/fluid-player/pull/149) Bug fix to remove mainVideoReady eventListener after success + +## 2.2.0 +* [Pull #121](https://github.com/fluid-player/fluid-player/pull/121) 'Browser layout' VAST fixes +* [Pull #122](https://github.com/fluid-player/fluid-player/pull/122) iOS fullscreen improvements, use native player +* [Pull #125](https://github.com/fluid-player/fluid-player/pull/125) Fix for VAST tag: additional checks for CDATA node irregularity +* [Pull #126](https://github.com/fluid-player/fluid-player/pull/126) Pause player when linear ad opens (ad video is clicked) +* [Pull #127](https://github.com/fluid-player/fluid-player/pull/127) OnPause ad showing on source switch fix +* [Pull #128](https://github.com/fluid-player/fluid-player/pull/128) [Pull #139](https://github.com/fluid-player/fluid-player/pull/139) Poster Image as a param +* [Pull #130](https://github.com/fluid-player/fluid-player/pull/130) Create progressbar markers for nonLinear ads +* [Pull #131](https://github.com/fluid-player/fluid-player/pull/131) [Pull #136](https://github.com/fluid-player/fluid-player/pull/136/) Additional logo parameters +* [Pull #138](https://github.com/fluid-player/fluid-player/pull/138) Support for DASH and HLS streaming +* [Pull #143](https://github.com/fluid-player/fluid-player/pull/143) Positioning of ad and cta text elements + +## 2.1.2 +* [Pull #108](https://github.com/fluid-player/fluid-player/pull/108) Fullscreen API call fix +* [Pull #110](https://github.com/fluid-player/fluid-player/pull/110) Improvements for iOs safari (use default skin) and mobile screens +* [Pull #111](https://github.com/fluid-player/fluid-player/pull/111) Adjust how iconClickThrough is gotten + +## 2.1.1 +* [Pull #107](https://github.com/fluid-player/fluid-player/pull/107) Download and Theatre fixes + +## 2.1 +* [Pull #101](https://github.com/fluid-player/fluid-player/pull/101) Quality indicator +* [Pull #102](https://github.com/fluid-player/fluid-player/pull/102) API functions +* [Pull #103](https://github.com/fluid-player/fluid-player/pull/103) Landing page displayed in In-Stream ads +* [Pull #104](https://github.com/fluid-player/fluid-player/pull/104) Theater mode, download & playback rate + +## 2.0 +* [Pull #91](https://github.com/fluid-player/fluid-player/pull/91) Version 2 Changes: + * New default template + * Add play button + * Play pause animations + * Restructuring of optional parameters + * Remove templates + * General fixes + +## 1.2.2 +* [Pull #88](https://github.com/fluid-player/fluid-player/pull/88) Improve nonlinear ads + +## 1.2.1 +* [Pull #86](https://github.com/fluid-player/fluid-player/pull/86) [Pull #87](https://github.com/fluid-player/fluid-player/pull/87) Mid roll current time fix + +## 1.2.0 +* [Pull #68](https://github.com/fluid-player/fluid-player/pull/68) Controls remain fullscreen after escaping fullscreen +* [Pull #66](https://github.com/fluid-player/fluid-player/pull/66) Optional logoUrl for clickable logo +* [Pull #74](https://github.com/fluid-player/fluid-player/pull/74) Add ability to grab and slide the volume slider and timeline scrubber. +* [Pull #75](https://github.com/fluid-player/fluid-player/pull/75) [Pull #77](https://github.com/fluid-player/fluid-player/pull/77) Adding mid/post roll support and initial VAST nonLinear support. +* [Pull #67](https://github.com/fluid-player/fluid-player/pull/67) Adding key controls. +* [Pull #69](https://github.com/fluid-player/fluid-player/pull/69) Adding controls hiding functionality. + +## 1.1.3 +* [Pull #50](https://github.com/fluid-player/fluid-player/pull/50) Fix for double double render of blank video on some browsers + +## 1.1.2 +* [Pull #43](https://github.com/fluid-player/fluid-player/pull/43) Add two new skins. + +## 1.1.1 +* [Pull #38](https://github.com/fluid-player/fluid-player/pull/38) Reset the CSS box-sizing settings. + +## 1.1.0 +* [Pull #34](https://github.com/fluid-player/fluid-player/pull/34) Various Improvements: + * Possibility to allow the user to switch between different video qualities. (Example, 720p, 1080p, etc...) + * Enable/Disable autoplay. + * Possibility to set a logo over the video player, with configurable position and opacity. + * Possibility to show a text when a video ad is being played. (Example : "Advertising") + * Possibility to show a call to action link when a video ad is being played. (Example : "Click here to learn more about this product.") + * Improved CSS management. + * Possibility to show a custom HTML code when the user pauses the video. (For example, a banner ad, or some related video links) + * The video player can be fully responsive. + +## 1.0.2 +* [Pull #18](https://github.com/fluid-player/fluid-player/pull/18) [Pull #19](https://github.com/fluid-player/fluid-player/pull/19) Update file names, add in min file versions + +## 1.0.1 +* [Pull #1](https://github.com/fluid-player/fluid-player/pull/1) Fix a Fluid Player crash when the ad video file is not available. Properly announcing errors if an Error tag is present in the VAST tag. +* [Pull #3](https://github.com/fluid-player/fluid-player/pull/3) Demo layouts. Various bugfixes and improvements. +* [Pull #10](https://github.com/fluid-player/fluid-player/pull/10) Thumbnail previews from vtt file can be overwritten. +* [Pull #11](https://github.com/fluid-player/fluid-player/pull/11) Player shows current play time and video duration in 'default' template. +* [Pull #14](https://github.com/fluid-player/fluid-player/pull/14) Fix a minor issue when playing the video from outside the Fluid Player code. + +## 1.0.0 +* Initial Release diff --git a/client/fluid-player/CONTRIBUTING.md b/client/fluid-player/CONTRIBUTING.md new file mode 100644 index 0000000..0fd8f48 --- /dev/null +++ b/client/fluid-player/CONTRIBUTING.md @@ -0,0 +1,54 @@ +# Contributing + +If you are interested in making a contribution there are a few ways you could help out the project. + +## Filing issues + +[GitHub Issues](https://github.com/fluid-player/fluid-player/issues) are used for all discussions around the codebase, including **bugs** and **features**. + +### Reporting a Bug + +Good bug reports can be very helpful. A bug is a demonstrable problem with the code. + +Guidelines for bug reports: + +1. Please use the [GitHub issue search](https://github.com/fluid-player/fluid-player/issues) — check if the issue has already been reported. +1. Check if the issue has already been fixed — try to reproduce it using the uncompressed code from latest `master` branch in the repository. +1. Create a small demo with the live example (reduced test case). You can possibly use [this codepen template](https://codepen.io/exadsleroy/pen/QWmWPeo) as a starting point -- don't forget to update it to the fluid-player version you use. + +A good bug report should be as detailed as possible, so that others won't have to follow up for the essential details. + +**[File a bug report](https://github.com/fluid-player/fluid-player/issues/new)** + +### Requesting a Feature + +1. [Search the issues](https://github.com/fluid-player/fluid-player/issues) for any previous requests for the same feature, and give a thumbs up or +1 on existing requests. +1. If no previous requests exist, create a new issue. Please be as clear as possible about why the feature is needed and the intended use case. + +**[Request a feature](https://github.com/fluid-player/fluid-player/issues/new)** + +## Contributing code + +If you plan to propose code changes it is required you create an +issue [issue](https://github.com/fluid-player/fluid-player/issues/new) with a brief proposal (as described in +Requesting a Feature) and discuss it with us first. + +This is necessary to avoid more than one contributor working on the same feature/change and to avoid someone +spending time on feature/change that would not be merged for some reason. + +For smaller contributions just use this workflow: + +* Create an issue describing the changes. +* Await confirmation from contributors. +* Fork the project. +* Create a branch for your feature or bug fix. +* Add code changes. +* All new features or changes to the player settings or interface have to be documented in the +[docs repo](https://github.com/fluid-player/fluid-player-docs), so that they are displayed +on [https://docs.fluidplayer.com](https://docs.fluidplayer.com). +If you have made changes like this, please fork fluid-player-docs as well and create a branch with the same +name as the feature branch, adding necessary changes to documentation. +* Send a pull request (both for fluid-player and fluid-player-docs) + +After one of the contributors has checked and approved the changes, they will be merged into master branch +and will be included in the next release tag. diff --git a/client/fluid-player/LICENSE b/client/fluid-player/LICENSE new file mode 100644 index 0000000..0d1e312 --- /dev/null +++ b/client/fluid-player/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Fluid Player and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/client/fluid-player/README.md b/client/fluid-player/README.md new file mode 100644 index 0000000..87057fe --- /dev/null +++ b/client/fluid-player/README.md @@ -0,0 +1,23 @@ +# Fluid Player +[![Latest version](https://img.shields.io/github/v/release/fluid-player/fluid-player?include_prereleases&label=latest%20release&sort=semver&style=flat-square&logo=GitHub)](https://github.com/fluid-player/fluid-player/releases/latest) +[![npm](https://img.shields.io/npm/v/fluid-player?style=flat-square&logo=npm)](https://www.npmjs.com/package/fluid-player) + +## Version 3 released + +A [new major version](https://github.com/fluid-player/fluid-player/pull/441) of Fluid Player has been released on May 20, 2020. Existing version 2 users are recommended to upgrade. [See quick setup guide](https://docs.fluidplayer.com/docs/integration/quick-setup/). + +## Overview + +Fluid Player is a free HTML5 video player. It is lightweight, easy to integrate and has advanced VAST capabilities. +The idea behind VAST, as well as the full VAST specification, can be found here: [VAST 4.0](https://www.iab.com/guidelines/digital-video-ad-serving-template-vast-4-0/). + +## Documentation +The integration and configuration of Fluid Player is fully outlined in [Fluid Player Documentation](http://docs.fluidplayer.com) + +## License + +Fluid Player is licensed under the MIT License. View the [License File](LICENSE). + +## Changelog + +A full list of changes and updates can be found in the project [CHANGELOG](CHANGELOG.md). diff --git a/client/fluid-player/e2e/ads_linear.spec.ts b/client/fluid-player/e2e/ads_linear.spec.ts new file mode 100644 index 0000000..03bc050 --- /dev/null +++ b/client/fluid-player/e2e/ads_linear.spec.ts @@ -0,0 +1,181 @@ +import { test, expect } from '@playwright/test'; +import { waitForVideoToPlay, setVideoCurrentTime, getVideoCurrentTime } from './functions/video'; +import { waitForSpecificNetworkCall } from './functions/network'; + +test.describe('desktop ads', () => { + + test.beforeEach(async ({ page }) => { + console.log(`Running ${test.info().title}`); + await page.goto('/ads_linear.html'); + }); + + test('should navigate to the publishers advertised website on click', async ({ page }) => { + const fullPlayer = page.locator('#fluid_video_wrapper_fluid-player-e2e-case'); + const video = page.locator('video'); + + // start the video + fullPlayer.click(); + + await waitForVideoToPlay(video); + + // Set up a listener for the 'popup' event + // This listener listens for a new _blank tab to open + const [popupPromise] = await Promise.all([ + page.waitForEvent('popup'), // Listen for the popup event + fullPlayer.click() // click ad to open advertisers link + ]); + + // Prevent the tab from fully opening + const popup = popupPromise; + + // Verify the URL of the popup + const popupUrl = popup.url(); + console.log(`Popup URL: ${popupUrl}`); + expect(popupUrl).toBe('http://www.example.com/'); + + // Close the popup to prevent extra tabs, in case the above failed to prevent the opening of the new tab + await popup.close(); + }); + + test('should fire pre-, mid- and postRoll based on time', async ({ page }) => { + const fullPlayer = page.locator('#fluid_video_wrapper_fluid-player-e2e-case'); + const skipButton = page.locator('.skip_button'); + const video = page.locator('video'); + + // Start the video + fullPlayer.click(); + await waitForVideoToPlay(video); + + /** + * PREROLL + */ + await expect(skipButton).toHaveText(/Skip ad in 2/); + // Wait for skip ad timer + await page.waitForTimeout(2500); + await expect(skipButton).toHaveText(/Skip Ad /); + + // Skip the ad + await skipButton.click(); + + /** + * MIDROLL + */ + await page.waitForFunction(() => { + const videoElement = document.querySelector('video') as HTMLVideoElement; + // 15 is the length of the ad + return videoElement && Math.floor(videoElement.duration) !== 15; + }); + + // Midrolls don't trigger if you seek less then 5 seconds before their time + await setVideoCurrentTime(video, 35); + await page.waitForTimeout(5500); + await expect(skipButton).toHaveText(/Skip ad in 2/); + // Wait for skip ad timer + await page.waitForTimeout(2500); + await expect(skipButton).toHaveText(/Skip Ad /); + + // Skip the ad + await skipButton.click(); + + await page.waitForTimeout(500); + + await waitForVideoToPlay(video); + + const currentTime = await getVideoCurrentTime(video); + + // Check if the video resumes after the midroll at the correct time + expect(Math.floor(currentTime)).toEqual(39); + + /** + * POSTROLL + */ + + // Skip to the end + await page.waitForTimeout(500); + await video.evaluate((videoEl) => { + const vid = (videoEl as HTMLVideoElement); + vid.currentTime = Math.max(0, vid.duration) - 1; + }); + await page.waitForTimeout(1000); + await expect(skipButton).toHaveText(/Skip ad in 2/); + // Wait for skip ad timer + await page.waitForTimeout(2500); + await expect(skipButton).toHaveText(/Skip Ad /); + + await skipButton.waitFor({ state: 'visible', timeout: 5000 }); + // Skip the ad + await skipButton.click(); + + // Check if video is marked as ended + await page.waitForFunction(() => { + const video = document.querySelector('video'); + return video && !video.ended; + }); + }); + + test('ad should not be skipped when the ad countdown is not done', async ({ page }) => { + const fullPlayer = page.locator('#fluid_video_wrapper_fluid-player-e2e-case'); + const skipButton = page.locator('.skip_button'); + const video = page.locator('video'); + + // Start the video + fullPlayer.click(); + + await page.waitForFunction(() => { + const videoElement = document.querySelector('video'); + return videoElement && videoElement.duration > 0; + }, { timeout: 5000 }); + + const adDuration = await video.evaluate((vid) => { + const videoElement = vid as HTMLVideoElement; + return videoElement.duration; + }); + + // Click the button but it should not be skipped + // NOTE: don't add 'await' because it will wait until it can skip + skipButton.click(); + + // If the ad still has the same video duration, that means the video is not skipped + const videoDurationAfterClick = await video.evaluate((vid) => { + const videoElement = vid as HTMLVideoElement; + return videoElement.duration; + }); + + expect(videoDurationAfterClick).not.toBeFalsy(); + expect(adDuration).not.toBeFalsy(); + + expect(videoDurationAfterClick).toEqual(adDuration); + + await page.waitForTimeout(2000); + // Skip Ad + await skipButton.click(); + await page.waitForTimeout(500); + + const videoDuration = await video.evaluate((vid) => { + const videoElement = vid as HTMLVideoElement; + return videoElement.duration; + }); + + expect(videoDuration).not.toBeFalsy(); + expect(adDuration).not.toBeFalsy(); + + expect(videoDuration).not.toEqual(adDuration); + }); + + test('impression url should be called', async ({ page }) => { + const fullPlayer = page.locator('#fluid_video_wrapper_fluid-player-e2e-case'); + + // start the video + fullPlayer.click(); + + const request = await waitForSpecificNetworkCall( + page, + 'http://www.example.com/impression', + 'GET' + ); + + expect(request.url()).toBe('http://www.example.com/impression'); + }); + +}); + diff --git a/client/fluid-player/e2e/controls.spec.ts b/client/fluid-player/e2e/controls.spec.ts new file mode 100644 index 0000000..348e9c6 --- /dev/null +++ b/client/fluid-player/e2e/controls.spec.ts @@ -0,0 +1,69 @@ +import { test, expect } from '@playwright/test'; + +test.describe('desktop controls', () => { + + test.beforeEach(async ({ page }) => { + console.log(`Running ${test.info().title}`); + await page.goto('/controls.html'); + }); + + test('should toggle play/pause when clicking the player', async ({ page }) => { + // Selectors + const fullPlayer = page.locator('#fluid_video_wrapper_fluid-player-e2e-case'); + const playButton = page.locator('.fluid_button_play'); + const pauseButton = page.locator('.fluid_button_pause'); + + // Initial state checks + await expect(playButton).toBeVisible(); + await expect(pauseButton).not.toBeVisible(); + + // Video player should start playing + fullPlayer.click(); + + // Wait for video to start playing + await page.waitForFunction(() => { + const video = document.querySelector('video'); + return video && !video.paused; + }); + + // Verify playing state + await expect(playButton).not.toBeVisible(); + await expect(pauseButton).toBeVisible(); + + // Wait for 500ms so the browser doesn't reject the click + await page.waitForTimeout(1000); + // Video player should pause + fullPlayer.click(); + + // Wait for video to pause + await page.waitForFunction(() => { + const video = document.querySelector('video'); + return video && video.paused; + }); + + // Verify paused state + await expect(playButton).toBeVisible(); + await expect(pauseButton).not.toBeVisible(); + }); + + test('mouse should disappear when hovering the video', async ({ page }) => { + const video = page.locator('video'); + const playButton = page.locator('.fluid_button_play'); + + await playButton.click(); + + // Hover over the video + await video.hover(); + + await page.waitForTimeout(1500); + + // Evaluate the cursor CSS property of the video element or its parent + const isCursorHidden = await video.evaluate((vid) => { + const computedStyle = window.getComputedStyle(vid); + return computedStyle.cursor === 'none'; + }); + + expect(isCursorHidden).toBeTruthy(); // Assert that the cursor is hidden + }); +}); + diff --git a/client/fluid-player/e2e/functions/network.ts b/client/fluid-player/e2e/functions/network.ts new file mode 100644 index 0000000..4e84326 --- /dev/null +++ b/client/fluid-player/e2e/functions/network.ts @@ -0,0 +1,21 @@ +import { Page, Request } from 'playwright'; + +/** + * Wait for a specific network request and log it. + * + * @param page - The Playwright page instance. + * @param url - The URL of the request to wait for. + * @param method - The HTTP method of the request (default is 'GET'). + * @returns The intercepted request object. + */ +export async function waitForSpecificNetworkCall( + page: Page, + url: string, + method: string = 'GET' +): Promise { + const request = await page.waitForRequest((req) => + req.url() === url && req.method() === method + ); + + return request; +} \ No newline at end of file diff --git a/client/fluid-player/e2e/functions/video.ts b/client/fluid-player/e2e/functions/video.ts new file mode 100644 index 0000000..b3d8250 --- /dev/null +++ b/client/fluid-player/e2e/functions/video.ts @@ -0,0 +1,86 @@ +import { Locator, Page } from 'playwright'; + +/** + * Seek to a given time in the video + * + * @param video - Playwright video locator + * @param time - The time you want to seek to + */ +export async function setVideoCurrentTime(video: Locator, time: number): Promise { + await video.page().waitForFunction( + (vid) => { + const videoElement = vid as HTMLVideoElement | null; + return videoElement && videoElement.readyState >= 2; + }, + await video.elementHandle(), + { timeout: 10000 } + ); + + // Seek to the specified time + await video.evaluate((vid, t) => { + const videoElement = vid as HTMLVideoElement; + videoElement.currentTime = t; + }, time); +} + +/** + * Wait until the video duration has changed + * This way you can detect if the ad or content is loaded in + * + * @param page - The Playwright page instance + * @param initialDuration - The initial duration of the video element + * @param timeout + */ +export async function waitForVideoDurationChange( + page: Page, + initialDuration: number, + timeout: number = 10000 +): Promise { + await page.waitForFunction( + (initialDur) => { + const videoElement = document.querySelector('video') as HTMLVideoElement; + return videoElement.duration !== initialDur; + }, + initialDuration, + { timeout } + ); +} + +/** + * Get the current duration of the video + * + * @param video - Playwright video locator + * @returns video duration time + */ +export async function getVideoDuration(video: Locator): Promise { + return await video.evaluate((vid) => { + const videoElement = vid as HTMLVideoElement; + return videoElement.duration; + }); +} + +/** + * Get the current time of the video + * + * @param video - Playwright video locator + * @returns video current time + */ +export async function getVideoCurrentTime(video: Locator): Promise { + return await video.evaluate((vid) => { + const videoElement = vid as HTMLVideoElement; + return videoElement.currentTime; + }); +} + +/** + * Waits until the given video element starts playing. + * + * @param video - The Playwright Locator for the video element. + */ +export async function waitForVideoToPlay(video: Locator): Promise { + await video.evaluate((vid) => { + return new Promise((resolve) => { + vid.addEventListener('playing', () => resolve(), { once: true }); + }); + }); +} \ No newline at end of file diff --git a/client/fluid-player/e2e/snapshots/baseline-sv-grid.png b/client/fluid-player/e2e/snapshots/baseline-sv-grid.png new file mode 100644 index 0000000000000000000000000000000000000000..1c424044c29eeb12a2433d73e5d49992177d4174 GIT binary patch literal 490589 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

j7;J|)@) z<=+AN1HkPuWF255CZ6P~33iTS{x~CK#ZiGffY|^jz)=)oRd(TDyxq>d?9CLF1xVf| ztnEn}PTPKL<%=rt!f7xc(~B%`zD?r^Cnm3x!K%m=|_wohmrH<*JtFoJwDOJnPcSq zVF3C+F>>^1-CHyG`v3qS07*naR0GP@28eyHzVea>IveKxN(0O&O~XI%dpB8d`|~swGAx`27>abRyX+k6z2+wCKprP8Y(Do^!?U+p z!@=L#b9Ec7@shu_;S`L{C)l&bkJ(3t9gI*y7v5jM+3y*n)T*EiXw zj3qYyp08Lx$0V6^DNWZ6Fa4XnE%vM}t}U{XMT;z#oN&^yQxe`i0zZ)n$)tCh^%KK- zLG11{zzs2IHQi01jHXGcSrA~{_#^i{XZv=yI)+XdZ^>My&B|MCgy*V}>za%J)2`vd z`=l}SAl-S&G5wKTSWNp&02^Nr;D*VE*;pS08H=ulr}p#=nm=j$e8S|NKGDF2oRZ3?GQam5Z%3RElXR z27j0)yJAx5m%|N|8mX)FhZ@lTcv((%F+Cs$gd29rZ+`Q0XqgchG?|PE&P7I*X;pPu zNO=HqUTgwq$i`qWh*@i`RnXZ}7rdpl%MRnu(s;ZHkfxTRs>rr(*^Xv8&5pHo0OVvj zsYG2VlVeDZE0Jr7X|n6^0b9LtmF3FFkpgVz-uv|8zyo4N<_z3`~FN~m1# zPK71Kq&{QP*w~XLu^qY^n`E8MOy2@y1m;NkBt5bcN$0xH`=~H-bo@l;%$df?aFy#L zuqX-SIPVY&wsaU26QXWX6lw#?Ws|(|#_Mdsl6tqPh*jWuj(D<`SWpz_)`I7)2*)7OlMahto4y77m^7yz1$Wd(7 z!V)`U`6BLl*dqh|6qlK{?^qiiFA+ciI_OHC-1Cw^j*ir0I836(=fGgOkVH`crsRqf9Ah>T(|p#*>V=D}ma(fn z0FtpWCffm!$;4P%4;9`H6yx~yULn9Bkym^&n&tqYWLVTWfp} zHk0CGI%~TC(5E=;6{VVBb=umq9HZs&7dBbb0CaMG@5A)G6(C2Z;a;ZtdfjMA*Tl%t zgbr_NRX7idx6TJAUI}Rm7q_gW6p$wDyaomU&Lqi;@Od$2^#A{r&S=G^m{{C$Xa{oQLnWDlQqgAK@M zP7=j9fI4!@33+TlT}h*Bf9A+$d*^fiW>3w##O`ajhDn05N;ZI;M*BF@s3~`tRtQ)-0+*;Dw z*9cw;syI^3@j-Q~1)Eq-ey&cmjh-q-nn~=MR)z!d;qK# zZs43$!q6xM@ZuUco{@4Vfm#B$I4?{Enj=X8jbBM;0RS4awM=`}E1OH`vP;e%ShT z50ZO_VdU5y-?6FPuhQ(xunHKIc|*-Mm{(~%SAEXf^GdjHiRZqEEqMGkTe+Y!=`zKG3CCLIaeD1ZK&5Hcsr+~(f1E%T>>7-` zc8vdaye>6e*h|zfc= z@R7-0m!2!Ctr{}w`~YN<&szW>OZWWv2m`p}b0>x~wG>9B&LoS!(a zm!{-J02c8>QnNHM1l2iniB>w+6;1Z*d!DvF$w~QaBTA-#ZC+2rm`)+FEl! z&dlW!|DE1x4#=5BS8Jw$oSSbW;81{M6O=Nbfdt4_8Qo>OceMfF@LU-fCe2Yn)2GR1Qb*9uf~xo7n^0f8#O8+qbAokl zl(cq51*fEeu}1RBT-g~JCM(d_To)%5ag%gB#(`Lq-94>#&u@QarF5IlSW?V;qLC%o z$``Svf7qUQuF?5aR2S#kqPk+MsjbBLkTIYDExj;u_U+q;zfLjU5qbQ4z%tlO8u87M zE?vb@6_ToaQ2Y{t@(3Nf{f$SggaWSuPo5ko)LrtuAV7z3`d5ccV+wa4>mWhK!$w+K zKpD|V-P9-O(K1$a28}XEP0FVvb>OwL*g!>h)`;I^heyntTG7@tog+KPD(H-4CL=~&I@X-S;M_V&G?*NcqX&Bi zq3ZmllVHRsDphk)dRdSsubf|Er!QX$kTZfePt-7sBMFq)V60h~9IoTd>q=TxK$6!BI5{wkG*8k6HOReu1vU`fe0R{E501c`43gtO zmZnY!_*IhW8IIBzV?8hel-MIMN6AhGz$;ufH&#@ddmrFy)A3d)+OTuzzI8JlsDf^n z)=?|$L)?okRFZ3%yk}iWv6bO%)8E21c!5;)-IKK^&Hc2bs z3D__c>OrPu2xL>d3c#jt8hOs0;)+0#JUWYYCA=^(qpYkNAidPKzOvb#-+tIy84E4> zNdW!o@wRR!U2}`?bzPu609IztI#)8iE+(PO&7uG&am=MK(4UHtIF|EyCt+2M!X)$& z7gZGR-G9*fh&h@@QpEKTOUmcuX#%$L9HU9ctuIYV8w7NlRuRHU_mhyWJ#DpPMRXyf zI^K){H}`~OlBvY05zfPdADshobnfJlb7~TvoW$tnsIV|cS#$RQqt`M11wEN!X*#9@u^DNd??4dB9bI=@3Ma48fOekMbn*POovOQ zQk?(*i4G5-`qgj(Ml;J7MCVIBA_TA+B5{mXZ@+ULIZYnp9E_SP%j zcml|A0aQD_i?Ln|NgAlmnH`@@H5?-+(E)L1Oj1O8T=4z)lCT?r%1jy zT)Qy)PyvmpT!5Siuk&QdCHBh2AF+O}pZ3cDu{1Q+$pkq8c(6Jp)!BZx_3hbelkd98 znqcHe;s{65R=@f)D}CnsHn!pY_R@-XS~p|9Q@AI~VQ^L7`8kUp+G4%e|G?UcR}&9l zp}+(!AqSmis$3+$*2b9vDiAn>`()MNVWd@fU^L{I=F6Vv% z^ihZ?!G1_m$GYSmSMzt0Mgr(XFCfkMF!vn+|2~j0%C=X zz~zCJWgQ(jhrwb}Q+JYPN1D9209L|)L`r!2@vl(~6+1}&J1dsWv*O~Q%NzFXIcEOC zDm(41Z$Zx$wWsg751WVhM<_pq4x zyjdEI!YI|KEO^19E236`yG!=XVdE zO~N$7xWFvD4H(f$ab8whZT(CfQo^F*C_XjFc)|+Yx@vC6-)j@@+P!7>?^cI82YWPKg)cWm??K~z>Nz?Bu>2ciTS~Q z1jtFUcN9X!WXT|aHZ~o!haS4i)}OV;RxK#9;r4#0pMDEfG7Sfl&=-oDC0tNVS3i<282N zJ)&)WdW@ffdjj7`z6sR5n+XpH*}l7OALYN1tBR$yKiD?2ZZ+T6r8}0{e&I)=SIAWX$+?3zc*toj`WuziW!u>J`h~nAt9*tgRj0&R55I>u?;JPW0eM7^ysiU;jNAIo>tX zJ?n~efS6Iv>0Ng{0JR@R&cd)=oX^B6fO|=6vT2QvQXo9I?go48jQ1MEe+sJ*adgD; zV;F5tW-c;yy*X5O3Z-lc#w&d7JlYNE&NQ-{B98wOvsU)6lTzEuv$ zBQ^-@q-D>%BxZol|Twm)1CBZn?D=E;7#^I<@{7{}2Qz<8eb&P8r@;n0ir z!K1g^qRv;H^g?5JQ?qE^0N$qw$U$B;E$Ib-PCCpjkVB7wBu^W$S}+I|_^G|k$$r%h zhv63;LgqIFNTTfpASWjebJ8N#PGKJPA51TmP>N65J7KL%!9tpb;VHR?7eD;gI8bWa zj zvdVzfnHwknTXHMqB%TCOP)w8qp8_yG>-lvWA1=JWwq5d3>*t;mAdxXG6K?KN7|uT8 za)|r5`sH6*eEW0O_m0m4jyE6dP~QHmVWmaY&Yxru)rXEEYoPJm2rDye*Ys@ zpVDvb@B4=B_AyQz29M-VISeStRQ|_3G|BxF0hlOePg}O*ZaaPZPwax43|rAqV@G?V z_T4)lhoMqsmtT1q4Cu3A!QsyWKsdoV6CgT?FHkA~j~HNaKpP)>pw_Q^tpub@j190y z5;J6=$@-c=+NCw5wISwz1i)vKb9nGzhjn%^DVBYs8o#KD@_F`)U;fV8v2Yk4Mp_T6 z^vtzYR##PFzx?&1_*?>HK@DEXaTa3AJPD8%M7}%1V3GjRH8nG3$}dK|o1DpeWHZTD zzwf5OFfD^}epgmbE?-&brm!|O_8=_{*uwSen3OkU2exbjSBlU8L6*s0-U0J;f`*F5 zr^htqPVzbKgG}B}>^*(306Dk3L~CmckX4miPEig;H=&H^*kn`Y5WJED^tQr#xDh_ho(}#iSFayQu7%NbYldy;JjZk;CvkSVS zH0E@4CBy1x8cJShn&4PNx4YNTmKEqyeRQ!I2^=3SA?DNR^2c$TFS0ci>ug!sA~F-9 z(wcvqG~Cm_>M$ih1rN1RMVBaE622bpS2FQsvJ;5+_AM{jHca9!zv4VAp$px_VZ`uy>jkXrhs2ELaH6u8CI@*vy2&kcm=^8=~MA4{8SmVPaJ4JZs4A@~N zC`ITVrmLgD#H!N5Y=^GP3@yyb3KDDw*&rYY@Dbv+^0Z~nF<;5&?j!BICI+f>xdo^s zftP7@1zcB;#1VjJnseYrGIJawB=2(C*O%lMV#{PwND6&-GAjTb>5TQ?N*=lZmGaOY z%Ts3zFiGdcX>L_;l03TvgM^dR+8NC{gE~5@AHMN#t+uX;bK)7Wx#Tc$iq$E2J;Uig zpmKW14T&Ndh~!n`{bR5GU*$J*O$@9{3{>&Lq%i*5^#iKP#)AqF@ngG@}Lm`nxW!k^)aHy@qRl{%Y& zobx|*AFLVj1Fi+PFW(+>MF5GDEhLy3x>hPPlB6m}+)5;+Ncdex&GQ%bk_*8SGWpaL zGbKN&AE?J{9>(9x>TB^+LCQe)eORu9Jg)~3_ZTuoO>9$2>-CO35J~@~x0B>aKaT?B zIBy%6S2EI-kzptg<{CALJS)5@YXWIJIcFM-6bICh40)14#$q!zRNrpdIZ2@B6D7&v z7=>VYITA=dP|_zy|7uMn|Lr4Q$qy_GbO;}SqJ)q zz#(EU-APUT2tijbLAn(oHUx>snH1Amd@H%l48WjE#2HQD(D~`d7hsIfnnk<{PnS0=wgD*al9mo3SJPynVUp?zj#aVv(T_pb zpTV!$4CExuj!zVZS}R;mv0_GG)7*LY1F$Yf>?)*H7Zw2&FkMi9L4bQBPON|EoEz+k z^`5jUgMuK)wO-%!du!;};W1${qEo06o`4L0DL zIImITZu*kQX97ZKo{aS1*@XIVXn_40H53Fs%b{NpD$g`OKtzCbt3A^(A$To~HFj%D zqqj9ZY7&OdbfIl+F1EvTy45xJSa6;MSpcSrJ;k{J*tGGnA&y&}b7CFAP|X#A&N}DH zPn_3`^Ty$uyhqFnHLND(Nux5E=f$-)xz`0Aiyb-1zAnj(JhB!pTgeFFjkfHZ3!HD% zHwb^-YT(p z0_m89r~-a3n)yUSwRUa+=zf704QG*KtG ze`&bBxBqzyKYFYEG;N+?l5+kn{rSi3qIrH8dpFv?jCq)ZbH9?C24SV8 z5(CDG4FZe;6B$<0yvOF>`%iXBMz5`D2-(W|QajKdx8KnC944vI@m5w9+JZAz*#(zg zh*TD%Di}U-?$tDEgcNe+xY%ugsAT5=ku1v^t^Z@ng2U|OC@MviB?onn8p;M$p8wR2|2Gkd=O#JkM_IkVA^Lb z$)}OW1iQSvVv4m9TZAcUn4)OMOS`N*f33?^Mn_ud_Lkc6s?)6|TrNVdn|$H{Ir{Rt z6OIj%C44-)}D{Oe00=jfGtC?eEhKo82{I77hHHc$Aea$0Gor!SSm%}Ad;?w z2M&XJr&$lvtyFY0U{u_A{0M-|u#;SMQ(Sf47r86fD;s*+9f8TdzMo4L@^o614L>;lS?GFF7*9_bWbu!9Lvhf9RSnEv>N$k zjB~z5HQJHnQ9zCoOP`n(ysno-rT|{ZNSblR>=2%$#G8Djgj9bQ>t>iuvZ$!&#FQ(Y zJb7G*jgah~PqS%cYubgnea@U<(yqJy1Gac6UMHfXyRqUry{b4}Y5clC&L1of$4H=} zX#fBq07*naRFF_ItW%)Js{_Jj80^Q~lqp7oPutP1PB!-%z_C0#uydykBga@!-(d9% z^D%xD7{$Z~_BAm8`eQ>F+Ev<9&u(%o@gRk6AQ;EPry4-3&uzv*HusM90Xuj7!5Lkt zvl+;_@{3P!e@0=$VZ^DtATc)HNfz7&?=kQ7B{GNezu|YH1bZDE5(Ad4bnqf(xe=ne zt^z?=i<9zq;{MU<1n0mnCeP-Tmy%#atQEP@1n*PKSj>UAAC_7>W`F=ZC$5e+AuS2( z1OYq*+^DN1igPOL0zb)_B!^+Z)d7+zb-eYZ`&@oce%L5V`1GaZSxgWWRQdTK;#H>m zoeDEOUdgloiSF(J=P{5YQ$$`vNu0iuiI0A#b=coW*O275uWuBoCCL|S|Inf1$h6+n5h@o@q_zq>%JE2;iKq0 zt5cay9Fi0=NAz#vh(K{cYomZpA}1{>FSPQqe5;*Tj$~<=dp&H2VdUKV;#LR@OyVF0 zGA_}xnMTT_lJy<}gwF=N)m05}u0wc~> zXSBJDUt`=uPkw6sjIP_+4CJ^~k?7t#P)EC+Bd&3OagFa5kV9<$%j!(qSfB|x-o&s> zvCrrfKfK|3dz7hFV}R&s?1Oa_^zVH22X@YppIDI}K)??e$~`hTU0^?4_EG!o;&%b| zGBpNvMs4({ePr)fZNummyMu{Uw^ZPflLj!t|CIpbT(|pHEA7~7-#zEcwl}wd=U^1d z9(~Ek)AldJU$s|*XWC8vYw_iP>d)HDjP~2#cl^NKb@b;HX-Iv!=d*(BXMATMQ%nai zOa)v@<-XK7axID}jq>I`qw7IYBbZ2lf-o840SM^$U>pz!uaRD{9h|}$c?NrW8Eb)p zFkJ%^1jGOeX_}2ZsR$6O zPX$<$9;AZD5U=TqEDwuz{y0v$nfP{w$MWh@4?||d&UDyovQLVo!)J@Jj|#{U6G*bf zqVfuxw|u#saq*k2YCeq9zIK{LTn`0aWi(tDF&(BghF#;{H91n|r}|faQ&bgei({FR zXGn|!7Gr70!Vy3vU!FvKQgh6Wb|+U$Ve+V0L+PPH56HRYE(hfN#buZN0g&UOhc;PV zgv6KjhdChUWXQTL!N^I1ut^|i0#-;;;*ylY_W^Xv>^R=vVP1)^L@32F;D>*jUBJ4F{&#^#lFuT}E z{sMptg~;)izWncY-qHK*>?Jw2d|`#{I5KFzc<@!wk8Bzf7!~s!A-w{KaS#Dbo9AkfA7_u}g#7uU~IM$=s>Du?jc9$2P1_ID{4EY}v!tHiuK-vY2_WX~XWlA2Lb zfW5wUYAD#M6qm6mYsckFV^pUk`*);SXj$xV7Q%dKoB+=!)tFUpHV5R)qRTPUK+cO>R?$Uhw^D+U#`$VQZ#$jpyn<4z zu9}bDmqL7K!W9^C61%7~3sg0)qz8tH3NQ+A$}cBT7=v0_j;yIdTGqa742CarBXEx# z*-YXzY^N_h+bS_t&OpoV*c|FGD}oZl97yA(wx?7q$)6ME$nGy*H!dCe@*%(ZtVkS>T=`J>dzRTRu zPXSa&L6(ZHf3E-_k~2vUMA@t<4_hfytfpjkN}vtWtxqRu3uA27(tgyIu3lpM_8-O= zjgB>Ws*glU{x+4BmFRdoT&FXipiZj_gh;_ zkG=aHi7w_0t=HKMEDJEi+wU`{7Msy=@SV2o-Lt&1dUN6*#kdw>sAYvRKwK3R2`F^V;J z@Zb@s?*V`u;s>|4GXm!|az)SPdHQdS4%aAdfllcpi{&PQC5jzR4bW zVW+iV60c6Z8gcU9$%VmJ08=3#027))oX+4llC&&7$3oUhegS|j6!aKu#$XWB^*u+R zxnusU^T)AulJK4II@Zb~WV*|I3aF#=B-xo54`Sfu<8>onlPu0<4qe0|NzSOWMQ=|9 z$Qc+IaNvy2hs-D2ppi%9Il{RV14nUPK3oEFln6`4sdFx7RCmvSvo(+;CzKPkGw{gi z1K@9CQkVR3Wa=(Pj;3*qkO)8j0IEP$zuEIbh}P}T@wO|Y7lLQ+%J1ly=F!9AD4ns+yGBL2ubCkBuc8RFRc)5$|nEKL@y`Dq?R+Zxk2f+=MCtLjuVKvdEi8 zW0akk(*Zg9Hw-9RHLuzhtXXU8FL@i_yA0MRiB0hGLk4Sd3rEWmC1UN;)-( ztTT@Hjq?Q2y&!)Qm^!gRfE?IHyr*-x)6^|VM>xY8?7&=R;sz7;kaG9{a=!4@&34mw z?sjbBzet!JyWk-<&g(F8^t(B;QA(0mQ26>g@iuU(>OpBMFx!Tg%4^shKGLcNj zV4+BcoyzbL`D0Cr%?nd0i#;{MZT-7{zX#b6pN+h=Z#=~gwM4C}pQa$|Q4Q2oYK;n} zFVkF)=( z5u`nBikPGQ$;pg0UY(q$pXpR_ny@h%6&{d-q!e&R%^2# zf|m#A2uzry+xys~_cJx60vc#82_yxh0yKUd6VU%7Y&s)oU*&DF6Yyr5WO&7@HMVQd ze!AZS&?xEB;ab15Kqk$-_WE zPI*xYn&44u={RO*Z(MIrKK%@za~yviJZfMz<+Aaq0FqQn$aFGasg%Z7$uzJ&_LB;@bez(f@{;!zxq-KT|iE9+_=t(ewLg7#*3f1@(hw!G}KeA*3Wp`LGGcVyhRquT0rp_fMPm|&q}9F zK>Zy{9|2_RMaqW1664CF(08|P*#%py-qxMAZ$?+@YzA_^`cSVmGEwOW{wDo&k5uT3 zASL|h^-qH<*&10Oqw#5Dj=GbPhSvCui$*%Z39 z#FGU~;u!+`ZbS-GP*DvtsKX95cH=jNe1#Y=MJ(!oK@@d`q#Jzf;ohG8ki*+jCEX1RLWLSPT1+bV(h(iV89K3*z5^KVkJGZ)c6C`m|%#-o+SYiaTp7Ta)?*XriD$6+6C`lm}~bluKo zASW499TlE?R#HTn&8D(AhXKzVkORH9xt~==D^J<#r#!b+dQE0cV5F_Uu7G<2RWC?ZAR=aldS8Q$Xi+JaJ z$bP)wy#P7^h0sq8!Zl+y4^1S^^&lhZG#!~xI-t_=E zHEu6W!)N0&eLuAuj{V3c00L1RV@3>vrX&?F8+qhpu^+QHQB2CO%1OvrQ}U9c>vF=# zT=sa5*%Bc>0OT-$hWmy!hOJJJCQTN`_i2)i>4EH-YP7hCO&W@&0Rc$P1m-CAq-BHv zWv6Z1p8w6>dxuAUmgoMDG@2Rp-pi_NUv1y@dX0OxiE#l3gN-RB-~@;v96|}b!~v4P z$$=1Z4)r7uV`B^^V8F(GZSQ)$Mca2Jt$Obx&5Sgf(fQo(cV@ki^2=Ykl;0)!(q*m6 zl<)U_pZ9t0=YH;+5lUW=_Jt=7>J>tYadNbYOi@rV=Ard3qlOI5N^LBS2F|+T&jWGv zJr(E+#3!LPI#+eQRQS!&knr{)kIC;#6Dmv*7@=s3V+rmpFBBa*@Ume4DOJWVo@#27Z=e0f!%pn@me*a!V<;|rIIymX)}IEqc zHhA;L5j)lm2r$+-V|oAl39|z~wQ3lSm2y}Fv>RG=p`E(rlh$2SVPVeW64u-0r=GN- zZ-2thY`Vo3-u@Y!uLMlStZrt&{&@6Xt$Mb@zEb{XJCTnufn!-M*d;wrS?s%Cu+EF_ zw8`t=YhliXIFGk^_>|rK%HP^mWg)9?thBvH`|RQ0v@o8@c?Ar)y}5}TQou#r)~#=J z(g9t4rdU!pvqp!MMwU6`BTk#fk1dqp(xj zj~v2Mdlz~%r|sa=FWZK-E1i4Q@v}qr+`e`jhW#%sIe{cuyv9P9ytQRHNFrp|%2f@p z)d9EwSLB8}4v-V(Ocjum4Upp(Ls!o&RoYHW!0;~06wW;L)g#2DtDX2HnO-{l};y`r{+{}-4a5GMnc{DMX> z0c_?N)yhcPqRjB;-F_K)E93t%)6CP(m`@-nmiPP=Y&cnqiAahO6`06FO}v8t_N z<4%AaG;(xa{0E~|=O3=iK+dA38cXWQmVullbUPLs$a&$wHV$)=6J}|Z;7^Xn2sRQh z4ng^=bgJ*3cy1;-CJ3GRvH)|WTOu$AA!H7KihY!GJpkEK|E7{nwx()5on8XGhJ)2pax0LmOjW2W(*9#0$1y@Q-_4(ep(^fu;c2Li zIaX7Xhf74h6C{g)zN7;}4Wc&@B{37F_zc=Pe9IaU9qj6(d)$qC4PCep?ZV?{I^8%% z72=~|y2z^eGNli|d+VQq%>w|n0yi6V>*f9w<}phcsalN=PlSU-K+dk$TwsTf9jC~l z;G@$YCE3cMh*CFD6i;;oqOvA+<5d_#YMx%j8P`PRrsr6NONbkrnsP;QCJcs%Mma7JePhJlx6`3I2>qq$qJ2u^`$4#;r~9_jng{g4H@U^Q1{!mjXlS=;!tR@r3EwlOx`V2#x~tbO9g zj(ySD*-K$daaoaVbp;n7qIrR%htDCVcck}_9UD519c3m3ZHqPGloZEKbqMCk&K(z7 zQ~l2tb*C<6Am@vZ_L7jr>~u$mbq&Ja@JMZr&hJr+C1~rpM!6|+0XE64<(TyRn{Ar} zaFJ7bOc1x1q<*g$8kfI_4IkgUJ?s%GnbtZafx_00+;p$=f^KjCtkJEfbYmtP;_!Q+hc{-t>2atfxury|vG4p>=DI zwzjqcbmUtT^YgMb6$3}bo2O5GV-?AKeRZDQe#`aNgxKN!Jx|(8 zEv?p0hCWB)rbIDF!I#H)R2Cr1G=Q#3_d>dim6fG{NVQf&$Go$*1ILPSE2(O*r=B}( z{Uc}#z^q8;y$8|X8O9YXDxpPUV}fK}9YiM)!s}OkDXl7jU1H+6aW<+wfj1fntAOrZ zQdr>JrE;?oex%@@jm|qjSl2^^taP@90CHxCZMud6pydQ6SC(wX0cIJeQ#aGQ&NzVp zyw0-@Vz2-uX1;ApGo8#48)UR<3Lwo#Q7rN55QVhX#Ga2|v8elYDFZpF3*q9aKzzrD z(B_mzPQo61_)*swxv?tSE@UD>-E*--#Gac276Ivtm{swn5e?$30PSqp zMH;m%fUb~DY*djb`#&|LA_TEMKu&5@W0{fjYREbt$Vq9k z&2zm4p;7kLs<&E8K9=_+1sQ-6n?|0th3|jb`gh-DBiFshW_aB}MA6p{ zx7!;Jea&vF97U6+61T)I``2d}Ux%eviFO^w6r#KHwq+w@Lw>ZZFb#=dgMQ#dpPgy# z!Evz!Js))IFgXqOnbC#670Eo@?gIVHxS$pWaH$--_F2H-}mGbh$vrYKmF08 zu$8iqI#>a-H^=&5#qT}TYrlEEg*}WO77Q3MVT;La)kF%SyH#6L>a=sF8P8I4X@=Z( zg2sW^vH9#P$(pkEf9+H8qu^XdA=;r?j_c=)4HDaRyo>Qer8_ zoGY1tJLTU3qha;{o~sF^yds0K(=6_Bei35JobkDJ^_Gwh7Wu=%)C6N>j6o_#kvJ9;YZDV}q`K@&@u~?)PA@)T*}bvT_>i0;f{BcnX+u zsdzH?Nquj5v}#dPjV1MD%RtT&x*dxR+DJ5Xm~XsJzH7+_lq= z9y{a$UuRbvhkno+>epBs4lkjpD8-N*BS6ieDyoW%B39_SLKJ99dcOW-Ucm=2v@+G;MLuX>|i_g*Zj@YVI*ah>c zq9cM<20F`(V+>d}MQ9bEOY0e4Ke`)P*y2u7Y_uFX0UMwcCPNSglGp_E%(>R#y3*?c zb{(Dn5jy<+qah0AQM&y3bhYVn6PVLUMC&Rmt+uM#2K%sJ9v`r4uDQaFA3tFo9bM=M zAx6jnT~xyB(IwD`6VDrizOI8M0$8Mpv@o6jG`fg>IpB~WiixAq1$~OilLe5YLRCeV zIzXagigly^tBWq-QKxg`GCYqyst^5*19Er`37$(`JB>l8uzvg7-fGQTHb8R~BgfMx zN?vsb#Hiv==@gwCb8}DNp#ZNkc$CWPTOQ>+O|D0DB7Gc4E!~e>dTF=o%1#aDkhnJ5 z$m~9tP2KKw4#9{hVHWuEO>eM5+YYdH7FJY?ZM|r%b@m@8sg^~oD6?}gqxx*!n(eTl z7Hs9tA1vxlUCKbtCm!r(?J`C{SGfA z#kd;!vMA8{zOx0E)0LPFuIt9yLX2HsSEEhkjhT7z#C4vNab=i-O&u{^pDKzQ0T&$r zVr9J723+lw+)40Q;}QW1QHbHrB}4mCuhCg?^B#&Att!e3+AXiW#;Qn0k0880z|8$r z8g3c@KE15-ChuP-u31VDQD>zH$HnAOJ~3 zK~!7z_ETTAg%L3>GiX4}TTvP20a?5!jrmG}hBMFST$aS}_1t3=ki_bBE{t-Gk{~kd zt_Wx19C1WvQ-<8GX!xX45XyT|XOq{+(b%GN`2d`WQv$GMWt>%jzFkHQtb#!RMaH~{ zS#oX6D;U^shPdqIrcC}*r1R&LMpeRccQnDG(Y z3MIHsu`Qhr0Vdj;V~nJa@;KAP!Ws7btj42g6y;OMUUkKV)&QGe>(#efaakoUfHaXP zOkH$xl_F;|@j*^hV&)`fVW%QkO$A7iDZyy=qTDW}W(4SyfWag1P3~Me*YQtxPFAj! zB7tc!qq*jBs?tDty?yeF2ki_0@Ds+}#mGVI*x8sbk5>IxgVOn$$;JvAcuv0+vXwHQ_($_S{B?_7bEnPR@j;tnL?;2DP#@{F_fI@( z72$6C+p@dtNPd&koeB_tH+4T{iGTX6jbD714PAdPe?ypn?YwU6l-&?M zdwSnl`_*%Z>;t+4S%+(BPVC;^MBHc1G150re$hL&U=RHAB`d@|ZXIJ+IS4A}WhHDa zV#y6_Yb{vE9%LN{B~&gZt8!22=FlXLa_)=*RLsM?JG6J7U47{;wyoGP37g=2A0J15 zZ!Bid>^VxqVHR_gLUe^P(bf!bCe5%neSo5sR$7d%7kfhj|8_BGdW;WsFt<-mtN;J^d&@x1 z61u004dgt1pqXR}#dc;>hp+>bJ5VOcjC4kK?%ay#@o_ia5{99ZA)CaQgh-*zgDQt6 zL_1V>8hRiJy^0*?_TcEqLahNa%E}#cr=hgYX8K1h2XWNvF1^8xXQjq-oRF9tC|rX{ z6l#YVc-7~59}Y?o^T1IGG7v0|*`8;gp-7yy?K{>GNa^m=ZJUMGIE4;|4_apqBL)S* zd>ci_V{mAIBC4FxiasoTyR5Ks6^T%`wVv*F;=ya7j}8p=JFSn}`X*~_@3b`=nqk*~ zrcaJI>*Og$fC2>d73Ba&h#wz0dW7O-!fv?sYG(X#_?n({ZY?8YVFZvXam8Z1h{P@? zhQh)$*UpFF*_^ZR6{ASPpmQXwQr*|}8yoioeoN4)kamYB+6H@v*Kq!40SAYa`1PSt zD-~G+gHnlxD~P$E^K=R`G*ctj9S*oZddJ(WdFw_xeqt6#mq;He7L+&sa_-;f?!oWf zh<|6lctX^CkVLlQpwc?M-)hz{lgw+ZC@80E7_!5sUxa1Ax*4XZ4VBpX`W;rcy3v09 z;%{s?I$(F+dLzF#0(i!CuUcc{06Hx%_t=WE-8hP&IkffTi@H;nGLZA}M;NW@kyDs- z8(148PipMT-cu|tF*Q;^j+=)QsKYXFnmF1%e62A=>EmecNqkd`4hO1Iz_BD91E-F$ zfGYH^GDv#Th!e63?-_=D!Dyl!S_m5yFJhUoMpct|HJW>FeWB+o%q3X^g-{YC2A{g) zK9Zpz>s7j1a@-O-P05iKQ3}ja0;c3i07IB{R0udB28q_X^l$W$auLzqP;w^FL9CgE zhPrbgP^w#%V){%?O+j<^bY3be3js3(P_Fmhld$> z5(5O3NtkgyBiqIh^GG8`J-h#i9XO8u5Mvh+K$%Pcpde#Py=ebH>A0gt7_qWo+DRpeb7+}6S%oQ*Q zI=Z`^uww~-J2o-G*%0DAXF4!vp5Q1TJkIln0fRHR!CM)v8iwI8LoqwSD610q0rbG8 zcpg#IU-`lfi@I-@GLZ9XH&y4H#!^Mb5#Wha6MN{PhkpSuI&C-A<=91xR)x7=F$rC= z4yTE&2X1(eoxJh`=xZpRGir#y|DDf%*)BZ%fR)m{kQMG6VBBOp!ya4vdi%-6pM|}X z$vT7C!+({qILku))>TlCjt(NhVr|B-;EkTJ554#a%cLv)xhp?or}9@@fbRP&Y~8D| zEB{jWr|eMHHv2@~`)tBj0UL+a1u*o!k?+~vtzWeaoC)BnA!Z%ys4kdx(`p@dleO40|k%I97-woaBTB!sJN5ODtgu zXeXpfw?7O(Gt0jdutf!Ui`AB5_yzcSR-Jb0$OwC42A10#e>1~*J0n447sxo9*>`I< zY_W^4xyE)}d99U|SMj^Ep6gy`vSW;&n|KcIL|9}770XetcbOVp0d!c+wOj`lL z-q$V@Nakom!Y*rr z@%|t{&e$J*80R^JyIIe*Sj`8%|9MM4`~(dXv9n;`aNkGjH`v%)KW<}rt5~N1i3Ewl z0}tEm_y5|;|L|Sb2{1FunJmIxC8Jdz9sQYAM2GAP6?fR-0s%SfDHh?T*2iu3hks== zm)vQi*S*6g=d`9`);!i??>hP|yQX5?Drzh2xxH=n)C;XnL#-&^Z`WM1%?k5jxTE1C z5G2Za>KIS6fBE?V^mB4;9dZL%G->i+&TUv%Z7WvST2@U7XH3YZdWIY$EiSVF2?>*H z$n`b{{ia|4h_zUnXR85zq^{r?<>V|g7#jFt%nXji?6F@RfWZ=l=~~D2Kx#l5d(;>u zI6YS4pechDH6^s>6;lPYrp!XLH#9=2kzg_KBsJhhtCa&KyCAOlqi<+bQAjYaL$OGk zRyjw6#*Nzxd`BYbYF2uwv6z6KXuH5tNg_yNE>K9#gd>(3K<04>N6qwpd0JLl-~YAQiv0XaIoeKz}HrO*o;LWC6pHH9-Ie|lDLrHXG^T|k)qc6&;P#yhTTfcEL z44!t&;!vs1Eir%CXPePa@icN2T$Mm5ar3kvG@I`J@6wy!{cySh{LsyFi;)A6^Zc_< zBX%6H9T%*(m=A$XK$QeRGJs);>Ty` z01Vlt&1+pJIYdI1i9L8b;~aO~{WgROciH>|<7SALg|OK@e((SZBD2r1Vh*<)0$m@s zt1rLQjiG4VAe$NAVa5!~s%q@evC}*zuZKe-!a;?%A)Sn zr3~c!j|aLCJ06gcEL(^!A!}n!LZTEGQMy6uYD+&wb%H)scw~~~`<1+lCd{WCUsP;4 z098G23FRvBA(6}y9URT5#(JFW7*&c=yeB9$Ct&M!z;p}2N)eFLPh!fq-6({B9FG^{ z0XbSLn)WFG$Waj_eF@Js#b&fU>gw)-$BQ z9#2ar*`-g89u6@+R0+`HjWv2esAH+IzdQ}92uT%tj~b|=f=(KmFdYCcbybB37p`ys zPK;zsYylO^nEJse0IcS@3K^@=2v#B8d3L+aOpe;RmG#b%WMX8%fv>`Uqz$66B8mTs zjhD`QlyG7QpjTIEp2rh-ORt}6O2Ng5)g!-t)=qZ7vXdT&b9jcWM{%i9rU*%&ihX_R z8hDL-vFyY;V2`WFl{uaZy$pgrdo=rY!ffWK)wfA)HJoMvV0F2JqO|@BeQ8A;qoKy6} z*{?oEG1Bemb$@ED*WYKuJ|GDG-M~F~(=%VO9WZUmB@hpgBj5vd6l*EpY7boWaXVOe zfzz$90IV578Way=lB6;Itb#v>4SZYI%l4MNpF?1?*gk*JXYFX&CIBWW^3K}jp}qFm zqo1~x+-CdB4S#B5zB>LMHVg&U`vxAe_q6?;We$xZyea@kj%lnzUPl_6-|c4aU_aNG zagN&})S&Y-&vP&Eds&DY7gRDHfskmL8_DuO9*LkYBput_cma>2uDjf*)J^v%ZTHlC z@dJ7?1Z~e9&%iZO9rqdU+OkLmTC4F9Ml5xnbzaPw8-$Ic4!T@_GGR<4Xt<1_Vk8S{^3H z3FKASWjEev8!ow$vv-Z9&$pQ`Hpu&w=1($y30M^`5HEYE&e z*N#~23R15~j$@&&04ydP6*I5Fp;zu_zT#T@*q4vkm%jUJr;&5p>i|`yx1-yV1aCZ+ zt#`7!5h1?64CK5TvcA*y?Q>^L3W$~Hz1E<>#FPnz?#Vc#Rr?$xXV3{3R|4b|v!+WC z(l6jVJ=`~K50zYQp}RiGerBC>-)gWG4}AC2=0Ebdl|sIX1CnO3x8{rMt?TVyu->}$ ztQVMH1pmq@0Fsk0nZIeh4Hc|+;2sb#aiHJ+V&qW^U>@;Tm2b8Kd7GVMp@5u?XP>gU zAO59HUi4-g1IP&hax(mD8^(^!( zm0-{eK+33f<0vN}r-WR0b$KqiE{z&MpUus+R)xz{5GMa9R^l-lnFT8_AYqR&kO<3% zrV;CX2Wlj=F#1fZe(aWK_j&r;8lAbEw}sS_L^K2l8_FSPz{m9)&rS=3Zx zNj=#zkh6qt$6_;bzVo97iay2xLPNG==LXxdb(I}P@HpVF1<;wco}NBODW1S4aLuZf z*n*CuL($`09%QZS+*zU=8FFjTtP~$AW~41Kt4=cojgREwqD?z(ck?zIZX1HuDOA0h zLog{|C>D;>#z_WQ*S7PLzu#47PbM-+_Q544da_AJ>>eaGFM$d=2R_WLTdH#92 zi*j?x%g$%C>Wu5+m&2r)pg2k6=ULD_`?|-h1FP}Q&Q4psW(8Kxe%z&|0D%(L%Sb~W zT|O05xqve}ckHkWFC-}@aq35$w2MQjy}iw;<*#3}ilh-Mb67tTNEHRUqN>)8ojgTB z1CRsAHO@hyL@&%-Zzgm3`o9=CaSj6&xndQhEXL&=BTWD$47vuX&W{|eRFvwyxWmhd zwrSi-*1;5ys!sXv^O|NUB6HAHPzTQE5@1}b?tY7Hgpm`M{kZFLp1=5ikCF55?u*}t z*L0dBAsy)-_@~X6OR+e4%EAkPU$F^*20HyEW*vxVcXx$tUBhM8RJfhQHE3PqX8{6m zJn>ENbDYAs23b&NM_?w!xIS_NShI4a(=({3TGq%(-IDiy?*s)k6Y{XY=iK<*yTxhER zHvAL?Bj{!+5gCQeGQ!+~z?UdV>=1i=mc1_^Mn#cqvR&_3V5=B8yx?MzSU-uB9AETP zb+wf+>Hmrqa^2E6&-tAuB}u6dF>JK{Q$S8CCTQ)aEXeh{0%-JajaLcaShcFj?T6H- zey087=}>8GBEe`?q0@-zhR$4##d;%J0Wmqr5wqOb2k$A1y`#~xa>fCR8Kuf5iOdm; zj%ycXyl7=zm6hh93xnmXPkJT*DjJ#5bpb9D>;y}QPCIcVCdxKH3*(*rYyq46 zAS!aJDk8}g;_jF^6b=H0q;(@^lCHnNoL<&a7(lqJkP*^SjeH6G%doRuz0L+cHwT>` z5`0~cE)sPy3FZKY2z9n*joju20TH>bup8vaHwj1-V*e%p8(#S2m5X}9E>$4s18r|P zcb>Uog0&(bM~*}qn+pMIJouAe0I0#psmZk0U_U-f5izUZgXJ~C-a2&Sz1Dj9M{O#d zvxD7LNgV&fJ)g7Phabd#oPsAaj&2cn00qiKPNDsF{q6QoE8l7Tfg02_XtpqZ+88+Z1z1zg_1 zbRj?v1z|Pg5m+9l$&re^A?#<4k%R;S<4%^1ogxrJAhga)jZEc86kLF)3TmEkGEr?W z0OW)s0xG8*!0pB>*!vNH)F|hQY}?llVJniFs_-0QN)$E-e&dN zu@Xj;E6?9Uv#Hf-dMFRkg>hhjf;L)3X|fn6mmz_I1AWG%cRzgu8W>gBT@+o z*An-IjQPc`;&&1Ph%|mGjhvzy`^Z;Y?aM!S8jYM%yZN=(^N#h`-uQ_t29p@u`9*K?Uw&zi8?CBhw5pu7T?TWr7!WX*F`1DMj%qymIE&I@t;}#fbdUS& zhdcsIzijS)G#?``s9#;)Q@5#UdKTwViM{KBFUOwkoU+o57=<9wpyxl|wJL>*dpXlN z92Q2-J&StQE;Di#_j3Pd&$bNYES-B{iw)#_?VH<3CZWowjaqdb;$xd?pwmy&Jy>lg zPMmZCr2=ijbdAf)v9z3{n+xSXml21a9?*M$g1ISmoHa9!C1a8;qU4|~uf&3MqsQpr z))iIRb-ORKf(%3n=|o5%Q0nkbm&N09oTK%6qgfuReXiS))Xs2+rd%CFOQ%rT^X#)Q zIcgXYz*2X7$XO(E0ubm)1Suq9(EBqehPnW16ws?{YWO|g6XOkq%$`n+M(p&-F2q#N zGD-mJD5u2Qu)3D($^f1HB7R3BV$&l8V^}^{TzQ%8-o4Xle2l}+dExozu`wM)gssZT z(Y)yDXrsW9plKOST6F+Ot#0&1hsq2<$21*QU5_kAFk(sOPaF!SGF}y!Dl}DG385F8 zW#h(84)s3+5Y>kskBYC98cp%DJsB% znsp_hQvl(V^rYzM&rwmO!>ALG6CfE9_?OG5K^b78bfA>94)qNKC}5|FZWMJ3g<`rZ z*2gsiE_nxmLNX(Dx-_Ef3&?Q_82~xbmXITxsL)>5R{*QlwGyu=e-jp9>Ao*uLPf6E zNz?CY&FlS?!mdk!INoD;V9&WxtfUT(SZxA-nwlEi<7jW__oX2<&feF@H2N3QbkjxC z)@$fPr=|*v^?Iny0$voKWa%rgnta@{0h$Y>bHG1}a3cu-n0OZDIC`M1RlxT`uu|M8 zhlGa#Go)D*B^HFZPGMMivQt-)DiBP?R*3s07mGN_b`QE*$ItfD!T09#{eG?;fSMe7 z1}GLCDS^j!T0crcbsuG4Dz*WCukQ)uQEU_&Kmy0PT;tLrM#s=*P+=G3#RjNMo@bZIxcn3kqt{R4IY07Lh&jt=TsSd#v@?zqYFQgdHp2X5W0xN30`fon=Xo zpM8GG)FFH8$-m-z8|+)F-)SQm<%p&7n(3auXY3)nz5j>AbU-`Cu!2DWncfkhlfsov z?mX974=Zh&E;OW*cuZ?idt4)g06F>C8<((eB=LeKpHHKc5-Sze53o~gK(W}IV-Q82 zip@;+QZ`+0Iw{UM(E-u?I0>u}ue+Icr z2nU=#&gBk@#tdA7vP;YD@PX4XduOc}7G5R=bA5HLRg(jiV1=F$$VEGEf^!S;a9&#& zP&f+fSPp`d*bHY$$esIET^Y1>8#mase|V==tlLZsE4ISSZc7WF;^tC_Ity~jH)+^O zqXQdqjaSjd09*nTl`emweTj0pk2qPm@&wY`2Zx-viw{Eo!T>U}oE^UHkC$=GuRYAiRkf*R1 zowOaRtqSKxKaI}`G$j{g`a#2U8vU5;sz%O}6*kc~VoyE%BbYn|*1T=C@m8D$RwhEh z34okw{>~@zixU~9u_<7M(Wx=4yhjm3)}9x*A}twd6lsiC^@rFt0%cR9+75tmA&6_F zW{=KDH9R$%nS^-6h7-fhukliV9MAPlIFAS3=)l$ADe-VRd?~#>0inW8m;6tm9A_=GZNu*WE-Z*Ylkpm7{q90L~gnO)EddmVEn8caCfl3-)0%b zR=gM6x2&?!S|-@v$Ujt6*1G3Pv6Q{Z1aEyV138PDS}f@&TLyBL(Ct}lAm?64- zhrU;Br%tw^%~F8|0uD4JMl%#2d35!15kMYBcSao~F(ZN;FzO~s0p4j?jB9MiV}mHj zxLH-u_r|Jv+kU|=YdLh(M!N^?HO<>?)5^^x836L|X1V|XAOJ~3K~xvwgV6PMZdFMj z$IJe_BF+m?$xc-=DRjY0MG)Nt(Y94My!_&eSQyrDNK!;F`jiDtQ>8=!V^85hMs}cU z=3<@Oh3tnmE&TwB<13rsIrelq2NZ3u|GH&SD7~I#?v46_K(Gj{7C* z3X1_`-U+Iz+s7fcfR>NuZ1sMp=;)}JZr-%XuD#&~iYP|G0L%p9C=qULYqdRl_BhZd z#b9tEq#QUYn{s_EQ8(%1WWgkoMou0F?}lJwDGO2F5yT#G3G(Gy8HZJd)!Xr4kUWSAmuSa%N!DC}DE$OG!W`<(4KOM}UQ#lUzqWDda2`O6su$#-u=B z?T2pmy9AH*eK}6(clCS&IA`dwJO?V==U}XeVm-`0E$2GPemtGTE=r;`LsAx@b5@RX zRHm*E9r6``y&Di*6zgFG9WDt#uWdvd03d8?Y{;X@D8ZWt z;PFZL9CnUGj&;ofIR(~6LD(?}Sd2rK64o3vM#KcnVE>K-AkR=7dKP0Im?MxkMhp-m zM+K{=|0D5Z4dReo6YGiraq~$srO6}9VJDQTxGSd=fKq{4x<0zTgT$lB=_x=eKen^0 ztpdxE-tI1dJF%QHNqS**6#}FI9tg;h45WaZ0KmYSH53~FIX;SFT{Bsw%dtuV*hHdb zvEyXa`m^@C-5T}AGdxC)19B9vWj~$*a$w|KUzugQ3spqGpy8PGQG{qHZ@6Zs&EWbN z67zz87pBkH*1khlH*v~JC>%LX7^&0Pq=e_w80%n6f%AJ`V57AG;X9;>Jp|=0ctcUEvL@TPE^~8R?1#n z^?)~AF&AfFNUI`75tRe@KC|C?YbqE&n9A{`kW0tVZ zYO1r*3uCMjtrIy@^^D8_;C-m*Omb z?)ZQ`UW-QL+dpNK+*|2GVToa}Z-2(pTaXE$A&|>@EeC`xK{z}HC_7erwVm8`n{}73 zVjUCr*{8XTE3ql8D%xt7_C9adPM@|C|ETpBt+Kz*dp(RC1j*5~RNUCm@wA2Iball$ zYzjtBl)WdX+BE<<@9z46U0gL`g^cq&`NUyz^)6%&%5if<183a|Hl*B8dGE6{L;yG1 z2ICIMDPa$-5IBXQzMbN#Evu=IXymdle!I7T3(ZEetDXfPKPv^eWx1UZXff#dse?= zQFG*FM$Y11?*HuBmVun5b1xR1k@L@wmH^_^z_<}@dBN)IYe41qxiKk;U0!{~RRABu z*4A;xN(&odwm=U=n?sbu%8D8QkVz65dJ6C!CjXV>m0H@2-)c~{kC9xA)6HLj zz3#QUUTeWQROi(_a@1al029a*U{#c+k_!dmWNM?^BcV^HrsHVEDjWsmOxv*|uh^Q^ z)pXcMzIc8G|1lDn62Kd2fjAc)0{r;d9yh*Gw6cyd^cfprWFQ9znE-5^36OBT?)v&V z+kd!|&YWB%dX=`(Kh~*@Kg9H6G(AVo6uB3C}u1%7yNN+;;5YpoHBbEv*!N4?6o@o*X?eM&M_a0ql$mqHyuFB#PQvZsXL zfj$`sV5Y?w3*(>B>|-_*ItiFm%veXdooMg%>~7P;%mI_k^HSUT&?=c8wE7i==raK# zpud!sJ8!4X_5pZte=@f6+SgJb`t6d7-oB_ibtwZmA9~~rPIBE&V|IfjVL5fG6BqTeo$gp zj!yXa5M$l@rC_;JB5R<-3A#WMq`&G#C5vTK+A|?K#KN8HW;G#=b3gE>IC` zfZ256<_(q$I5OGW<=iG#HLP$#j5E05WKramk_gXHD9ehtvu6OSRuWhMLmzLkJ0 z*T7vrfu~#pfmOQh`o6CDii%?A!V@F$l!#T1G;%09r905jQ14=euFc@!AZ(C`8)w8| z#5s8tGO{AvXjZ?kx|w@kT2=vri>@qjDFDC}LEK$M4vZ9LDbe6&`%#XYShFP?c#r8Lf(QrinqJk9i?FtQnv5 zuL%7P>*HGELQdzO`^GxXESiJ$ic6gI8~A=M!r2)BJ5y0ctyo)X0K@?*q)#`?nV;Ys zfcFIe!dioImYa$G3ZPC7qft6tVq(FtZvFhMnDcB#pfT=i>Tm}s;LXtaFBn0dNQo1vvL`Vv6CF&Y9&0 z*zuENL>ZmXzVq=I(f|uHVm2?Pft;=!%)}@LYb*z5fPkmi0*-0EwbtJ6vtw8!mp82B z@zKYT5dkBGF|?n=+7-J+o%mTES5AN0N1B?@c$3qJf^8x9sc9^NBY-;z3bTTOEY2}l zK!BfNOdtBjaaE)#6NW(*{0QM$CFN$M92#OL~9uFyzT9O%xhT(Ll%Z)?vw>E z1Bj2EwZsGfD7q#w_LUktJ}#!10@~j$qU!p(QA$3=QpzL_W%2qkoRF}w^wFG%H2YUn zrvx!*Aw2H6>`hI=bgHvIe_+PG_VdFI$hr9sWIyhWU$Zj2n3?SEr#7i#$ucA7)sQ7d zPAVJK`K8>|S&wr@=-kwim(muRAcxz(cdyNk!0-e}t#FJS)=fz!KxxpPKQ(2K&tWIN zVJpqPAjN#da*le3OZ?`e*yvKS6 ztR5EqMjNu#;dUz~A?5B{A_x!**g6_OQwAN&T=Li9qxF%QmYOF=;nphiDd+yiKAG>~wR zdJ(XuVY-Y{*eSsXGOwyYqa;xYkpKo?S|)BU<+h@_)Fv1KnH~w*B^O?8&2^hBgM`ve z=p;WBAl1<)KlAbmhc0`+pyEXxBLO)2zt|a$<|r%VIV^sA+Ms||5q&BAn<$6PQi zE3aVWgJ4YX7FD$U#e>lOXKeMQ7XX*fS=W)1%;+{bYf%-1ViT#*dG5uNHZ(fV`yC~i z&XNo><4#9Djl*{9#;q_D2Ca{AgE?m55gV|rmuhLVshK*b7`q$pX>~F-5>_2EHj~u5X zK8%Gr3>J#;bgJR~`}P5h1l$Ogy6Jk|E(uKvyy>#Ju@fC^(BCt7jWIeAI@YpC5>KT8va*+JjQ0G89Q01z+O3Or@KZh7lr?9f5gfwnRl+}12}8pew15t!|UkK>@#0p zpEa&%wx_rT{exIS*WbZ2uD4wqFJ07~x|D&O|MAmPj01L4^uU&YVX?p(E<}WL4$xK3 zRSR^OMAg?gRaJE%3=Al|CB=>*6D3i~p|h0%m?I`kRGlHJ^*ITTQfN^}(fP`9>>TOZ zjKk#WgON8vCn*EKQGP4Z$(aPGm;s=WxNTh3zVaij3y14@i3N>sKn1#H4#*ME=yfhr z`Zm(ZiSyc}A(a}-OtErYVnh-o_KfD}MPb&%&XXBR;7|#g0G^aBrykP-G<>*HF{jTS zsbt>>n9&~5PY7%(>nQO8`aaRJw= zh`5+Xk$k}>x@27I*02A8;1#auVVt&W}^=U}DLf;gbsw#^%%z7M%ta||Fyu2uq`rU9G9 z$a(t1moMtRU8+FN`&;kw3JfLWF8Oy+mRri6V9|tNfBfi?M*t7z>~(e7c0rk#ATV77 z)`&gAeGZj2+FWImEdZ=!Qb=TQZj9r6md#^T!Wt{dz%6HP+^XjWVCXP<04Ot%4MWA> zjFT0jqHY8yYNfc5m3AMu5Wq!RfW4nvV^ie~HeOb1Q#nPB6_cA_YF~Pz9ZjpZ&TNg}I^zVl43| zNY0Y3JW9D3`B?&hJq_kU8by4%5IWckT0WHS4t(-SqebjWa;=33%p++90s!adH`s@M z9I>ze@~C47-}<`iSWgls(kTv0Aq5U6*(Pp1^7YqN{mY{6S@*mj{VzV{Y-s$-v_2Urldvg~3j#tIziU^~>(VXJV3+On$A9zS@N zrd-%wcX73q1=Q>S2ubHmPeXVYuFfoW-C0^g0yqKWpF4Eg_8uH`?rpNUmt(9SfOKV9 zrd_tZ$kwb~!P!t}Km5hh$SEKb026m*QxL~iY_Ew)*#J4yjwQB$3v1ZE{m_1^q`6TI zgFQFMIBr#*ZQs4ksu~*sk{QA3ov`2jeoCP-;BNC2^W_MEYTIP|+#Amhf_r{6o&VP7{uE(gSh;Y1GKk zXtA0c06DI?Nt|%wPue>=m%0981!|m9;HVlU(y&oORWc81Iw-q!V~L!X-qz5+J#z?+ zekaf*^Q`A3wk`t#@*hbj=x51%MPuSo*sAqgw^&Y9m0KqX*vwt&a)P@CsGLM+nOZmt7+1VTK#n(3?v0x3|DNoG6FhhORY<>gp4_wYj}~iN zc+a!!TD7>>`#*WMWgutC+=|6_t@`V)gBTM$b4c9NLC04#A=kRwJ4ljd=`2F^EX=f<-f%OcL5y_K4eK~|+`14n>lvM7?tYSD zn8R5~8SgE^ffV3%iA|%$~i4bSXRl5l95t6X_?&D$?-`56o5q5nHpDI0J{hi321OMp2!mZ_hm7&-d=5PMi| zPlaf{cmm&ge9wg{#YEHNxRFljN{L?0ryQ9E1_ogk6*~I0SU3VS1n|_>*8a}VGZ{A- zM*uy+{tN=PYRtfii?gf?`TKbQ-7=EyGHK1g@ovNsYc(TSc`y^COOZvA7$kYr|5X@j z{(XRgYVZEzfUrTULCkOh_0%k4Nf2N~1+2P;!+_42Bxx1Zb+BAU?B#>U07@i;&i#yv z%_3xs*aUdu=-~v`*j>j7z@2F6(>Ts(j=2RM`#oK;!!WTUNlBgjs^F#*N1xu-(sp$HJ_QHoC_9cHL`dYc8_! zEG)d!ikyy9rT`xtbv92PvfD;~Vpl|7vg`nwS~O|KSj$fqU1yKlRdyuUXnm*^2LNRP z0%th08=@U{TjDvpYvu_n9y(zs7s~C+Rex?zpbs+3xJV}NMFv~0h@yZ|fte1#ur<mcCU->nU=su=aw0HHvnemPPMx&Z5B`f?Ir|h02v|E} zvOrO4AFHl6oQ772+#p8oQNp<@T@zPS3DwpZt4eE(9j?6fjkf*L z>&cz6k-)*-E^-{S_c`;8^;tR{`q`PmBmfVyMi7&x`Hy4v&Bu=;=FVuEuH6bGpZc1e*rmj z$R5xO;)n&de%|gh5=*}X`JD##{lazm%S659zM<0Efl~&7c5dUU`Umm%-v}E{oZ%D**B*)9fGiPFR#!Qj80tTp-T^Vl*@{ zmdV&?0A^ba48R?eCu~=s*U}IWpA(~vQSsRjCk7*t8vk_+e6G ztpzo0bo>dBQ6rQ6sZmMSP;{RFIg(+}J`s~q4G)c!k_*hsT!rrm$kDi>EExpuC~pxn zG67JtKx0E7l0Z@?IL`Ot#ECf9#*KILnG&hjznycdMn3`gBux?KzBcXHX?ZYwHG;Q* zOXd{p+@6k37_c;%+*lPvMBFN;a0rgVj8@EWXS`U3fL=YB6;=e0QyIVncY`KA!5 z{kqJ^S;Pcmi9Xdbkh6qt%wlWgeD#~<1b6}?fg%Qt(xK=SBnJ-Ss-O-lbMzNobRj>B z*xnZplc)e}sH4t7FoTV@5`uXW3MB(_S`xtEGypiXf@w_hlFU>UR@pTd-(tZylv1e5 z^wwO^basKsEJDb3>g!a;QpprYi6=@XXBK`}fKHmz-yqn6@C*!e0z%;=!$?DdnOgxl z0!Wkyg?TNq9Zh2lBGxxX(lu$hDDnFMt~w~1nxH=B=H+2oKE=3FpJNgoKGXp~L!nAw zRkJV~tqXPTBDnLE(ygy2FlTVBMk#J3F55{r`=YBZwF@r4$Oag-IC1Ep6G}bZ*6BL$ z>L7>}q%jXU&?qq!D?pvQs>(`NsIFYM#%{g+jdt?r2|IP-G==jR01X{R3iM2hZ;fi? zQ&9fu@n5^wsiaZ~gs!tb^LP&_#9r4<3Xiu-qbw)R|oCI9g`K)yz>BpRzt24+_$ESzG&l68?h} zn`LygZUq3m%$m1sS=61nl!2TN{q(d0a+IV9$dP5Q*k5G;niB}u`q@u$)`1Gd((*jV z$SH)`rLOTb0HX>H+30FL&QU;yC`bh8$dXsZN)+mEh@?()+#`$+jH_4?+lBQ!!{3Yp zhDHGaSXG`Tj}}_0B5=T<5EohS8sMiGdK$UZhd1h|^(x>+owa%PwitOShC*r-N@~q<|dH4wNyjTxK#v|<`$T(4 z_S@Ry33UWn`+8jhK@_8uWR;VU)?>XEM++;54N;Ha;)dD^uCvC`aQ|VnN`=)Nx**+v zG6xQ#fx#|WxwgUW-9h$r9-U5svI24@c~4V}L(KED3A&AP-x$D}w4WqTozrv*TW5Yw zS6@HZD3;ef_pYLFrc9nw0IiZy7hjTF6=p2}03ZNKL_t)5mZ;rgBT!7ALx^vR zfinYRCdM^rZiWgEWn1w&n;6sH)rU)8pR-4=s;+QW&CLDh#cNV~wblm^s zbS8ykKc8{`tToS^vAa(FlU>#S6Z>t|>+FB6{e<ica^A)sEm#spQa0OC590Bcvp z6>OeMLdWbgz4zP8xm)dvmG`05Lw*4}SZ7Pjd5N>%*rRcnrmjX~tzQ~`$^L5eE7lxu z=WG^hC(lj{m%soeR^*jALD_kPgJ(HwRfy#RjEHrYA@N`yLu1Br9*z(%BVwP4IVdJT z()L_z!VF@LSd1x0y73U~z7TN`2O5Du5rkd+j1^0ZPUo{L_8rs-`vI}=D{i~pu6o^@ zoXB{BQL4b$@WJcu0=wtkEy6ztl*3 zYLhMlIsX>O@fbNC^Tr#kViZnH3#WJGjkJ3jIn#CsAZKB0z^VXoDsm9L%@0~W;6(($ z_2K;;c5ve@R`f@ofu+XSBFhI~^p42Q$|g_S`u+cE`6r*YL#+cAe$&S+ z^qM=cs+L%{-(EBLlHG9ppR8&QwrpOlJzjo;9WLK!BaE>#DCoxFH6oqCW-bp6Tg4OK zHUH7atenPT4y&?1ryRYUJFI*CF6&J%ce!5?`zs-~4$YvA6Q}L&+#b6ivd8iX2ER(* zY+sna%*L~8U<0xbG%qCE07IRkW(`Z0 zX7GZ*8ON~k*fkO_PN#0s*K(>;rYbi_!h+J^h>gmXO=0-iOmkg2^Yg9*o@q2J#JO6(ZM)^;xEiBz2K~ln zXwLRgFAN}fth`ENn=#z`lxxdPU9a1dPX@>VtnSV%hmo_*xpg{d*yZ2e$M1~hCc!I@ zk+VEnwW!I)5_+;_AZH2PjKv0We)Nk~FeC~n+UU%pcLV3yIiHjiF_%d|85-&b$hiQ= zntm8ML(URV0oF$#op7U7B$BvOB`}T`jD>{& zon)CS;3P;9Hiivx4xMQUKlquk)#yOps#>VWF>Bj@*c!1@S8*d2QEO|f8^bttlCdf5 z8T$u^7&n0O3XtPRw`B?yLlu!4H`tCw2FC>e(2Siv)j>DG?2dQc&6Sw96Ne8Wx;$k) z1nmiC@-q--o1)tt)AfX#h z{wbk23B-kY9r0vWQjabDBF*UwJj>#6)Yw^W9!V;6);W^m1rqi!0*_$|V6PyT+P@)g z$C-tlW;(OlX$cr2nXOh;vzMgvSy&+}Y=G`WC*xJ?YBq2%*I3IDu5a1~1dd^VO+973 zXDe-LxST852~*=31$ZW|AzSGbmDyESd~8v7>QV-BKK$qzfSg`Ou~!nK&UPN!Fijl# z(<)e~Okyx8RQDGYO3$hQ=Zrjl2Syl)g}}HR7(ALSk3jLA2AG*epfE_17C^^AqMri; zT&cb@J5d-Mqz4fO9{AsM*xq&EOp`KUZIz$@dka&;arnT4B57RrTG}m$RM%H z1Last7qXlYDT#+>kz4~?Fs3wWEiIjlP?5;3EJFjQg#89n5sO$cREp@XNkgN%w}<`c zvmUP30HVp|rIoN76V?vfPwb|kz#MmPaqR#|nU!8Zk_2}?aOH|wVzNL1y?2jEfY>|F zS%hwwbdCxTT$IRjHcn)5X=(8MYhhjL`fLAg*|ODIjy`QX zde&+fQ7I{}1ne2Kv)urQB+1e~6UeL4suWx=vtV(AZ_SNjGhaY{^0Xes?DX=T+DKY?ZnA(Bmm}Zl7i=VmR zgLZh=+ifU=Gm^C-jk3JxxGP|0`~Y{bWWy?K&>_2d;5YWiC;rAxmRw+8UG-7xL;%&# z`Yub1*sTX2ux(F##rAA@z5Vir`>{f1eX`zs8sX!-a5PwzL3H+cD#p0N_Wscy+q=iV zWnEcS_VL1x*-P0QEza7Tr$9v;*fm%*+z@0B&w}78kGL>&z`j2CWzvc<`#|ky?1h3$ z*t252Nqkfrje=05Pe-v0+hx-&_POpaSxeRy`+UuNZ2~qxA|b{p>sw6*6*-x}Bdo7L z9HuOPTE~dSCx-ssu8Ta$I2cMH#EG-fCOg$lE|W*q1_cX6?!*gqkPFvxQ@jIqHS_bv>uvH&Y5$bAx% z%{8NBCZG{0a)7Je@J74ku6MhF*`EQEkN52hx7ys)bndBu9abeVbIxxS zc067dAan-Bt&g#6t(i2QD;}Eg-VY$WKp7REX}nH}$_p$PKp%mTlSnJKPyE7X-+8eM z$E^~(35}c#aw?6`>OOcHc%C+4>O-;g>#HAF)IIBB`H~;4@`TEr9ts8g9KfFdJAI_i zKWWajy!;Zg$Aea*(JJ(xN&s>S$mfR9ReGr9guSx$b_>4s3*<>Sjfx2Zu;Jr=&vV^% z&(-Qo2Z*^~5?9I}e$IxD@3X+$K5HG@Zo$X{4lHbqYldF5H=Oyt49xAR>g(;7^*7iI zfT#9h6wuKJyC;i%MJt61n{8{t$1ML}K4C5C=dQKu)*)Xa~BE z{d0ETnN2p4wZehQVrhG0_ZqJTst}_T-L9OeF8fH)X}hoJgarXWhC2or{iWehT4%>k z4e;4%uetORa`NNOFyYEeH!~uMQ3*{Cxh6W1bL}yWPO;|#obgVgLC@tH!}=Zm&$Ugb zVPlwV2*^p(c`4y=VvhS;u8|xjrJW-~7oCrB7&v17OWc^Cfmj^l>WoVz0D>h#E=G>V zt>WB6W!dS(OvlI(+nyLRg>GoohD|VPR>SDUrjJ@7%-K26*JGnJYsN{GC(xhMRD;lD zjls{m>*%eoIl%cYCK`$Wa!P3+>C8wmkhR`k70rJ&2htjR=c?t=sznc6OXLZcft)3B zBlI#B8_4<2gEg+Zn*quln^O^^LQ1$W#R-L50YJ#WV6O`t6=ju9Io>bfT!P;uK!u{| zoT!N6X9zA&_8Y|n$Wju++AV0XhKOT+ zknpHT)5wPoI3*m(E@&dIOIE>oG3vxpQ41YY#C59Uq zx*iMCX&X4%Y9%mTG}58&n|`+ft&5Jc!vI>dXj{Py=ViBfrX|`=! zv2tbHWT0b+S@~hd$f;jd?=0C*x3pM32e&%YagxP8tP>|FmQ~aQDfnUp_7&CT6xHZs zY(#txmQ%~&BR0&~gJyWM0m_`kD4V6iTNx0ID}>bkr6VI`_brjLpZU2~swO-K-A zk(;j80oQY$j3GAf%^*8gK$20hFppk~9}N?O1|BP-cEU`7o> z%|&>17QCsn%SOattzQdf}d9qv=z{(ivey5q@x49If9;40oqLg z0W<0rQLIM+a{P3z7FaLiburT%6C_KchKe~76HLYgG0OB<0#YV&c>UV-jz!f*+);rb@#X*kvc@6@U_{MH#GGVR z*GR7`sbb~5f7nP9fLf0J#tdU(MXqxnhCNdYvrq-2?$^$p z7g#T#-Tngy0Rbn8Clmw}7t;U9hefD+Q&Zc(m)T-M4#D_w7;za^8RDE_WSLj2s8#XdSa2v#^NrS1Ax zjDT9)l+plj1~W?mg#i7D=Cd?-UO)1j-9P?!066RI!=>-HQGXertR((n{mu8<>e#Ri z)4XZR*g$cp)L@b^uSxs6!TW7Zw8j3c@?-XV{$&(RbktcdxiEuP%+g#z7iUfd7i)6| zw%qTT_<`-q+GU@tcn>2VV$c%f(8g&D4_bM62pjZb8}qMlXIK>dn{t4SxAuJ3-rD<* zmYog&3BWZT++eN!0L?!1?TCwW;YkXrumf_`lu%Ph?vMh)oR}#KcaHx@U?R>Ut}5Le zjcKH-DCW$Q>z32w;%W#~7T7bPoMH?iavCNx#E%55dUb3Nb;NUTQ?CD2;MW+{h^BCEs+hDNSQy zIOK)V-Ix}O5CB+>umCYyjV!Tb#aD`PpBDgfKK!!<``%vM#T+B&>ZIklfE>lrU$iSoyIzof-CoyDkZU%!uu_Q})R2uszckv-{3A0T`_SoKk!vH`RM3UM)Bf zMTQD|4eR{oj3f576-Qz3jo5Hct4$08Xj+NwZ|SvHj-mm`C}AWLB6mr%`|f=MY*@7M zoc@%Yoz(0QGe>72uh_Xgv7cGjPRCJ<9n~tzQ^+3{G8n1!b4?i4T#!SSLxQwVr4cGP zMi8h6ii&;XnE$Yo)Vx`Uq7sA#6*t|DT_yDC@*cr%+V9jV(#~PDSha^5P$jF@TG86I zPFH7ve@BsA7^apQ9l-4qy)GF@#9;7h&xw`k9QoWfRMRKu7&%32x5B6{a$9qmk+Z02 z#DBXdTLyBL&@EeRAm=OJ+&~Z@w@BY|nFhIj}M< zkD?%kCPJKUP67>_pptwNo*BkyH16PsN;)qQT@IRbb)M+_WM?&5^SajpuB@hT(#Vsz z>x;gQEiP)^8UKpPlLdZacv?L z%Vl<|XUN(I8S7wfHaim#ee?&YpVt3p0UzNwT&wcv;3Z%H#B&0+ ze%*T8zyD>NZ(1FrK%D>qIRbG~Hp&8W=G7T;#i^J0=~FsB*`mtQ{RpdQ4OZHPSKrBa z3XKf9x1+8t&L`O)1VLXh${Ah+HaPb8@px*X5*Q%l% zv~_U9>1Z3bnz9RR_a%S7s5^Bj134dlY{X8VKIOKIW0i5g3Mnwk5a$hY@74L4Kqxz( zLc6#$pJKiU`|%=li2(gbLS`t~3vda`Vhx9&F;7ttj00q-U{Hs!w{O@wx(00+`)O(v zSjm(mbhZ`%6J%nY;NPP83rLcXu4B*%z;SdOHJJn+@+BZ~DT2a2jbJ8qXB_y)r$7b= zKCoxhm~sbEavf=HYwc;QN*@v=PJPdHrITY^DMpT?Tql{wDIiA$k=9~Lizn65l2EeN zxbn1FI@+=rkC1>xq7-uc+kqu=0FqU+k~2DIauV6NcBNyd`2nbW>X2!?L9}WO5%E2Z z7foTW9K@lmx~d#ano>8WCM}yR32d+jgR%_fJs)Xrx6X-CY`?Lc#_6Q4iqR!TH``91 zagJH;J_yXESk;*43`y^TMqk8?N?sf7afL?_<8R^;!S{i<>#}h zse$(?zo3=c}U}bMU51l+KsAATK&e95}ThPt; zRX5adb@S&01_JtQ$GuO*>tJ6udI|Zgn_lO<6y{p07=7e@%ZwbY;SUJNam8|yPo^SJ z@l@;S|FQSp;c-@1*Y}oYMs3t3t69~S+zYnB*aTx*=$%j!2#`h~fdo=XAcgcNq;~=d zgqF~I=p-b7ZLkgQ-I6R>z1PubM)UsGxo5!1`+m=#y7XO_MHJgAQ||kmefC~^t+iRZ z{h^pW^u*t}cEfhjyaGF?4rw3K1V3N}chLF)1D{^<3439|Cv7A~cNq_iYUE3w-F&+h zHN9@XS@CsSTXD9fvu4NWtS=g_w=Zq}sp+p6)m0ZEc<2!>4_@}i4ubeEud|al#o`mmr0U^b@P-#xuPuDY^x@<~B=e-)+9$X7;0` zGfa$A>{4-v?~#B$$)F}&qm0*sY$Jj(><}Q*AZKTU2Aor3X$&&o*R@O~?)YFlMSVr~ z#V4Y6?>eR^VRn4Zna8{Czh0dOoNGzyO!tn~L|py#VIb$dT;s0&cgC-im^WU26CsvI zHMvS>TKwEn^P-;|bPLidUtgOs_z8a;*f^3_ac>&%j(K#)KHITLQ2` z{)oJ2^~4tYUEOY*Id;H$8~0g%_Yea<%--1CVO>Lh%=58oa1z3PyYAEH+5A~W?(9{w zN>W~*8czaaB$;yHj*0{gf1p0lg(AmD;x+qHs0m;!Ci&!#gC9^N1!|)b)FG<9rB$^zOT#20*Nq~8LZGs$MOt?|bzihEsu}z5R z>kNm8ARFswZMKesvSo-O8Iy$quR-U$@@~~S0&LV+js&a;06us2VkV9X$a!B{^DWOVh2qD%*|R?(I@{8blbq zx-{YHT8D)DeDCh9b;gBqixfmQu2I8*%6C^eMB)WLet+VMCNJdatG?U3g zD?zZ!_#Kibx_b&np3jSCdo0$CwBgrD}oPJvrCvzG4hxb51q zi!qV;bf)pk=^A3>GK>Z~UE>s5@(n2~nZ|ftrb{Rp!rc#1C_rp}FTOrbsu;!68PCM;Z12odj@}U_87>ttUUpJn!K=Y z&n{O4lvhk+{T2YI`6@a!sY)^_OxXiSB9|>&g4uHifD^@X zKCC=CfIYBlYB5q5VD#>$&CWAN(lgH-n(?q0)23)*R{>M=0CL)iK?mE!90b(o`!aZz zv}%I&CPq>k9!ibPEe?E=v`Qu8*~Q?C%RdX@e9b+FYe{vTu6l`&QY$#(urzCVR8| zOc%q)05Il^G}uiWzKmBzj{WqA?_nH_+?5@i2Ls>}TmNh|yPmT|49OVU^)+_S>2p?9P%aXqX^vqO(6Qyw!fvakssZy2yT#e-XYtFkfkY6P};TfS>E=PyM%!f*ygtH;7!)=K=&$r=W1 zC!=XyYrX-1d19nMAc02{07X=WZUQAnA3|!hU?>WQXh!wGloW%|lZ82e!8yB15{gkZ zX0npAhVe7{$}?tv-5~H*sykdm zDv<~2PZ{4%@HrmOSDm!V0Xajqbv^eIkDRh}O{{{|jyybr_`9!r!k%FLG#|wj&MUrc zL(o;C93%VJeq|MVU$cWJUt?>kPldggg&Z;2=5@Sn#eccg z`sb~-rc*y_-2lS^c8en|_Cx>cw(+h%+dt-CW(SvFi3gWF&LVayAnUDJYi(Vm%Km3) z8Ne!xc0iB<*mNiDyvr7EdDtq7a%}ZU%PoHf6Cwff@7=~wjoxK8m|2OR7H8jZuifH* z&CUxp*=?Z}_Hc9#2?PvP-v3dNt#I9Em<<(GIGdqneHecL^-$oZrrCN*fc69WN-`vCkb=pWa2<9C7*0FKoXr=>mlwYv-9W#f9jUUfov`kQ>#4od*UOJb0zYet7<+rxz+69sa2DEz5kbII}GGZnOiaW z(yCwFgWmR}lllr8{cu%*d%piMlXO;G^W zug94o&Ww=4(GTe3I_hGOxG~$JU_)ON5>6nlO>ee^MI?VDwId|JDzXG*D6)=$p3Cn= z6iz}c6R4QDh0grIw%v5)IA8$_QqkZ`mLLPN-0VCY<$FQO`vFb5ooVqfULo?9Sh9G& z?ccZ0I(oVtE2pHa6a&*PJMr{0t+;NE4dBPqgrR5=1zbi>k&}R=0EYE59)0&Vyk408 z;$s3wA037;uWQlbMYeUzW?S>dT9Rm}-V|~&TTX|KlT8to&t#k+Nc=W_ck9-zuCVIl zAP^Z^ldu%H1?DKp4DvmVCfDD^G!R2a7c)e0Izgi62gn(w^BzelwUwt_MzPK~lo;#^ zNz@$Z5;yS^qasd;(xK+0RZ2?r{kViG!M1U~_5OMC9_`pAWdC*0sEg@OBIzIRwvw5R zw(zKS>mxz<$IH9$QCb3Xq+2#dcFM^stfgg_9qfCP^_64gMaS?vt&Cg6437hR#hjg! zx>KhzkaO)r^~m^|-!rw=-f%z;;HxIxWP;L+3?hqyMV6ZlP)ibDh?J@nCYZ+8_W>gK zNc^$^4zcEdjWcQ;Fx6Nlu%P;2U9?h+%P+!_ZafV+YavY0IU>*?7t2He3+iY&z|J!< z7LXvLZdV@Y`{X6rNT~b*7I|>(_katQ$#OEX`AlxluW4NSXY9t+>8sHVdSV1nXJ!6k{6KHUo&2NNKm z*Xw{Uu0a7N$|?F9V3In58reQ?-W)(W`6uCh!*dB-s^7cMN-#Z64`$n@&0F04%R_=y zz$Bv)K&lKFIVwzp_-e_7vYoit*xX8dqX<^FlJ_=uPOYP%%N$ui&c6Bs)&p4Nfl+1; zeR|oX?%Sy>~j=j{xL|k#phPd^>Lz>^jbn6hICEIsM7$_VoOZ z*wc%zLh?j`La|i}$o;KNH(LcA`X4R+k*z7ycxn8KF#KIKyu)sM`|HS)3hc*6e#iQf z3fW_@WB}B!Z@kCmxBSC?H1B5HSbQY%SxS4>@3DjH?B;#{1CY~Te=WJx{#tOU4RYRv zkax`+X|$Vr@3&Vo7uwHquY_?U&lVVWp$@w#beCN<@|f)m&bM#c<<=0WpfF*dP~6-Q zdfd(oZnx`VpSI^yU}xdgrtVM0*be(y`>l3r?>eMLEFP#m^6(jhG5T=+#rCz7PhsBb z0XZ`Ey|VL3yK3Xl?6u%Z`@{0DyQwazd_9fpckaFi?c#Ocw44Cf5(#LODL;d0B}`9b z*RW2*n0SwgC5BmfhQ>Veo&@B0$Cw%t9*`kWL?DhnRisOL?MZ6HTmfuCE|^J&UlVjj zILG%k^iU|%*dfMhfPwa&&Pqu%1Qx{rV5*j`w9CJ83ry4!z|L-(F~~hfyR2pZ8ulSM zl$fosa#F_kI}k^skE6tt3CxR=*|+ldn4qB}`CSq~Q@Fd&`kLDTWNC!RV+Dh2$ywdx zK6&(Ds^m`J31jqs9h;Trb zMtZE^_HWY6s<-epzqIb@$Z=pV_d_=Ktw(L$lFMz|g0q>t>W!IL)w99QZ@9~GraWT?Fnk5{_MdL$u^h@8di}QQzpEJ(42Mbo%c$y?dX*RoKk7e9-i}lYs#+pyP z&U(}oC2p66TkQ84Yivr)nBT(&(wbcy+F^IkYqZ+I7W>DG>+Iie@1)_%b`VpW+*K@F?W2GuP;s6n1B%E$ zZaO2+Pd<669l2tzt37-=e8{=wc@xv0V!+aXodDoU!T>rM5GTT3NKOVsX6l~X&q9;Q z8Ql2p_*U@tIbU`dCrwSU@i;$YFmfU=?gC=~NBC_)|99Rw&H&l58F?H5Im84>qelUA zQVJR3!9+(_)8LaCVaQ3>!3F@FR`LdF4jRT|7+w3RL3GBB(HIhNOyGf~8?`21q2<)f z=X@@7kCDh_4l{BlHJ$kX&66Dla;DI&nrvy+9gpVPOgh1>_`S3<*=Yi*a!pkwG-AvX zNhXGoU39jENP_5MVS<(fojWSwD=4-)Ij#ppi(o>US7}aR;$$!~y0mCE0WFA*yq`jl zsWF*##Mvr34brAczMym=fdojQ8vi$6^1A9C-8UI}XM&FIy7`heP_(Ig9zi!hFR#sx zt{%6cFgjFzUS@;pW(d&G6bgYN;{drpM!&FSgcM{^+)Th=Y1`dk*+@*%3z&pMLDG2; zgq*4)x478$U^tw?sLw_w0{LJZ$v;E@PhE8dMy8E!WN>CqwiQvRZQHSnsThTJ>=|cR zLFshIOiJOv40E7PsHhz4LmS&`qkuQDB*sHhFb-2S`(ZrFN)0fk}>GREas^?t>D}c#`7XP>*Q(p1B%dOZet^qsG0YR-cJO#jzN8 zO$omo&(A~&vit`~Jt7$1By*3_*I8!STFWVA4k=8e~$3n?#>0Gti#it(zauT8HQxEI`bZmcrStP-m=akOG-6*+ zw^&JG4iw#dD~6F1q~kp}z}nQ56@VNWkM?2)-q}qz3?Q@q04B$Pl+v7!Q6x#;?#TFb z(F7*+04!t{WH5@HLWoY8%zm{m#hM!w69b8o*WvPjoFJf58WO*#n~=pcHqo8kIt~CN zLDeQ6jLKN>5JpeJ?Bq`yazR4V(DA+lb_p~;S0&+4MOgvx(W-esjXNe~bNfzu{T&AyZ6}^yeH414>5Gk*j|4;UO3b^C zu3laP-X84R0mdc^NE?^@gXhzA6I&<&Sc#JDyodOnq-c`b72)?K1ItX9eO<6{lzh*c zT?cr@9^^Wd78N`8UoXIn^B_Yey9ZE5rpV=V63gj&3do7kiBznT4-X3h&&FY^Z)|Z4 z0T~@@3~x$mkz*{?LvnM+3!QAug*M*naFn~rH z`z{A|$(INIVju6n%la`x-JL==J_cBWv|3V?5R&T=q%-~Ww2SQYa`wf6oOp7i>*J9S^+udG(2FN@)p@+RUblHg%=d7 zp&-<4*EcVH51zOtaTl6x;1_9Gcf#!;lz+~fSjLY zY_Qlr9@ zX*jN2Im@!EkU?e@*s}+-?USuE=mw2M5pnktke z)f<2|;{Z9yL+nvh3G%6u_f3)ma^#c4r<-a8ki$J1qnVY&Ib1k*4&jBJs~UuSzNfVw zz>d7W2Log#(JejcgH96XpddBP^j<--o_pja+lIs}f5tqRf4pv9j;o0dX-sK@9@;cL zY<4{9A!|xK;b9i|=cN1{QHMPcsD$Nb4T6grtsJD!ua3}9ywffgSR0-by|G)>9lfq3Ck z$%Lc|iloj7pWyH0R00FyjZ07N-~l=6z^N+{_Kn%>>?T`YNsyH`o=3_;@}YuJL0J=7 zWDFY6#3+ir2nS%4M5uFr6JQ4>#?uSU5B0mVsnyajH1-$dTf_F9R*;#)WTk^7V}6Pt zrnux!vuYSJot+%G1nM-rNb;Eubg&hfLFb4qTz#z7E;-T_Y%0{0UByV2qj+G91LBO1 z@LIVRoxL3}ECuSwYXtTU08!)Kdh6a<@4O|F>7FMM)O(pK)ZE(Qm_MRb3zSmvCI*Js z6ah(Rc!L6R9BV){aaa!;X)HiU<5fc>uH=EP12GY$SVbd~F>SWZKbk|2vG7Vr6YQt| zEPB1}qY6fup*k6i#!Tt}i32*`0iy4DYzGJ4X!XPonZ*5b%nN;A^iwM200qgI?`;fE z{%twapt+9}b3ZD$KHYr3hcSyxILaEcenz>D4J@%7KjwM^^%g~Hm6qFJXRX*XsXKKl zGjgu}>s|-!3Cu`Hj)EF}OJ^zqDv_a%GnKX^KUsh~`Ov!y0db0uSE<+-0?3I%kIrSH zQH&1N;BeS6a`x)EG$++T1iF3?;71DnQj%At(WzGvDyE#K zoDDf3M_uf=6q5U%4iF&ekW59TZ5J3LR!tg!lGq>Pc;tliJnT~ekOF)3z8shsr?hKy z_%OhvXF940RRS|KL63=8Zc3FTOp;&<+phLjSQcKq)g+8O?uBFzx(?mM4VhR=^3)HI6XrUG zHS&~et$n5UDMRxV5>|QSD0Yufq;^A3F9ftJm$ZxbE7hYWP>n$auV6}^u9GBH0&>y; z=0d|Gc(EekNzb%x+jlTEYrj0steKH+F<#3_lzRn((@?(HDlW7CWjEuQ#c>$ zX5zg=Tq`bQZBZO|boE&WEISE;M!A=Nxnl05?%S!#$hi@Zoc93p_2Z?d1L! ztSe<2EHaA9Bnm5lU`dOLqwP$wO0}<~ea>D^U&Ytyl5<$+(A{1#z6JAT&RUAbbYw(J zLT}oI(O2y6fJI-+K>i_Vm4Hw#ROUp#1czx|p~EMoC=Kf}R=tsTW;li%&S6 za~Gp|9(NeVj_Hn!K2N16b`0Ev3uCKo}vks2hI!hb~`91dktg9nh@jn@Lu#UObU z0KdP52GNk$0Fz;A1SXRjU-C8)z{;(0Kn~_~cGHUja@qlMrrEh?{eJ^F+N6qiTBE<2 z{othTS(j5xQEAnm-(%!>z*hpunc%*AgF)gXtFrJ^%mP#(&TnfA z+q3%`t(%EafscN}5WKo;oTahzO&iIZF&nO4hOZM$RlvT*z1wWzKmTMsdv@Btj{mgv zAA1Swj~tq{d|dZNJE!ph+nRR-K+c7DQo*Vu?=7=-TlEUks)2R3VBvBb12B2;*|o@( zBvJNRcG9r*F2BGUPrlx|9gq{Tnd1lSTkN@sci*&*(SW7GAX>0|CQSfh1u{%pJ@$7W zOuP13)}2wsS(I!UoFNPQ*4doSO-K&?R$7r|iwh=fbyd1Oyf4*mY@KTZ8JHdOyMCTy z@pv1u@38HTGEN+3`UsviIRHy%3~jR9N4{x8G>|fAP7EONj1(8>!;8GCk99pPP^?*%ScIP!~-`nqWLvGO=iaTtE}9;PS%U5d$7@ zkC-`z_YJgY%bz{V$-5>P43orAl!3N-0xWiJmFy=XUg1)$(L6B`fidQ zzzvNP7f>P^zQd%Q5u1t%$srW{WFQ8G5zhoSt`B2EA=~N#jG>llREYa&~e(bI!bPopt@rY2X}uu{6Ga5!AtTC&tpRg z3}%IBi)+*O+L5(9Ca-IPPFV(r&lsRZV#KjP2KoHx2zFDo=yYsZx51{-ovK0-FhcRF zPF*%MNHS)NU}%=i&unA5KpvhsUM?z=W(Yte7w~)gBJ{AvY3~14^cdBzZ;XUpx0SIAdCQ678Xo z>e6H|d~&j2{)}-@NFtWb_v-8SBU3>}#dQ&@LC*Lpc!kmjVPj}~yrgcDVX08n6rPNX zJc{`Nz>!hQEnj4_mYzm&E^299S1;5i{^1q6arOcSwF73{0q4sdfmh!6QffyL1M3BKRvtOX3S+$&+r!OXr{}Xw9MNFa=)U171y z))0mY)EfAONPMggyWTea-EMI9THq&E5pQ zLz!b*L;|2CX$tck0&|9xK=L)VzQ@Q>eBwPT`As4za~?S`a&mahWB6=jka%fgkNk$Z z+F+=V)GeAn*Oo4vg~2#x(iGz(>VVR94AFhh$YA_C@=8e>28k)#kydTTkQ(&q~`E!8>_5p0e?&()Y5qX$^ zoP$i)3t-wTrb7~-`aFC91Rlz4JA*Y6;_(%WL~|cPa(3If<&(N^rz(*1J|o9F^Ss7| z;wZ(A19D*GAa9nm>iju*cD8^V&XQE*Z2-xF>lNX7`5sj`q| z0OU_h4cVowPugV-x7)PwW_zyieEVtb4NRdb;JMNPUIy%@!8`4!k+t@voErghRyg*S z8Z#?~H`)yY_u1=#CHC*kIj|w|yW{MNz^<7WYO*Vu?z5M3m)ISZpJm@FzA#;fuYaZQ z0Sh8OxG(zz>rI>Hc|P#{Y>Jplx2 zTZ+O07%!da1~LqDMh)=3##yHtB(N7IZacEkMe}QrGG@TuC1y#op+=AE&`VYYh@vSz zdi|XHk~b;|i3)5Xo`r}76EOM4c+6qq#xUl5lA4O3tOiR^jA1~W6u`F(WZXps>2}H) ztF3%4^1_^I8crF=4wauUaV(ALZ?O4Nhnj7y{Uv8|>d(kGpS-o)PzcZ57!4Q2BfeQo zdyK$vo*a=oC@_a=!G8&mLIchO`Qn7q8_% z8983w<-$%jv5I4LZ*d#BAd7aWHbu-2a%Z4c6H+^FPEit2|83eO4B0wiR#PX;FFKRUgZ9M66?w z=jV4S2KHOzg?p@f;RmhxgP&vcIP5Xjdfj-7-5B|&t*;-lgXJr1kUfyb>rMt(otxBQ z*OhhKn(x|oZD&S+W5gQNG0cuZaBQTl*#-b|`jJkz11byXO;w)8`;4e*D=#cw*4{nM)`lr` zM#X$9H~n+o001BWNklX4T zfIphxP?SHHpjL$W-!3S_6y(uz>zO!c>AA}p--~viL?}6#f`E>ibgwEt6X?O z*}KaM^QJk*LM~>edc9)n2-L}h-P7CG>k7R5d;loA1U;CzW(KoJK6`DDgC)OmvDGcX z{BDeHy2?1op4=3M|15M9a+ZWoj+4BoYoU&Sqr1LuknDMn=+oOoiDXdci`JDpAVqN? zY1iFTvYZwi#K+(u$pzP@kM|cL>A)YrA8cbhbB;}~$bo{2No!x4O`nA^b)<=@BUN_N z%10)3r%q)c=b8uizbCEI{a10HM)IEpz%oGBR^Y7GLN?wjrO>2)FQfIDJ=@U;lYOoVtK>Cl82b6Q+H zuK?IVfC){W%7AG!3O!o@vDTZ{IhT)x42?+()j0$ZO31DfU1cw(5kJ&<(|=l&@nSH> zp4RJ-5us!h+DjwQq2(9kYD{H&0-H3tlxvyHHK?sFwrLoi4qyteE}RTvRe+27mVwNp zg2`Z|T;E(qk}Kg9h%PIU5JN@D+A=}cN?-?NV|bci$?1AK zA0xn_h!_OyO)+RRKD`@nFR_aRc=yA^%AyFUuCC_whiv=qt@wdWcca7wx2i1gYQ`|q)(bnS1+ztJ}4Eu}Q_ zCNr&|L;k73r|hw`55S7~fQ1A2O9*7;)h->`W?$R)Q+qRGp4~p<8bBVHHGHQy)L_^5 zJ_cJau|_LbnZ_CoF{PCli=NWG#Yy6Y42ssJp? zU|QAL-7ng;yMJwORi0!&E%}UfG8s#o(LJ6}T(NQGH-)!EgaUFdzC9n=b-SH#;8~g; zY@FOVHlEJfG5V0HDhZK1Czk0dZ0@X{cc8JbUJJ`@qUl z8a@=prFgyt7XtF?90g2eichSo*^*k9 z2EvP%81EgJ2|$_H4EQIu5;kM{>Wrho~th0Y1c;nZI3qxZ9|QuK6*o9 zclFyzfGxkR+-qyXCH94`d5j;Y;mO90Ab*U-kP9oPSA&}9f9N+9lSIoMd)sG zk}5bXC_1v1Bf&U|T3$AxbeCL_uVhAmj0YaYNKSkdm?}s;;6RKWNuuPj@;;CwrFfKL zRmOjX=+tLq>}C=b(gC_;zO*a{1PI(v5vj)xQdmSaW*guoO2Ok3BZo1&8dbRH$R*Z6 zK_wPJF@~S&`se2J`xK(l*;&RMns zIYPZ{*}ToM1&%-dB%5B2sUhRaeRNR!0B)M0Lig|({R5s0{~!_wb#BCH$YVTtA*`JJ z+cq=dAPDul3)&?*Tds#!P13Q1c_1)n_wF4wy`K?vY}`P9LsK#lo(@K>ROoV*Xc@FqY)Oc`xIQkhiD zVo$X4x+L4NtJ%6+Gi=tvAncG~x)=p^`iXZ=>Q0@?K+g4#HDL_h;;ysSg1W|HH+nYRz z5!;h(m!U3^4dA;cY-`$kEil;DV2cjyEwJ)*i&^5fET3EYwGjhH#P0HX4Z zNv!7tE6f2o@r1`?jA^Nh`QlAl(?#8t#2NcOd?j;h8y86lJK2+l=Nt5}aBwQg1LMD{kmIKYUtM#Cz z<}*c105e@j0oh^)rSqKB?#^>-jNcvRUJB50-a~r70A~TNpBPPIAjwB(gli%2M8K>h zXBsb_g&s@*l{$L*xiJ}|GuB+*Ae!Wpla+2c(7$`=5C))sD}jB_K%JN(AiN6+i37ut zm84;aJj6X|Lef`ST8?pRubciit9Ax4hAt)7u84S+1Cy{DX_cmLiJA19E0;{_zMZN- z&gXVs;;w`1>T7qX8|-4HCr@O`J&YXBBj-HKj?b#gWZePcv%Yoy3dnhG_J{4oxtHTl zqkRAa1a`{t9qY``*}T4RnYE@DaThg$e!@=cd&|Di^kdtaGT(kM$M{f+J^?8vzxN6wU_e% zaySbFa}oEwTJU?ANyDHru_o)fUVycQH|W z%(3_6AIIxScxdUy2;dD-G`F^OBb!8~49F`WRdFNC*Tu|H%=Hm-ljV(*lV&;jbp3ff z0rHbnq^DU(SXVAzXh$7cMJ(Q7Nx3sDso*Rdm|%hqQuNFee6ilu8Ye@h}4&n116fC2@f;<;;$QNL@1XUKOAD+}b>*Dqll~&!o_YO~T zrqbUHgb-+^GmbS8pVX=Src2mI?zru(wU*Y`VwKGNF33a_NsJ8xnylT|jS(=p7(hi;IFsZfx1=Jbly!c&-h)Wd&Q%T_W8aSY%@NU59OX}=`OG1?BF1p)49vC{_;)h zU9if!PrJeT#YThCGHblUJ~sB6J=&9H>+4Q&>nVd=Jp%A@^7tnEdHFsVIVJYRuKCuR z&SWYvh{)M|0H+vT5b zqnw4AfFLq?u6*TBR|lJ9(jopQzy>*_9+vGzH!H z7qaEY&9yTwISDvA%pRg?kx_0w*h*2Dd*b9K!CXvsvMG;^<1uwT*%lCyqxp)Fx~|Sm)a_@8$~$Ye0R$?@&}ieO_2E&LRzBNu1>`7q z(QDVA+OD#;aI7M4<0k$*4CG9D*qSm=co@i;GPh##rB%269@Jcn91<$U1ZjEw1nJR{ zP71_AX95}{StE2hd4)z2N<$u_AkSw!wv2VVV7UwpVU#>hcR$9oDyWTPWBUklQ1F9u zk;)uN0a8k5Po`ajAExEFBL9$&B!Ct-kt$wnd1g5(>C75(}(_I%Z zQe0X};W&yMB?!3FVVf`^{=f%TTVq2L=A%8<)!BzvM3${MW|5OQH63WNHl|x0b;8N^ z4v)8X&0Ds5^+_1Ymf#_AfZ_+8@uDLrz>;kXzB_yO?YDl7cLuBqQs@jKe`&!ZqqwZx z%ByEs!_F-n0!m2m0Lz591tWmzQ!AxU3+B(scBRU~JTz^ZUp z!6x>D?xz$NsT6L*gSptlGGBr@g*u2dn_ss&ZhC%odzM zH{G-`lDHngNtss($SG%Hg_13S1TMi907Eh}LBW$S$QGES$!cMW`eXu%K%a!KkJfRB zuD1+(1>{6Y)CA-Rh;_B)A=4ThOE2C@)0#|7Y11{(nisGkFvm05mhmyKfkZW7%6%x1 zqh!hR((zui_KpDE5lJZ}uTs)POc7WuPcA9g^SE}k_{_)yBT0TWLYwKzRxsMVW_l59 zK24RO?!p|oAIXG#X)=NobjTh@Watd=LmFz$oxQf3DR&(JTfrPgqVjmUS9;F^r?R-8 znSj7*5Q+gMhK3uI3Zj;**Bv)=*83Fj9V4?-cTbE!y{8ls!_wkuNa(z4Bp^p?B+O%F zrZGO9A~%QkB5JzGRAS_$@pS=Lx@Ni_`n?F1YlLD_qg}`MUs zNUP=*+F7%5DTKu65_>fTrb{Zas!Q#q*_Yulp#mw*O2_)`x}CqU;-2mH$n1~U>!qh~ z&oJDF@lh3OwXfHI2Op*!`*H0p*5${8iPw=k-e=c!-)#$fUbpW}|GK>cBZpFnmyu$t zMqaY3`yRDTzB%?t_UU#Yt=vg>wNI9eY`3q}|I*$J&a>atT(MfNYdJNaCDFnAi^DAG#~xtegV zUA6sZwh&*EDCcfyoFWupE6kZW0-I=AE31&&E5U{?(d4Qmi8 z>_%`4Bnh+DBi7uaNs*k{RN2XjQ!otW)fM4+1%nLBFNfk?^B)SP0c_)smBxM#QoQG7 zB-@Iks_>>FFTq16CSM;sP5OPvhG7i_Q+WLt#>QG+@fZfg*9kx%9g~{Gqt1UauRWPK z5<{LD0tg=MV^0&-1rjSh%Lh*YlK{FXuT5&`46%XmD@hF!19QslQ-6uspZX{v@*`*b6$ONl+QFxe<^M0!F7o=5*kAx&$;QYAOl*^mrX2)u*aW-yS|Cagt1>_)S z4g%zmFOqrMn!W9|7Jz%e0Xg61eBi7TGjgKc7CirJ+qQYF4PX2n3)QZ~KZV8&Ox5|@ zp0H||H~ptvWv|x)9q zPqsa&H4YdMYpk|st7Y7Mvkfdb-a1dY-iF0O;e4zE$oX{tOZNKy4qG?pTx-vs?EsDO z*npiL+G@Y7*zbUxFLcZWT)=Mz#)uzpnqvmGTJ3NH5^Ut#NEH_rM(wPs3A=yGnBCI1 z%6c=AIdaCN;(_>uz%Hvv>b0K^*4f^yTI>q|ujuO@vGqACdF1EpV|k8?Ju6>MynDoM zQ&U;7k#kOs2Q^3>z$5QW{w_wZBdEX#qK9keUvZvQEv$hl$hn=vbEMW13vu{Sy@3)y zEIys=i9sFksvMx{Lk8}^8%e61-<;Q|*4~J_BJnz4{3CNU0Gt?JRoa_k9(d%wFgHi>l_VK%mp}6WH;tJk;it7A`~otcKU@>tusdmjamy6XXetDx0X zPjll;yD?`w*xF+!oOgk}`NkSIrhNW_Bal2~+4sKxZJWJdmVNCz-(yNf$ad}8$Aqel zXs0*PxgN1aOO9Y_Q$Evy8qvoFZ5IFD`R;o3?{qC-NQ9xR_VtaD{H42&z6?_%B=n63 z>PZyK+>{$hDO8+E3L(SOboBU2xOE^TBqJUzT)J!67ihZuxiwZj|0Hy{Fk_@@Q(-KB zlf=p3&IC_Ktp6o^MRY*8;!*b_e$NgCfSfV4%%piu>R2Uy?|mRgEH9bE%6mZ6c+W#X zU4>*Q?d3IH6p2ixn%HGMZQKJ4_j>R<2qWL~r4}PC!Q&;X%q~8Y*5V|7Ol2VF%YW~* z0|ySc`=LZf43<*Xb4h-dwZNEgtTcftBnxFot7gwEw;U!e<+474@~Z)i9h(p!2>S!m zPWpVTvt&#WyKOxZz5{fxHGNG6fhsfACDZ*M0)Xs8!lOh{Ku#rcB8})&;ja(X8`K-D9@{{nPB9^Sd*eiN8?jswD!D2#RGC&D?gsR zD3SJn2Z2MdlX9{EFDbg>ep-?sBp5l~n)MhtibL)ndNi(~;)VRHWX>CrOq0N){o?~* zPUW>^kU0hcz{-&z4lE9s6Kk3$Qx*kf?e_)bx0Lk<=-Sw zO0Vaer_GqeU28U_8955Aj*;X3;!)+}9yxsg2T%O{6$kR4H^11q(fvIm~16u9d_f+A2M2ai##r=2X<5H1xyl~PI3C#+ zdz{xQAm^*~zp^)I&itn8Gk_O>rfkLHaJzl3`A>FY+oSf+{MGiy${VddyOh;{bU4&$ zpJ8PA>D|xUcgsF!FXf#`%-6odAa#6~-PZYITiWm@>z;js;rIZ|moVVq%XOF7ALhxR z8EKcU5ncDIJMXn?2mWS%&AG~ck$;hmV&d*&4^GF2=Yq!j>;r8(09yc2kuU~eagJ~u z$B09HoVk*$=sJWkY8R+e&eX|l&QFno#rV~J^=Np?HHaGI4#R-D^38JRFh#N?&5~#h zA)l6HR5GlPHYLC*=?7BKZuUB+=J`d=AE%}y%}zOKKGKRVViHnnU#&&6%dOXsJUSWB zJ%~RUlf$BI&mpg&qc6ER8&a9i1mH~)rmAc*2jWE7OQAkuK{t|d}g~tnpO;$ zR+C4E(rJLNH9*it%sT>dQ9xZ)=3WAplT7Vd1cA{aIWup^x`n7g{Qq04p< zS9_0PdfnyU1Y{%^X0=UA+Gl^RX|>;e=T>{Q=40kR=?Xx9*pu9s*E2}L8;3^he zP4^Z{6_B&=1Q`QTj%RHBQ%~5tM_gt5S6mJ-giHu?@iRtu*)L$^taU)n zJnP3qT>e~{u==iUd(c*Q{R?}5B%3pDhO->tfU!UA3EDTiSJ^;T3CtqE3?{eU=zGgD zcD!cyXJ2T$XRhSDV_*Ucbk^3Ft>BSw8*K&$s{~vuL3*|5Y8W+Q)(k8vp=(G zLMYD{lRpP0Tn3M%A@y3uda77AHF}AcJ0eWON5u8zL zzHC^MG(e(Eu?!(g4yk!et{>9ojps2lYHMxX`rX#rjbw|nc7*%i7ASK-P9Z=}f)Vc+ zobh+zW$qr3<5?UWHaniwL}Q9Q*N5#Mia!33W~PDLllab9)+-E+D%>~3_EXpTDZ6vxO(L*HInT0zh) zwqO3{XEt}~Lc8pfpMv?IWH4rLzrDf!cIQ1%D0}VF%RgcRbX~jg=NTknoO#4z+qrpz z1!%8HuPe9xA-ei$TyFt6VLAXR^6DG*QLL9bS%r!u0Xe#7D%LgXR};EaL?vWpNfh5v z=(|1)=7weX%;8pd#Hr|qF<*mUo#d#s-T~mimqYz>93A!jsXrcD$~!Rh@&5#J-1>PR z0P=twuU=N?$9>9xM4n5$wh6rkC|0SAosCSq%{tp@qdfpUB-*LL9!r5D9-b(GO_Xk# zNZu|v?fFUFsZ$xq`T9$Y39oN(EDNm%t%I`SLMzJ4bly4ox7LU*e%Z8as zQNkm$a}_S0p|CemEkQ|k>>i$D6k5^{K$SZ0V;Br_#} zledW*LrU_d>sye`WGW^DsX)xg5ZlSy!-KG626>I$9ldq{c3(YXi+#irKP(9CiGU1k zm90`-X_{0zQ~v~LjSv$A(r6UCOElR&*_xy~JxV?7A+;3a6%#JY}%>@|z z!odBue006toOgq5$XUv65Cd+)j^b-SYW}5Fz~=d3<<)jy&gnLWk*Z$v5u-coYYo4& zH{_91{z%x3g3F`ys>Tc_&*I}!8c|Ed0> zy;5)jjTx0^0jn9?Wj}BIt}Qt5nv$ug?4@4nAy` zxBt$bEV|TwS9ZCD{1`s7AxbHlE@^zx7PP+taKw5A&=o^1E4R?v2F5VV@AdpQ_*p+- zO_Y6*ho@E!Qs!hCraD6qfw$5p@pm;Oh(8YRAU;OmSY4j8XcPl0V=zeUu*-HB8QT>E$2(M zb=pS{JZjJV>29k({mT|P?mXD5M0eKl%)Sk_@*j8Eo<(Qb+p|t}%@zH3Oxx>r^y|O1 zeU(e>m1Wm5(N5@9U0nXPv)Ot4@^7FhOj*d!vwEu*=vD2zG4H5SKIJ8 zUuOKd)_urkMcVATwnuEwW6#(-M}FKkANvs-V!vz5_-WxS_LGubwl-2~U+P}yfE+>v zQ|9Gkg(F(NIR&zLPIVRSs<6a`x54kG0`u~*&HC-0tl z(!zu{4zbDY376%10HI;8 zoQLJ*=FcuRAN7aiks&7ChG5YTvZs}|s2-4Ub0#ePQ06qNTCmibckQ+H)C(;Wuxcyj zpadX(B=Ty-A%U-|m0Tm%Q#Kq1awfGjn37L+7|5AIw`H<{oS*%^$`u9bLc0&)Bnn^@ zGLlI7$s&i*ZAuc94#FOwIv5Ez5jf;eL6A z2_TFZ1;r9NZIXbD6XYea5|c)UtHya|Q{c5Ub^zpHa7<^ed`6}1ZD_Os^s1+xe4Oiw z`2l3!Shp2cLmvrQDcw8(D>?un#tTcQpM?)bAzk?$J9b)C^(qI9sqrqZwAC^D+dYrk{yp`KDb5FI65}StLR^a=-SgHx6wXK^9HI|U zqQ=0HfG^zJ$U6lt{W5Q$(o zb(+mv{y`GuOmD)nme$>>rBeBPb%ni>h?W6^q~*B7J88_}w% z1a2$_Ul)j^TkMWbUW23>9$UlfdI*pUq><3d8_7?nlqqB}IO^fib=(seN<42sW}8+{ zQJ-#~yy}HX-KkR<$hqm+R%>c%a-Dr8H2Sj=#zY}&roE%xne8fB(A1)tFz2QN=13+K z0JPNzd);Pr`lUM;sFnmsFu~)Da(^28dTjkWo81HnKWv>rd|d<-Y6Y|+!wC@^w0;5< z>1DZ@4$O!s!PV=CvqedcanZK7cqOkcp`+ znkLoHG&y}F%-FrjXFi}7bze{lyiJK^E*{0z$AuvaPgbx5kiT0tgK@Yrfshzh! z-IA7Pl#+8mPr9ljBwnMEm+?P*qAgVb2|rp?kZt87dmEag7MUj;$eYopByV+gW4X=Q8#*4MWNyWSBFmtJy!A z%r!*!GR2At3tR`ei_TzKSqUS?F|_C3g%~yGWaD|n&-CKGB_Kx=_+)Y|lh;&Q{VEQ( zGT92BRc8PhDJRc8Xch+WF)W4grGY`+bVZ^-UF;;Ysgfa1>@E}+=^!r;AjB>oq-WL{(I zbB}Tbi?-G3fz5VH^N+05-)+Avx)vbkc#M^^oaA6hXs3N~|F3O*daeDw`Wh4#fE;vK za%hx%zWz?TxbY5qv)~xJ4H;Jhk{+VF<#X_@mc_)b2xoSNVo6T1?PwXWmM+ExYlU(yK^Va20@j;AZO&OW5)^}+ zc_`~Q76)`bis5>&Znpa>`n4>U6}e6ODVQyK;5DuCfitpjd#AyleL=SH1 zEf&I8WfVYa1R#L^k4uTtk?klXj{&l4Qn|uFW@fVGXj!q5Udt%)3p?({Oft>e4)}hiWeN}5h=Z&OQ31218>=<7Y7}%RJ zJ05LobnHy88RoHd()}=V$c-BpoMZK8Ue9zl$&Uk8$NgUX)Ganqzs+`>cCB?UImLP- zOk(67Eoox_qd;80#P>gcW&0OgU>g>m<6^!*yQ5lOvlG_bY5N#g{``?wST{{mG1to& z0CIK1{dUC2R(rbWG<$m5Io6&lm=-x!^Bx=j<24q=?0EFTo2)m=-h!3W&EE9Q-0OzRrdP2 zH!ZI?$IkiGWlU=elFOIC%BckS$mIQdJQj~{?oF(69y2ZzRV^afRXi_Mi^KsrE-Cid zIQabF&ET4hNq{(F%SE+UiPbSSpa!JKi!%iod6;u^j48A!$f}b8Vf^U;G3-UqCL3kq z<6t*uBYt)fa)tf-4sh1e@L(80#oYNe_sHeeh!w+z_3zk$7$)fz^I-MndbxGn20;P9 zks1>(G2U?1KR-6(B!kU)1T_LV zD7FXGcoUD5G)cCgqUrydmgHWE0<`-DH$_8}t`3z(=(R*R9DqV>TIUX%Gb_ak%7Zq< zG=T2*HmjLc>x!=d3K$hG#dMg*`JGfwjSK>9!`>Eq>-Fsppen7NZaeUM7zHdj8xz1F z425AjYg=|7gw-%gcdY;^!64uW{t>VnM6FJRZIr>}8p#cgJ$AMAcQ9_5M7cnwuN=%7 zB%!If8H^-F!nM1esW7?L)7|ez17|?1eiJVpx!g|0<3ZO_V}W(}4da0_ z!htq-`H2>#_@aDt30%ULNKfn0Nxg933g0-aqY<(C@H)xyB3j>%dnb6(I2G02xfeeH z-Rl-h!gaC4#?dq}H+9H+4gornT>0r93UH8SSs%%a(CqEm41-}W0F@}=<-D?>oqx_h zCUvJyWgzFPPcZFBmT718bfyzwb}Um}nG1{I zqU-PDx(nEGQz8V&Nm|MM9pDzp*QvRK@tA3u*471}Le-GN+G;q^1S`XvA|Y_6guS6r zp{}rDPbVZliW{!r;hrmYIFJVxi;8{i|0JXeDVTfuc#JT`;D|=yIUt9Q8+%B`!`*nv zxTzrVMCHAyX@~qfA&c^+SV_v|O|l5^IAW}&vX{idc`ph2f2<%U9dzcR7&Zf#hIoG? z0$~Oj#dj}Y#u@? z(?Iz5$TV7hK{8JE%R`4&s7$US#E)e5>JVV_yG&6T&^6_H$s~9F+*uAB zOy|0fbKlD8Ldw5MhR6E&&S{6IR_Qu?Zo3EM=zK~@s|4h@QNDb?*Ga2hMba~5XCkdS zZ4UlP02pGvrT94GXfixod#=3q|dJ2^arc#+-XnDIvZ)m88*bvCKGQ9 zCPwV?w{JsM8@8ub-em25#@O;(xlFCPuH|lkwfvsR`DC z5aM*!+1lBFHS?~w4ssIZ0q{5NoPCeliVd)S=3Z*gF8UO%6rR+&0Mpbf4m@s)8(yLK z(|B-LN3cCd{F%0|J8TEplVTmqz}<($B9HwMKpw5BILR`S7E@1#RPI<(r(2B(6;Ax& z%x%5Cy+9nt6cm`l&j`ek>{^Ab=z6JuPC?>X2+xpXPX4eRJ!hKv`d+0-gL#(&LkWMr z(HK+j0+kjlSYkfn=@>CO(#|x>%s%8e??BnuVFLg>S|3hMg7;KEa*O_9P0Auq!#hv! zBSmoygeweStYjgeNp>)|f*HtCK&yOAD;ffj?n}zIpS%>Yr*?J_r#v7>`&P{zy=+c_ z_ZmN1qX{tQ_wy!qLZo}{DQ8YkxjdvVy3|7b5Vo}Q% zO3aHf|F|_RzQFdMeS`JT$ne2*uNZByqn^3dqU5iePy2$k&N~LS46&EEu(D~5&HCq^ zw*QC^*_#4#v@ThbE8E|+6W_eub{5pxzgAvn?WuX(OurS;NIbRaUOQ@Flf5|o6nnMg zWE)0mn2gM4QQs~*a_yh&K;dkAbHzt&&{yc}2xgA8*;)Iau<*{;Z1dcUZOiO4J-~5ka^O|MwVV?VGgChhr@^pYC{IZJeY z3mnmzH$e`Q8u!UbRldTxB)^;h`&ZtVn!I)VNvo`_qZwdimz{R`g*I#DQAo!zi^niH z32!j%SAjLIQK||Oz!Rj(3xP+N=#$O z0d*wRbW$zuug+jKNucl$PkG%mM&yI1$BnWd$EX9suy`bu>|i2rFCg=%mv0`te*iy^p0>G+a`@Wy0o=Y-1g)AqN^hi1Gd6iRIaBC%Og1Cu zm$%P!#kDs<#xnz(pfeU4*7$CE<$O<5QhWqYNvlNJ9SQX~BwV9IH8wm66Th5njko21 z8&0DuRZD?Tg+5l|{y4{j_bf^REwrAIVfE=9aWyVYZ9-=c>TUYB6*&rj3Q+R*xtlezuUf*i@ zxy4S?yRWesgVPba^ujZ2xT66CKh1X3w^?f|)K8G~VG5HRSO<##G8q=(x|qo|XP$p9 zo%aEPF$RkSZWYWKB;47^F7h!yRn^puvDvz}*1IV<*#z|BnG0=C{Q(lQcBX>m(814w z<&U-$>zw=ZEA{ya!3tBmvVkQE{bD^$b!uA>W9z9$W*%MFz<^v@Q<) zP$BLegf10yYsXO~IN11_Mzp#S(UMYmT~6^X5`o4|esE5<8jnl|QD&a39rr284k=JF z9h#7Bvw_fN%PEl0N6_ZaT05ybb*ck7DwefA^x?d4ii)io52Y}j-?VfR0y;?o0;lDq zkO+Ck-`eN$rP0R(6P;xEnWltNy={tqA0Q8;VSI2#ZC_KHwe<{QX3oR~st5T^wPMn% zQPg4i1h7_$bJ45IG*l@OYfg`y@Tf_c5o?WVrT8>TnKc(iOfDcJg#=T~ov)-%om$Jbc(nJmwT*$fxF|KsuUR{9V|A>o{J!HecsjDuug%zc?aBig)X8Z68 zV(d8VrIyAflCySzaNc9sXFW`s+Cw3^6F;p6CfBvXx)9Mv9|Bgi-l@rmnH1O*m|_a( zzWMn^W(G1ze&#@Tm(l-oiEB1&nIIsTes@#`%Iqyo{L<8`aqfvam@;FZJG+h~FT`U9 ztg52YMgg@I|Iz_*<*lJ>)(Im=5;Rws5I;(gjma2UUl-%AgvnRw6rrh_a>jK~@!iUM zd3)D56$b%6Ut4&Qy}Rflq*WR|FmBV3^{w9UH@sF3 z*q((SvfU+1>H5=uW}TPDdhFEazsp3MG<)-d-vG!#5=iEs8ym6Z zuj3Rab}X0JafzEcC95||qDYFQ*g%j3Nr32m0L%awl>1-%ouPDc&$;(}Lg3#eY=|HT zOnKku+0Wi>Ua={_U!!`)&C%U$w)V z-ebEi`Y6p3&K~lJie$gt-S&vB!To7g4Fgq0G&bVAwvp+Gb+*GGW?g2oj^m78Rp9bh zDuH-uQpr({=hm1o>(`Qm+OB!G0eAVM-;t&@mzT_|# zodM(RcRv0(&xtzr{>UbJj<7!&`)*u~E=jQq)+Vun-+0B%bnT0+`}jfYIQoL+CcEtT z^N+*+9rn1bz@rRGBIgN4AE#hQOjAXR;hK>WJ67SC0gJ(>Er{n?Fc8%kktT|?bfy8~ z|84KMz0@{7kWYsc z%Om4<)$vDc!)uS&D;wTrFRnr(#~UtFc1inAd+UL3+u8hDyMObitd(;(dy*!|bdHtJ zG}#i&N=^Z$o{3hocjQt!Vq4>JS(;kY zh_z<{U}wmD0qsdGb>BfgZk^I9(^-ZA3IB{bt!D~cZ-hmv( zsxo9l4zM##&Y|t-W0)y<0_o$;lEcSY4LCr1-c4wBRod!Kz4j7X9LjFxMx zo1f4$xAx{V>!NAA93V$x#~KfNGmsO2u<4IzZNmwjR3*+X{G zW(2`XDSn2qPJa0SPE;tp;}B7RmXAb&7cE(2V`8WT7C838Q?J;*SDP7;sIkhbYHJ2q znS@1j>rGeL>{ySLAxyga^=2CymU9jT4;P}OyvT!X7X?lhjF@-5=WeS8%o#x_xxc*~ zEg`wSAREGz_vNFc#&XWZ58DedODNv_)ZSH z4x)e$0vc>O#(|F3N;WKm8T6QD#~lF#=%WaEmLBs@Ox#54Q5LiB{lY_I3fU2V?ZvpOm{r$BTj(9R76>PPCzN1 z04R~Aauf=5LJT?zof#EStPQOyfssjdo3(9II!F0>(zG0A$N@ieR@4xIpkU-E%Zn?PS-G?Su7qq6a_>Fl1PyGo*(!CMp}? zkk}aHjd|?BA~d?n7~@Pp*Uk{=0??HN80`Usp&!U4p0WbIUqC^xA~ViCO=#Ai`;cJ# zZJcW@TDqLb)~#8|eN8g@gdjDeP6>2>Tx*Qy$%L&nJT&Y=?}`@!gog+FtrTneQvTl0 z48O*!$|*=A=x!*s$!dKPfUC2;%l4v?6X*5I1*i%k#QV zy&t~x-PUsX$86AbA7qU?W0hlVxWk~KgXJ)sH}3lwx=xw4GJe>W`~-Fkw%3R6_#0fS zV3vx-!#ddb%D1ifiSO8{>ppDzuY5oE4R#zrz%0#~92=%lf_LC9bpQY$07*naRM0iL zE|V07Dr?k*Ury1s>IWaUA%KMw@BRnt$*<>(R{?|YIY4hQ=P1xHoqpCvm@YPeV=?Rf zqSt<6InRH~_TTY;+1Z7hKjQNRbPz1Z87I_lQ7lRPdjX@lYku(=J3|+}^KGBC9x-Y7 zzRrbh2k*Di`#*2(mw(WjF8>H|DiA-doDz_;!0s=- zm$N9_nV)i?(OwfHNBS2Ukx_ae(*p;6+2eY?OczWS2rNahfDtF4Sm2F7(@Bk@5_hsS z#z8R|Vy}c~{#^E!w_D@7%WdKEwbt3P&wl-HU$@go_S>opue429+~kf_L&T}d+U3>& zxRYIwXKhXUY~Rxl*}lhrX_M?l6_A{M0Z1d3G%r=oWj;hDEuA;(wP@~wb>N^Bdr&M( zXCF|!W`Ghu0z=|p7wlyA>Mhq_=|E1vOh^Ga0&~uFZi21)t+l_J(>?3y#5`r>2*`PJ zvFuF)x%zP*(}oVt*5N(G2>Q+Yci9Yjkpc(Bo|28cPM%!W-vnQrT=`ZzcEcyETj!#j z0{Ni~8ZA=*4a##extEjd!}4&D6t={ zyxVqFEVn$yvEWF;)>9&fBd8vi^F{hN8bQ1Sw%wnPKhA3$v@aC>o*jTOAHgXb=Z#!$N_lZF(br_40K@RYAZmsGI7Gb zv8;nLCTt%$x!O7f`e1AlrlI=TqP=!adBQ&3R%g$L*Ymuv216sZsrgx3_Sn}fiq2Lx z<6JtURd+~y--#{kGl681G$;fF8HDAjvoBj?*_zJRxFkAndFat4rB%c07Ypdhw_k6o zufG;>7$@CGHEUkJlZ<;iH014I|F6Im^=MRUs7CO-R`*QWdVESG*$_6Kf$20uvm*op z(&SVn_bLe=t69lw3`37`V2IZvfHaE{_i1vPIC;7re^Q_`U9qKaXPh<*_6DD$rwpz}$BSwN)7$G&qRg$_wO zl;(^~oNow_+3s5I5M-fkhSVt!0*zb!D(E=c9k|f^PlCAua-5A5xFe;3 z93Kun2lS+zYXszs4O%fYLu?9BJH~(phbUq+pI&Yy71hw4hv-P3rXU)&lN52$C=N7S zyYfXOZKxFPef1^Aqr{S6)|lX4P)IR_b+p_%ULd$nK(~}Q>=a3u(=_=|qM)L95&_Xd zM!Ph&P=wQ##z^E?l;n4FDFXHP^mUb3Ym`GnGrnWozl`ECTf9*~PC18*#%w5D0ZGCX z`br$LDHH<;O&|>4VO?Z$C`KcIFciW9aP&RBCKbmbaH+VYHNgR?d!4k(A`*H=L^Lvz z#FlZ28EgSI!8nf`A2gpI%#P1U95tJ97Pq7(A>cKL1vW)TIxv0=03^3mR$*E7+MMpx z`3&Uz<*$3}`0?Wb%T41|0IQXZ%q#+k^zIdVL=H7kSYmmAbs12716>-~ZflKjb+bqv zNL~a_xRAKBu~<*)5b+7j10!nM+Pct{V$5nBot5@ZG;*XrC7m1AXt97CfB`+WfE7Ky z{*)lEUX#|WfC2|{SfhD#t&=2((xH(yPcANR!{}%X0Ne=3k+5!p1X&$9pKwUAR}?SO zY@7gaeq)_a`2JR69k^%7RYV^V0XVQv#3TPZJbc zV&n*n^$)!cfNFI&!*nC_i4|91b-Hn71ETJeR?1_S!gv^^TQ@>-Ov@b*Y}9rgIb%&7 zy*2<1hv^7J-+3H9|9wZxN?+`Bw9R&=8!G9H8CE!Is1 zK(c_hzMd`sw`|LYQ7CPj%F0UEI$|^hT0L^*8$(dC7rlY3|5XlJkfLx7w>vq@Z@8HvcK=#ZnCKv^EIoHe}Rz;~_a z=U=kUl~>u3yS`*YFfudvJ(O~6<@5Ji)ni|`-c=V_%bkCN77gH=zzngxger*z!~M;o zD9j>`j8F(IjGwhN_kPT>2V41_FWcc2Z(+QTvjMO2kg`pAFvqvK-xA{=mfnRAZO``C;Y4!hAG=e%#uzHg}!iLYKXbkhbVj?Pr2%uG5kv@mwg+QT*VkT#w-!I;y8dwv6IqHy$ zd^*A3r4^=e#tgvoRTo@nTd%$mc15lg*DSS)nnpYF;!}2X*E3jxSK89`o4n}~VQ-#o zI%z|UQEj^HQma|EoG$&4eea8ZVkcgGkyyZUxNecyhr}vptSUc}-k@Gnz=HI#W!G#8 z-1}xY^TjHd^6_<62P0okpE7Ie9RtWIwwuMs5x}p2<~lhtF$fC5^q+dK|GMtJIoz?q zQ~gE(Ih;2Fb6g->dpHH;jL`6C+J|dZw;FQVkIH9ty~(eg!8VCT&h6H6(>*w{0b+V? z%bMaAL_kHoAxeNRV12DQyT>lx`7JBW8nx%ve#l;4bR(dqGzc?nd)pqn<>)u9CO_Mr zS#XIxP;(RGRp>8q*5^&r1OZT0SSU|+0u*Ih9}Y;H#`oKwj^A&2V_o*6+#BuwqOGuh z@)>nR`;4`a&4Lbd_EgODy3S;KGS{x3#eTe|*>+7Yuut`@u%X-<)(?A9ntJS8y>=f# zV$D^?PuaaIS}aL0``sfe{PoBLr4VMf#ir1^ghCmjdswDP^`{yimAFI;XoU}DZ$y+#A z#q#G2&6pO5!^k?H9J<~t^CpiVAY!L$O7dkEO;i<3Q=GA4u4_YTc!p+**U@898$v zw&u+fo(FQ~&8?VwAm{J?c{zo1Fuo9$K7|)M3_#E=7gcv^hUn^t2gNoW*;$;YO7fQx zFbnBMbz_Zt8hwXicZV8X0;+=BJ^Qj0;>8vOYzM*9i z41EeES5Wf>D$1hJ5I)4n$&JxL?m1zXZCy-)1nAN;YPp%Qy!lGcW5 zvp>ckOlpMCNrdwuT-tF2xH!e3&Cup%ErgW{Siw^>mZL73C8`E)xmIG5K0tB0Uo zP+Z_nGs{-4wA=2wi-RSwG?wd2crs=QMolJg%__(%a@*zpVMbE=+vrH2#d`cWES*{o zAx6&1>#cF|GCOwkU<%0>7-Z<>lvtR8yS!$Bwea)1pL*Wir*tSwusKRcd<3l?Y2nDS zqLA+Y0NwN=DB|hss~(CM%yRN^)<9sPEVm&6BeNW?Nwjh{UcMa$6C+n7;31OiLY#A` z8F?La76t0~xK$7ml-x!r9y2rgJy}%Jl7Q_q&i9q9i;0s*A`zmHg%jk!Oev!*NhvY{ z5@q0!A^=d9s#7HUo-DgYN}#nPouV8)xyEfsZgmjHU^7g`v5ce>tkEB>yRwQrig6O} z;zM(~Q|B{~^M&VQcJTFsLE=YJsr}S|#z`IYc_l(wfEel$E3qj65R}pBIm_x4uo{Z! zKEmK2!4w@+q#RKb`fZ{hI=r(?Cv=ctzbLq{Dw- zteie{dL&ftAD}!L6tqen1$wTpE3);=>j80Q0dW9wLWrWXUj{PAt*;xcgkv3ctP_0; z-tV|ZF?4-#r&0(MxFS}-46MOf?w@pq1mqO){Yl+k^6@Hw9^E&ACc5^yXlsd)Q&oy)2Qgs+P)uW0V&?=F@3Ri%3^T$}NDL_k5FUaB zpt>%b7$NYj3btYy4uByFc~RVl0JO$oQN_4V&8OR3$bF!%$7-r8?D9)5wxfp*vPSxx zB`CY|5C@YBI+??d`3mHG?BF{B_Ni9in}8g_Il@llT6O=U&v>D~c|o?V zE++n~SaA84i1n}z+it$c2Cw@Q>y`jLqZheJ37Jw9v35f|W~Fzo1(8&AJ4zWVSoy)>*OGLh%9^Ij~@I#ia|`;^c_sAKhi0 z)hjIyL-v|o-?jW*KekR1xszosx1~FU-;Gczeya-vI{Q0#F<1A zi2skj|GLGx+imftO}2X56}Ec)7K`_`*}whm-`Gg!NoT2oY;#>yadK@P%#p~v*oD%; z(HLfME(`n}*J~p%PXXpkh+W9{C8+*%%ZxSkjku%d&DUSymhAzM6NtM8Lhzn(o!h17 zft)u2*8d43C&|+gn_FP8x7JV>8w0;GWBcuy6g_tn0Q@3F(HZuW-PG>>&r*J0a!;2*7eqMz}@ zYI|kLt#+VcleNQ`iAbA;F{Q$ZUb}kaWms{uwxi%eTZEnX`^F!(B@F7G9?rF&=5Dk- z<=bqCQ7%@H-~A%a=(}tm0PK`~e{_*u5bCnOC^%&MG8WihkFK*JMzsVO13BnGJlAxc zB)_YY(_Q@$n}HGk-`fCvLRgh^PUXT4U(Qv7FsKaz=6t66kion``O<-NLhGV66f`0r03|P@^Xbn5q%# zNd7GQYNajSa=9&7eK8GM3BU)24M9N>)EJ7!8gC884F%!^O-(V4rio+Yi2>qaf<_C! z#5tOTi4!7DWrzVUT|dvWgNGICNy64{1c7{k3^A zGu1lM%dfUkDCRT!Swez?E=9DQf`IN6fX1vKa}`S|hK-{ZvL02il5>@hJaH(9twG`G zsIw;(fjfSJm6}YlnEiNu{&?m5w*SxJd`&?h?8v(3MVEK6CZHugadB_GwdiV(#F(ma# zbs0EpClid+!Dg6(RS>x;9tEhghIqUju2UWzeK8`OJp-7d zBvBoCjk?IGN^{_GR9RJQ>qFg3{jAetQxto-a%ludjEaeII#+0k2;k98Q8BLXFWJ;G zr#p2%136#Xov^0EhZ#R2@#z_2--T@9!YalE5k2JE=Bi6faiIhY8acYfL zX>=f%JC|s!r}ZlImC^`6)jnj6PD`^1kYXSavO|p39Brn^kYy$#fnmTRtqZX^B&x07 z7jtKly)`XCNRl0m5eoE_;BgkOO9_`oZUppb9}J=8&`k`|h^9uX#wcDjYd%ezGCdof zPFVc46RQ+c6gTvDft^#t2T`0gk~qOy(nykGh&}^dAPO@TKpL@9tkJtn0m=T@d`^od zPJ$XDDOGZ&aiTHY?S^0sQHyyj(>M#;!VB*@C5v_CR!X9+k*7lG+whnJWS}R`;40S5 zXqJF6I&h=#eUgAbX*~*!E9JqyA$V|I0CITmIoum*XU&S8#$G8w-y%epc0`U-yvGsQ zp7PrB^KctUjg_f@Q_&_+T*bg3EI=F=V%opo=!-6o50VN&c4kD-UrZ}rDtvEuztST{Du zBdagRV)#*u9Nb|iuKNQUs6YVK1%wrsuy0m-MQk&5$@w#%V6^nfZ`vS5SI^b&XKiyP z(GZY6RKuy~E&tIU+TfOVSlh+7B5?ySjH6abc+f8H*lBeLKC}4&Q3nw^&a*47yvknR z{W3r%=bNq$Yd%9~C1ZtC#3hYrNUTfyPi=Jxh>!4ZGpu(XU2tuYpy8C({qp>Tb68Ch zMGXnL>r50qpt50+t=+N-W-LuEsCRj_jeKt+>z!55ef)KM^_eFTQypUO0CdR&fLIWc^QE+49mvs0DjFlw`*JWV z$fcyMC%ukw*ux3lpLDb`Bl-4ZOWcn3j#_nDsoi+(WkfJyoQrG_2UVb^@~$@*h3A2s zHv-n1ft)k|>t~Mi)Hu_Era+*#BB#Owdv;oH`*GN9()!bRE3G4P8a2GwtkZ=HEe61u z@Mb9u7Y>&q=_?6mR!H70Orh0 zxkU;~EHc_>tFwk-0>)`hA`)J-l=z>p)tTKko>OXvrmKAnTEh1ca=s$ixKlCmSByj= zoCzVA=qs&_-dm3S?BJNSqOnJp(z0N(E>E0fT@G4TNh54EoSbNq#;1pD!9=Ik4fn9W zVYVqx9G$ZMSlosNU>I_yY8pB|3}cQpDy2O&Ib_I?$#oSJlS}S_JP+Ta0qx9Nboj`3 z3mMbTpl*paHrTBn{S3{^g`QI=?r0P_0AlrbfuzCt?<0q59=b^Y&Cf(1I|N3#_8H@@ znejgI8txHI+c0~Rfo>m37ct5Ar3^oa(GKKbBA{2B7#RxkFZS;wO|iU2MBo`&ogPTo z?uT~RSYJDj!n)CG2nr6*pJS}2Q^`szXjo5U1V)bIt^v@hSA8DHnZtzQH{_|#13B~P zM$I*l^PL~wU`f%Cp>xK|=tK)~CWwa!L@Lk{B=@58>T3sKrm@@2165XGH{4EAGlnzM z5^$J8k_sW^6m#kjssNOJP7rq9^j`rv0qs`@pSxL+9J#1(0F|fihO!HlTN29^^_oPC z;4RuCJuAUwp|WE=VXks;qjW%&kw79FI{HRxPNu8*abb@^N&L*%&;o_>NuN&>_%19%N8io|LdX9T4PKuExb^et2nD?uHA zs#!{+mKH}=p(kbgjFeW*G~JFQ6!djlr>wjoZo?zNd+?%IhY$r~G#e3Q7jEYJTyQzo zsGtpr8NeY@T3YDtU#^QIeH<4v)(kV{fr@uAFena1fh{X7bHUnCX`LW$n{OjAI`? z2*WJj8XId^SL{6&jYfA=ghw>eB!I?~7VTr$ITEUMAV)e7FxB`s*q+w-KXsoT22x?j%)8qfEU({0J@-Y#abXAnieyM&Q&37vyj?Nyo89x zd-y{4Q?Eg~6gcYwBC(j5Qde0 zMlOkWF|$s2(tP6Ya-NFIHl0sVqmevuhdpV9#Mx7>Xsf)DCsU_CN3VxuQ$?iQqy(mw z77=%4nNERFgbP-L&SgIuIm7IS5k_ug*P(0eql#PuXCd)o#l*?v?}-rvj@irW)~v8b zScxh$bbZ7~(4V8Q6LT0j$zz|%Dns_~i0s>*bQ|TdfDn`#7&t&VJgrH8nN9hXv$(=mMqMbN4Y{ft-)Ne#bc` zjwj?^`~{;`VD^3Uk3-8BKFQSjT-71MmAt`Ex=x0w)Je1+~H2E zX6!i+wqGo()ZKR^5L(QOPcUu}=jRjBcLBuFrkVn%)QFxwwFl(XSUNe%@0kruQ|tj& zh0&@LP!(m&A#b+N-KhHV%3urT+s1Vl81BkeGBQlJoKbHIu8xsGt66n{tzWsyc0KST_L6(ytKHW(4+)&TExT0z#7fo|;7C><_VXA}MC8*r#cWY2W{@EtVR0a<-tF z7FjTn3vKa=<+$YJSPfnGtb7L8(C1mW<|07N#kObXGo0alwsPG%nnd|_YX5FK@bc4E zS%Dxc1zsJ3`3vNxTjHeKjQ`Bq}(7~uSLKv zYehhg_ICz(+LJ9~b_9*CYFKhN0OW*O8xANdAStbLEGH-u)8kd&UVs1GZP;|i_Zy^< zGs!t4X13yQz%UM&qX|Y(52KMY+It37E3T?YuH?aDxAp>_jBu~=bI>AVt>>XV**-YN z-?{(jpfGL6zG3_Zrd_`D1~q!FCYA$r2z3L>Y0x)EKmcw@Wzh^i8D%HOJa)Xx`q=xo zTy>?LICc_3-IT3d+{ic~qmM<18bf@}pCZ;HdYmtoC3`1EUKyr&(bgMx5HiLYTv}0P zm5bQx-tJ6(#@@NFIfG6r~X)fJI|yGx1^TJv(51G4?vwA`7s1Jgb=V z6gzKnnJmuT2r(dsQU556?VPYiwqcEn6+@0HlZ0$uXM|d%5N1x8CS~5zMtjF6|I{*Y z+=WN$YhJEYPK#Bp8OT#rGt!5|gG6uji47uS zK@#J|T$_S{ZW7dM1;B~PL7G;YXWhupl(~L{%zDLs5%NNhH-#K~&mu?^6y6A$Z+4E+ zL6|93cK?w;|3V)DABSp4>;V0YKp%ca|C$98p^AC>E7mMUdkpn>GTXjh4uY;hL`F$g zIUp9TsI_IQ>M1UmbL9Y$gu|&*9oE&+#|RG{ass=69Ce|$Zr$oOyz0IwIOoB7(E(ae zTxi$ae6y9%5t$*W>qkpsc(~t6up2J|?3pF$lgo>KH^!*K(W6Istc$IzY5~uiBzcS3 z{SQ9O2v?JBMq5W>qUoZt9JeX~9vLJ9{R1jwam1>rv&Bo7+mlZ{VaJ;fyIAoIiClsL zN&wR+2WdHntpF0~Sm?EjnbVHwvi=@iI|cSBXZKLi1J3aN0Zb;jx9cyO#yx}1JA$g& z6p9j+o1!rDaW`CUT&u?K55*-(wGv?ZnErU`5awb}AR*m^1Zz2%6C@|1n~U|}&JEaU z>Ojh+s890!IR8E^HdQzZP!?$AsJK%C6sMTT15ne+CA|(8%H_RC(?mc|z}N~vKK;&B zw{^_vPMyy{&R@MaWUuerPr)Hd?xZ!;*VqEas-ha*k+7bR-)OWh(8CEBZUQy}Z5h{w z5ip|b>*H0aL`I$Ql(Uo8fj~lCf4QG&f6vOQoN>5b)@xUHukCF)gX0t|u@ZEi0DlGG z#u>rUnw1sx6a|tPb9xRvPBuVJTJI@s=Q<4H(a)%r9N`4yBqZ9)T41@m&W?WXjRYpp ziO~DedT~Y$YbgMS1LrCgGy-%4AnLuRrdddU10csoz(|nO*CBB0)3#A>Oxivg_Vpme`?KX-}jib?9b@WI@xIWd{bJI4loWPn@gvIGz28CZRf3KLT$fnmV z{T`RCkp_rZLL{UGh&D>}TM7b2fM?P-=mMl2BI%ARfTe&O-52c*0k4WvV$8^)O4nVn za>cSmwtnqWAD>c;PzPVntb9@IzjB1J)v@ou`Al^6B}*3rI!CMxdwE^EGGdcPRCof9 zH7ZgnC^`i!9BFO=$T?|?8td7sA>!R8m_9=eVFy-~726G03&;^OFaW9rY`vM0lYXD)ft)u2*8eFZN0)Mxg?sGv-8MCN){0!O zihIHy7$=Um1G4v#H-#BfEZTN8fNa<;;vSyi&Lmr+ivEgV1 zw&zn;#=2@`glTiQ6*f;B`Yklsz*EnhX}5BK&z;#zaipsQ94fX^m^hIv4ha4qr3rdv zwAIM*gB(lcZ^A}nauqg|$bv#_;;@<-&nk>}YYPqoXYA1TE2qx|%hg?(n zrPf{4C>2CM{|sNnd?|ADc?<0W$mDx5#(k$2ZnZe?xgVA)i=NyPV5a-5 z<-#~D?>cIgfKa+#IT~jYC5H1)u5D`6gdV^hh=iS5*#Fc3_YZTHO(n2u3 zX%zrDj*)t74w^Zx5hm>}V&zP{$C5)hQI7NzDv4?21c{-37`0K(Z`kD;eN@K90#FV- zt$a#)mAtkIVwl!|M&`uGi8d~Rk&|yzePj000}tC6T1s9^`K1m}RbNNEB4^|P|$TH)pPaoNs*nw`_((J~NNtw+h66DFJJHW8Dw4Alme8%{hS;QZkjx{-muzmY>??$U@tt6>} zaf4;6R@jo&t6<{bT19>()<{3r;dyl3N^yXQ@OnoP|2*5#;Z}|6_}A1U@Wy*-g|Q&^ zLJm$pO00J8-N*08(eI&v();AIfNq8C!V4L(kR`K<<1nC^fSe2t`THNZ&-!u1DqsvF z#J`VFP!6IYQ^Ksf3O4~kdhP1AYg|hV9Tj+r??ZzFR*bk}hyyK2XCXVQfY;Gut2T{W z{R#?$#4y(yaD^gTBXLp?nwaGIDR4E{Ehd7`5eq=mjiQ*CfDw>QkvXe56SNCNXC0?d z7n4ca80x@>Nz}8U?55}Tl{{+=Wn!PJqFe=~eoo2sn0^m-fQoB9g+IqWSlLDE2u!>6evA+1fLJuFd1hgaQ+gU6KEF3)kKz1t4b0nC885uxKg zL#KXR&SX4Jg0(4-DUXh|l2qMaxngPbMz3*9T1tEj3?>{X$$_ptN)bCkK~@MmZJ0eO zcO@}U+$qGZ$SEFOXD8@@3J_7^CLm{$Do*Q7#Z6i-M>F=CGz>(5H3k7NE#YI0gt_o@ zpuMAlY?3agfEfRn?sC+xZIQd}ROaejU<4jsmsotT@|r7A?1=J@Ul!zJD&Q&9e23R%uL9 zXC~ePuyRQ7mtSwgn=fKaig8A{yhzAbV+QQ|Ni@z1aX~4k%bVZ&IxaTtzArkeR@vCv z>upSDsQ0DAR?^jMg~uMVJhA6gjIpM382y{#apQEl2TE63|N6`Ly1>tWu?j+};$YoI zGhnHtB0%8h|K+GpTN{#me^mg0C6DVokS~Z?LX~+ijwP?s|5y zh2w}iv-e7;&f4;kgO=0L$_NH*8-&>awLnV0m#$rBt2V5G3G*z?opu+KmMHu*#h}hB zY2LVqH>_DTA~fPDM@V(%hhe`uD@VY!avEo;28Iy+`nVtCXwhgtDE7qT#Sk55`9*%a+()tKadj)_{odh1=HIqo@1r^|iOziH6Ip3x`r~ zhsr_L3M`LvcJWl3-8%8SU4ylFK6-bPFicuYm)SQ;-)cLfjf`^v8vEK8(*$x)e84`L z^P0VD;zdBp2|H4>(Y`!;F`!R9<72YkMk5kPS%+gLCMgm>U%=?s#?z16hSN^~co4w;2SL2d;Xbb#A$WF;BqMjC?MU zav9j9G#&F1MsC>k?^gfXudRf$vkHgWL8KOB*-dHS@g#~)&opCaxBT93+nQ^xa~-iT z0_vQu4q&E~H~rcN5RSgo-VT~MV%%z9j`g3miJoSRRJ#CUfzk7-VAP=_$9aePzq8;c zbnnRVWd@>ia!U7*k;`miX(Bf0Ahzu1CwbnSg^j$90!#MC?ZpQkgt>Lra{-AQJ09eW z9L{>acV?#A^6S>Zgh#B|f#sk!N{{BIzfS*~-otrD&YXv>dGmzlft-1BE9PG8_$S|g zw+%I;Qjh3pcu@`@%|VoeMjL|k!P|g+JNT1Rj~Q@^-n62QXR8d5-u?fG?zXL zo1>I&;>N1Qblf_z8bu73v66%waE73DLy<17D6~ym*HHM-2OtO+BJ9|F>@-eNXDA*K zKn9pPapJgxBHLi(s2g2cQO+3DW<-e_z0+NcfUJ_E`0)5S@T!E)R+xigR{9xj-PXxi zL4+cxVKK!EulY1?LdRj?$iYBBj;PcbB#zWLJcg{n1952;RwbbAmFP_5kVtA2Ymh`d zj~V-w>()Bu@~ItQK3#lg7K#iAeaCf zF$L7Ikamt-&5|6dN@g^hulqH|!8VH)P9E=BGHDj`>?8$9 z0iD<&VO9r`1cmOf#Aa2DOIT7#x4wVZ2hIaI>3#IkUp4!rP6caGV^JIRtfE-EnoBgM>wHS;0t={+@Qp%H%Z(e34t$n}HlzovSWV2nsZwRB&m$ z3Py};<^-%Bt=}YjOWimz3Ki$XMiiTDj8ECGCy6by6VmD;3K6n2v#%7;ZAbY=KqwS& zrV-FU&npc$@v2DFNMhx1q08t%4n-OAF^a1WqzTNCa5OBssK#Pov5Aq>3z(JU{zxl9 z&l5OsiNg_m$mL5TP41GxK9*BeBW`^wmeo5WCJk1Vz`~Ksj*8b>icm4Ex&fiH_;Vrd zQ@J>U2n-i!DgZ{>NTtLEU1u>41?Xk67LK4X*4jDXAYc(12rE}D11ut8)qW>wp8$xc zq}Y}lRtJxNo{|^_GvheRUp$>-%?J!R9r=rniguUY}mm7_3&Sp;7`o2?E z$nUjm`(0~mz}*tyR$z~RIEWxnGZ6J&)APD*d+@X9P7K?LL?kqcdXaKn~y=&8kP6hwN}y z%tx!Pzvj|FBgc~~3R(|ff#z8HLyvVH$T@d8>_0Pd0?TnUiR8AK(jze|u+K!YhCxybCzz2W=_ALGn0Hiomp=Wi)!TZsP+F`}8Wp~uxXiqP>!3GgAc36Pd zIw7+N^0{o~bUfb*9HidacAs6AX!eoJ-9@YI2MzDCV=!_;fVKiYW*NcDB!SFKWY`_a zm#pU3U$PUsTdW7?xu(0nW&=3Cia{Ipb*knEtUKaMoVr2m+Eru6?TY%t&tcf~+QS)`ip-#al@D8`;qh--!Q(%)*fsC7zUx11o%~!TKPS!2q=P?< zngRSwF$TIC#!uZZ|H|YW(az8%KmZlTou`7b0Bhvq(CmlP(zHhO<>OQ!j6Yw_H_Fi zk-3BeXHL5#-{5;^&?L&Q6_Ar2tqSs&G?O{q@J=&w^yhgX=Z$^)|F^Hs13B~Pj?XnC z=Vw2--3D73k)m^xg*b2qei%7qFrh4ICQJf&bUMW{8v%%*V3&>wGxQNr2blvU@e50| zkiyN~Us7|Y9?UrKRA`A^;ay0LPkBM902(;Xs2ip(Z-jZ_Y`H)9zXt`qKII&v!%|&i zX*a0rn@@p|iCags7n|LxrPkBc3FSIuMYvZ@P>943-57wql3SRI5a$KFP8DeMBM@Xe zajcc%Wx%=^!-_C^biC!Hjq?0gUw0kAN0F_@>7oEj-rm+Tbk#yuSzm9XD9gv_Qb%3j zjhSCwr{<%_N%n?X(S{&7D}z~6!0!(;J3GqvM=8D%6jyRWjxnO(v-Vgn3ZRI?L{Jec z=8r&(qC(l1B5Vp9X9&F<6~Z+j_Y1J`)q(KB(@)#poiAA)iFllmGO;V<#<6(uVh5ol zXgWccPu+KoCdu(iV_s1Jp%|}imgG7slgd^1Xfw3e#92F`W7ZspWRwNPofLSB3xCUpvR>a(2di8+o;Kb2TTe)f}*PDc! z|CJz`8N;cgfcqzgU=QNRpV$Ula}Gb|EhA^&ZNWL{>{Kn7zH(IV#uUQrxmnhpm@id0!mN4i zXSVQ>zq6J#SJ?jBzKZSwanwcTL$>|(U)ahAzZ8Hdu9XG|55FcP@#LA9?b(V;&Mkk+ zNC@Dr#t{H=GH_#?m5v!j$K^*JvDMFf-K5%a1|aykYyQMKSKMMDiq!;QgoKx~I74Jl zEHGypw$BWJ(5B8dE86uPYrg1iYp-1ikfU|)rw#?3_7!IYpa}S-Z9u&E!pFa4U4;#H z=-NN9Q*`RpRGDFa$VOdmRv8qX*%ORSP&#fNeAU+N`k}3&)89?UJj|a}j4pS!cd#a5 z1aZ;jvKR&Elvb23zT!|fYg?n7g|N^xUL{0$pdURp0U-j~*q37O$el(^^bfXf`CWLEMh+;Udc}D1!~h_T_g*aplP>sbX9#VY_~P zKUz62+NGP<+s>yRV-JrxD^CTbfO3IJiWzdXQT&p=S->O|OG*I18w@W2IYO<)Ob|0F zVB|z?$I&4>)E)EDs_U-0#F-op$~)U90IJS4)Ev(N$l3JJ9PZfQseTg}IlZv zfL#QDV|~YdTYTSFt$E|+b`)`QvQIx(IP>!5J*}nz{q4hFa~qonK`na@rod z=%aR|YD3^drIAMEX*iTl>udpNnc^_aW4&JA`?9^OYlp>-?6IM(ciOibZ?~qLa&|7j zE$YHaIgh#%Q@&l<_MDae;vVZg(`CmCF$($gk8Gr5fwSb54d!B)p@u+$h>+xsj1w!0 zXv$oA{AH^>h^RO5DPj+mKK{=({`~zm{{AmoR~_s= z>WXRfunMQyV?aRN*^FF+T!oomF6B8^y!s1U1Sq_D`64@XNGFN+B;80cd8EHJO&pgo z02JtFBT0`(|G=15P!9|#g4&ZaOMp@`9lR)Vg#-mKoQ02VJiGZ3mINGnkvPiw%)QHS@P zg@9dV7UN-@5ecqsY54-HU9=b-gplpWSpW;&S*(7YBY)@OI!g)6qRzC3D{KH*Fn+cpBnoDq|<#BqpPn!=6XqDg-zl5 zAbPqqt>SEkewbzIE=TxTxl$&uJh>f2s>EQD%QPo>QV=jAVC2Z|G!Q)2dx?(3#V8NTTN zj(}_OZ2hd5dSdtq#0ey+04kwqXJ?Zx@>=9DmhBepn%n0dB34<%EPa$Qmk!1^;~G)a zXd20KAOfD!9O6BUp^cJ&MKH~E5yiWJ{Zw03Zc7k5mL`_~RmJ8YHn0y_AJWqj%Vq$O zTKA!bk&r0BR^S?^Q2>cP!^dRri`An&s}KF`o_+h+yo^W!JP15n#rWzpBAPQ4?q#Kw z?i!{zA#r3q{_k(16FP?<^A@ypZLt6VAOJ~3K~%_j?QMSF(hJd9h~D6ktu7;mtgRhS z@AUKGvihiPsYlm_4!#6+iMX)eGVLHvPN%Q@I8A~AI@1g^aG#3ey)Ifh%GmQzi1AuE z8G_udiM?t|fBG40z*pP8+rMHlSRxs)1JFpdt#t5LJo-fnDls^S&njDp2^uUMf+?{7 z^53(gSKmY7DP0_`Wr^ntkm3Agk8Emv-qt?x6@-n4=$wab=XIa6_SIKAcp3+tltM*B z;`emNGb9SCwa<4i?1usH%J;2x>+f3Ug2ikK#Mo&D&Emq9!FiDB!l7y;Oajcb+3G|8 zZu_b>+p!flc^purQt_4J#Si1Y`kVANcuke4^sL?e6RSM3(+k92ti5Y1F#up(Vg%NU zMk~cCm1CU7#wQpVEP(MaNYf|58I_Obg$iE{pp8)aC-HgEj?9?x|h7Fh6iY=ECzj7V;)_&9&bcEL+VRL3L?4Q2y zS5^tLEth<$`M@iT%c*%Ktqn?QH8? ze2=wac#(%L)#B-x^;nq=qQ@nj%3ETG>_drP*x2cIdoj7x9@_F=I|IO)!+sZgG-uDl zRt76>;=((uHM-E^xx^W^$j0`Aws`ON>;$7;hZbH7hy-9oOsU54cEPEgXkGT&_ayD|7Ycrqgq@)I_WbB|ArK{-wEQmc|!nuI8 zTv!2~KxN1Q0Cm)v4Z1rX7iLHX+!|edO@Yi}1pC>kF-M8d!yn{RBd&_FS%|bJab=as z!2Z|vIQvf;NdnB0T$>QFHv^_6tzK&jH(EaKx?4rd>-JE9SoM+_BVWKh5 zp6Wc1Gmmb_Tmv~zJbayL^M)ly_A0TIn zqE|ppE}dp2RHEfgH`l+Deq6fTuCs;EPb1*x`md@>ppYl6xLO7i}&`~{ylrVP|_%ctjtF^5LA#V z(Nwamz^?15=j2V{EJ7llMVAl8m5S+^5Hq<2T{bX^H6&-2Kp_22Kq<)b(JvL*D&F+k za~PFK#!2t_nY3uCI}VXRM4_0feARnN(>w#=SdG90md^sVk`(AsSRA_lP65}UttrCkV z_Rr)v361uPfHEaE(rRIC%u*zYn(ujvu0B!UfdT2Yr0&0fItM5K798x+2$GmC{_{#s z*i+;*3BZDBm?Eq!a#WHJQK=;#BeX)gJUpiVtDNX~B7t&R4`H<&Ngy4ZV_oU~DlQ}v zhzG)U5mQ89i9|@p8R?4y77dZm%3hmab|6PuS%Px}*rYXb(#cFZ*1UOaYm(P0w;g?G zlu&Oq8{p~x3FK&9(zQ>IR!K`nV2;0Jt}XjrV;D(*7JnRd#|6@esKlq@p5%ZQ(JQ#H=WdreX_E7nc{E(kOZ#G^Ilm}xJ*@-kzo1&ASQ{KIVh2GRaw-kmKk zL5P#*ktniQc3l*$pV)R@>{#pX!+UQ{6$-%~44NDIQ+B%2Vw!@H^P-QYU0j!Ao9ii} z(2&tt2(-zFU)YXa_C9O6<`axCc@Np@663aV=f7C;^Z{$T>0{PXcd^HU5VqYb$6IXW zFaN^&vrFy3J3nuOfcX;5mBjtl!}r;W9bZByRQFoYtj=YC99~B^&Xi3z{DB?b{M+nx z1h^??vH=`M5%3*n{be&+yQz1Nt-0@WRy7f`5kQKT4R_kv`c<62uu~95&Y*G{%|XAe zVv*aDtCKFq%>{$|E&A*a?9}#;0OTx#sj2giIF# zyxd*xz6@ZJm-N$Vrn~~y*B^1ZOs7nqGaNn#uKr-WN-SfIJE}-i+$<=mdqk|cE@2gu-lj>%ZKdl9hhpXlG!GbF`q0+`Z!~%% z!Dweh^Zs@m8L`(p5j!p^v}>>4?gG>f-MfWzFjDfLwKwkF{O}x}w5j*@8{k@%X5=Wp z5>qbC4E3U4dl>zt*Z1$W&XY}+>rRjY_Jf>gio6baVe8xSE*rV)GwesMK0rI;QUDNsMzGtuzL)Ltr@v=MOP1TdYd-~ZL#O-{ z#vf?RJn}X6>x^|?caL?k&ZapK@;S3^YW|LGooKcP8{T8jmv40NJ;J)(gbvRoPkhdb zV=Z?0qW9a5H6KJ+Iot9ld+qA!lXe1Vv?Si`o0}sd5axie2wb`2}E4d+ia^I z`diD59m82`$_8l)BzO;ljTc(R-CwaY#ifjL!U)ARYT2{@YWYWBwf>twWSxsIvth1v zHrIAz`vJ@T<(Div(CZGbSv+5a$H*(nvOoTB_gHZiz%}`aa+2B9ICRjQ3Up?C&HKIy z^o_g||0!ey=DKLkxlf-EkrWY%RpV!(DnBzYu5L+64 z#P3-eGls^|2qWVsk2jO+#CVe6_gGD^5y_c&t>Xlqv!SI{z<6efyH*7nIr>QF+WPuG zk6N7va^^g2&6_7Y59G|7TQT<zy7VDQ&H@O^uszQ8{egqdcc{J}5RdKOrDS zHr7j)G?KtT-7I0`sI-{mD`CBTj3F?aTeE1XRW#Joa_6;b6bSljAC6XM(9o%=t+9p6 zmLYID;ljZQimNkZ~J;uNr5pv$IQ zCNzhi79>`&BVCY$+X9a}%Yph8a05423Zi@tv%GRW->e7r&u0bWq;pCU`2vR2C~?YI6|hrccfCHu%5 zMdSpX0u|E&uO!TvMWHXSKv|@cd^vtNNJIjh0aB2YC$!HI0Y&#pV_p(Y z)d835bo<~#&#UVa07JQcJ>12Lzw2v#=zRoEKjs=h(){`K=ViV*cOUZ^$a&At_6Pbl z?w$mw#&}vTjz?h?HDaQ$cP7PrQfEjse1Qup8q=3gfExQdWukNrWK%*T!*X@!1-zwM zIU&XX)b$U;^3nJ}i08}J2%SI{pa-g%0hxT;r7|7wV;B^ zE$aCkWdveGcHe*}ac1*-aK;)XNy=osi0z^RMBtR3GtI_%GmxX0qP27mKxXZ#P*w6Z ziG!4W58@o3fF~(NPMRquMvnBKTDS>b+`Iae|-s7^(tZ`vvArDGb3COKM$oSgbwWAMLprenw!Bz*@y# ziKQ#HRwJCAhel31N$ej$PYc260(6f81|3d9fT_Axd-m^x1qmCAF*CjIt=rZkq&|p# z(1aBscpb#Oz#9I<@e}sR%dw}P!;ksO$ayo6<1TCha=aHDD9Q{G{2zV#C1>PptIK7y z3ZR^#PC!DEqCUntY`ORYcKo_e*&sSLP;zX+^q5`q>p!#zUHX^a{hk%w3lIJZAm_^#r65w#ACaaV`%~jet)VJAdh@3# zzOJLOkhBF9k#_tQi`8F9N4$aphA#h5i*5MTUs+A!6l1}RZp@U>y=RXISYU0Ugkz_- zf6O`%S)O2DWnd+q4TESy^J5l!{z2<~>z`O(#X28T5aXx@R#D=jNbt6XB2w>#s#qYMUJ3nJF za<(MJy?~r69{(3xj;>V^=dSFk*)G;STV$_Z{`$$$^UfUFV-5y(Vm+fe{i9MRx4Y4v-4ZEYLhWe2Z#7y3UmfzYs88arXNFMiujuDHS4Rscu= zR%-1n?r*X+4}abw-A5TOLLZXr80S5ns#$EA@BNzf=T$m;SNfaF0e@HUp2INIhG4Nx z!iW?2n-S}_tYdpDdtA9bIll5<;>gO?3+z+(d>EiqjTprjuBk@Mb+5EXT$79IrE8{j zpVFn#8q{c&f4FG7a+;u?@jj;mGXVof_e1wTpzW$@qdgcfawI*Vua(0%Q_H(Na+s9X zmUM8GYXcP1C>H}(dDFDmi(>pGr8R_W7q9#HWWD7A2A9Gr)H$2ZbN*Kw^E@MG&coHb zd&2WT&OEv$bIr&(xOWv1N<{?7K1Bs4LIgc^h1C^^(v3xXg)W&o^D;?=Nl8Hu-J9fz zT*8?ka7;Y72|&n0pF#Dvz?KZT<#25!%&SnCM}aXs#0Y>yaz#xQ%Iw0cj2VzZQ&J3+Ff0za+);_fS)kU7aROB^Y)4Go)Y|LX^=Z=CYe-H~KPD1ay^7^N3c zSD9t?jSDQhFy98ShaAHWHB6_wh;Ep)9Mr*zlRS38q-i;E+O=UW*?x%?GGDKxGKL1o zD2IiBD1izpP~serLxU*S(=jM6E~m>^gi}=~D0{0T>#F2bIHk2;!W<;IFpY90{!0O! z1}qfglO&VFxZ(`++J>=$pC*v!6_ugIg9-;l-+~2|)_vx*b+w$rDWlR8$x|&YcC5MC zwQ!t;!+R)&f~mwpN#+FCSAxU|4$e@fx&^u~5}NC@?6Q6m%T7NWq^Fa%f_Hg+GahMOq&^@CrG+$5=z3`J%cPbN4Zyft(LLc+9~GjqoT#P!TW9m0Va- z(iGBtON;(`@**&YKeY~hJV4zY)}z*bItg`MDp{t&xJx^62!v5G;`CxD!g93AVEqbM z(fW{!mD38;xuW37@ijrmJ0%2@?iTy_mT1)!So-&LQWA_qDSl|rBE-m^mwm4^nv%(E z>+I}d&q{-bq)X^;N;l%oT0iN>dZSyKro5AIr+^#>P2Cp4T}lH+4(}mgw*<~G0V79i zGH`Lz7^L>6Ce6eO)X3%p<6drcs^V8^po3T`hEp(h?|_+%wQ^*)&In=-&oRb>45E#d zpnET`=}cHbVSY$rIkXd4OK(rDEzz(N=ngLDrf#Dp?ptM1EjfSgZU z0a!kVAM+K+`Ou!X`c+7;QwMTVBQ0TRA6d@pd+oK`zHFVVZe;v+1dWPWTZ*{-(*O8#0G2#E zcIOxP6VZK^Pabi2Ga5O|VC3j)Z3~U?sOy};{ydSp%#Pgh->iM%1`5!S)hGKc`@jP> zuuLA_-Q1m#>_ zIMr!&PkrCco^G?Tcfv@hSPbg~V+EL~jTAMRKmUe>IoIN_|KcYZHfzEq``;-mLXPgb^)5n0$NFn7iX?VTsp$l%a(>J`A(OP(Pu-20>VHb`O!*||m z;TL{v<%8tY(st1~%=2|@z0rp6`Wx%R4m^+NtVIZU%j17-E5{Dm{w<%h=NH|=vxylJ zw@o95?cGOzXa%D^cHiQ6*$eg8Gk%$G1?U!D+WkD^Sq*lgWHn$-$QqJEmi?`dS`K4Q zXI5^rjE^&_8C~RnVKEw%>tFhw)$aYN9pSw-UGiR=MZ+tHJa$q1n3X>DEjzRNM(bRC z1ETH3Gjfc@y#PEv`AdroHDiu$Sfxm|VXI$KnWEP}R&pmJZ^f;hz-mQE)i zkgk_<9cK`u|0O)f**F2UR?TcN?uC(X`D z=k94n-FZgNoQJJ>^MvPtoOyFA=AMz$bdW@gnf4s?7!v4}80dNyS;aKsh8iOngT_2V z0_l@F6accdWbl&&K{^+VC`8r253CqfRLD|WBAH5v+@74GZIrIBSUpjaA!+MOPN+K$ zU7G|(x(xykawuG!m4Q}965v4Ha}{0^4OEa);i8}?VcaZSsIn*d{+UK=$X|lc*-;yw z3bY?`(bfrsdnt|pUesNyDQ0YJ2^3Kn3*9kBl#)@{By^68rP0CR3K*iKsvm*F82`S6 zWNS6HE)L^xfI_;Ku&suO`AF!w#zsPExtR@dNo4D=$RoHoZo?VPPglqC_xPl z6LlhjLr?cnMVm8;xaZRpZ35i9DEDZ={n2<0hqxFu8uik@iUbF252ls zP^z1moPuxSi4C9xnl@tP#A2hYlPKWks0){l00wHb>fC!yy@$X$JYehn?|>XRUTI`V zqfvTGSy>Vj2GDX1p8$;XeJaNtiL;Vi3(OIaBTzWx@lQYwqO-&=-zq$iTtm{0>|n%7 zqSF98VhCsq>KtPVrW;QYL#SLp4i68rNvs^oNe6NOd)SM5R%hhko)x9olGt%BqVjnN z2t!4%){ais5lRDZibqNvlO)HUeDeAYsI9NpuUzk7uSBT_5ph3zw$0iRmzRD=0flMH$rf9_av|pc zz%FBw(m&8;DdHRuSlHIqY9GC9;T-N-v-t|-eBjkv{5qud4bA~Mp1R|t#M*lF>6a;L z61IV{fK}B1o`4r(5kG4SfBMJPnO|wg-|-b2kwzOQKn@G^g8jd+C69a|0CE%`w9egSGHK048?5<` z&s$IBLdG3nu>jhX?Eb#>thw6;%j!A*My-xDx^Bl`SWVNj{5B&D!~&$=03@@}%*nRb zF8hSFUUCPzK8)_6)FF`Yg7#e&e(0OlIf3y0UH4c|btCT&H3+nO8pMeC*;hz_PQm<( z*r>*+#?j#l7hBcGK4t9qsQvYxE-aAaMv%31;)B8NrdsFY#vSeGuwp_pl zgDEy7#1ID(THb^t^aMg6kc8d?d6Q5A7!!&yw!y|&wrt5wR_`N?%4mA;edhbEeLqJM z{&MBdx#qntjTvS%^UOKtIp;2Wuf6tK4;}=_Y3fAyIp4N#1IPhP2&!n(FABvr2Xf-G zRP+7{kaKCtx?CeCYGs>HQNzsvf*tuKM$VWWJh+e6s$Zm|J+KaS}cpbVw_^^3yZI{1DpTUI&qy%q##fPyXIBTecKjwKV#=A zZna}2tG!?%*r0Z}+14C?(0Z68k6!&AJ2h`B`dF~qtj`i2rd@OK)i$u=2K1iTFJKML zf8di=b$pkdtXOG{um4-?Dp&tdOU@1qQvJ2baYOM=ywo$H6lW%F?Nh^5h zOV+;rbq?f=(#k0gap6E0?NU#oqcy-h=O=(L(?=h*X+(vG*W76nfA}Fgk4<-$3NQk; z7^hXe$E+!5-G~4HAOJ~3K~!w_&u#hHLzXb!V-3Uw8t2Kx1sc0*FMI#{-fXq=i){o( z{-juX-U=1;Ipx?lq5V~Y$E;IH?7I>xt#zY$$T&YFj&8r z?fUNKn5C61vf^Udk6&WsL~T~lJ`%-q8iRj4@7`J6YweaxOupGY@s+c^{0>|Ja^}#O zm~BSR$%A#yyvc@{qNI6fxX)4Kqy#1CTC609$|A;Bsj8=tt%)`-D_<>pN&qDus&=c$ z5?HrWi(CeaWG1aZqVGrgDms_b6(zDOyH7qwVB935AEQN2ZW21*F#0hPBusx+8k`CVy6snyohS`k*{0&QAb6aaIB$QQH-0>DraB3Y5r24K<4PE&0+C1n3XqeGIC5@bDG4F=qK`d}mFXF)E<$J&eGw(+2;&nR=5o)d zc)H!Y1lfS0@js)N$tMY7)>tl=i5+#`e{rUiMQb}G@Nn8}9 zs#Qy`(eeK36IblVqp|ny2N4Y=36sl_YfW*Fl#mM`4fiax?nJ%dY8!BerZ`(i$4RBH zTrH5!lyYDs2#IRmT>@|)MzSv_D2agUH6EO3eQ<_G z5Ik0rltiE!B^?T6yoFAH3E+s<5CNoOc?>X)2M2Ncpeo)=b-o>8afxoFGe#unt9dFg z$QfdM$PLfkAG{SJFmm)MW{y@bnNF1zOeu9(r}(^*4Tyfs_oXB zuX8|F&sKtott|jS97I;?Wo4ydO?6@7bSp=1YlznhFc%oyq4rRQ!I~AT9K1e%z7Yqp zE&%IMYq-#49VEZC)iu^ki)T%3x#h<){kwVy+ugMtI>Oo@}O zB>}Ac<)^5ov!7}m5!(aSSP~WCqh%}Y_#b@Px-wyzFfppfTP^pu-?HvacUfo2Dq0)H z5f~k@71$9Mzw|Rtrl`X(Ue)%PYWrgI?9e@*w(f%E02cj>-7G63;j7#AV;g$vF>A>w zM+f6?tQ&os6vi@d#mYzeZ04t5v7|PD9IEVMr6vLxjY?p2+nqN0ihF2ZqFs|~9Oryl zm;jWW+i%_Xf5XyFofgf==VcnYaGJ*xB#fi%S&8h;s+cRN5vMo{?Wy9-1Y0P^Oi?Ct zNDi6FjBN@Hs)#!vg5C~oTAIbuw5UL*V(TrpxwGV{`V%%i(BrJZfB(Tx?Bs=3TH=C6 zMmCJda$MfhD4wiYRAlq3sHnp*-u~*lZRyq90OA0sh_Nb4OJDK zz{=rS9NV|Yo_XRibm?dp5fH-|NmBcp7I4m&L?wS+=^Px)*OICLTr@nRfX5KW_;uH(J-#cewj%A0)j2ws2>~aNnI_r+9?|6Z`k13N_3TwVR8@oWgY|zHw%*FdVIg zPEw-)LyNkKylRotd_~mA;~zQ8ieck%hUTfVXl?ZIkDy%>+B+RY@&ku;NZ^eFIJ!Pp zCD(_*HAMg_B;i^GFt@KG$1WYlBVE> z%G>p;Z@1yrG&^>%5gix=a}(LhsQM34(H|u!&d+1}p)WZR?VZ}X#c0tG>UdC0YY!{0 zNSn?!xU8Zw!$O@71E#97%1TIfbU!YTtW1!c3fK_?B@#)~Mj^tcf~nq~0c*mRSBXm> z3DpqDzknQ7&9&)k0gh!5bm!-|&Q56OU~lL6!)mSS8=|d>{%OQTX8>|C0KnuBGL4mD zK`w0y0Bl(>24Wcm5duAOp&II-t)%G<41%Jx(CbcEGWzvs)%r`7zn7inZY_ zAS9#&6P@G7Y$CNCP%7JjJJ}s8p&y0%t7lk{Ux3ajGjjgwH)k(`G~P}p1{8Nk^CNQpia?x8V2*Te zg1Dtub$A}ZQeM@lxacu+*==m&mELIH2BYLiU|1k!sA4I3PlGKIwM)66wlXSrz6!2& zYNOK}R;#5*YEj@DiJ;F+NoX8>CFZ=qLxBkzdqYEFZviM0K()a}Q-67?*jZHEqp=u{ zC2$5%O07z~FTMYZKn{VMDvw+o0!+r#cJcc!z8Byq7zv25&@g$v36}-zs8m< zsqp(KL1T%r>phI~e1@nnR#jCwfT#JcbvQSRwSr?r_rDoia7ZZAm{DR z-yTAC4KB?uFG_@fK81a$hq3Y4&gV%OrfpqGvMni)&9;7Hi^&tiwM_H36RTctZh{3<({tLYpZYf|!olhIimi6`j(@a)#C!n$5%gmcZ0&&u ztOl{-JXkn0a+%crAZ1@#l#k3`Ye(PwCG3$4UHEt2*age@<=3ru>z&q)nDQ9wLm?x2 z?GxXy@~8fjwjk!Cz#P{80W=;CuX?kc#9ny-yJb1|$mgmWO`YkVeAO}#`fZ`LDB-Oi zwtm11qjHef`pk2U{d-B9^nKjiaKPVDYR8qyp097P zr?WsCtPGp8%HlJDU>`w&Wy{B7+!jyRe3EPTM;*g6Xy=ym@c1p2NM_?stQz1EcM@L0ddr#*V_k)d1h*YqmmHzR2rdut@VHI*jtz7s-1a$qvQW zfsTUDpK@;HID{>*eQA`??y3d?yqe$9YPgxYt*$Zlncauhtu(-%?dR{(+HXC;cLiZ% zkJg(@+F1r@Euz0U^{03=INLVv?A^E;{Nj~*r!{Hkf_aFn@$`zCEs%=((*wF@7Z+>Bwhf*MWUc`d@HUcc&VURQ6qisYwz zbpx*9e=eLXo2+a;$v!i{h<6`1)kpk!Kx|}*AKm)CYafh^6SmXgnu%hHwzdM2^)D1w zo7dE{QBtxuPl-Kd-Y!%h+`xjxHd?Ow-s56K68o!qK(fX<7}d>y1DlriV}s`n@zk^B zCqihZ*j8dQr|WOf4;&`@*!iBkpUdPqrTl#)4Q|t4olcJtYaTJcc_p9X3F%ge)^xw$ z91ztN4R%ySkJy87c+Q`r_bL6NyFcc&)EH$2-ey$?>{nG|ZsZaJKs8Z7dlY!IeZ#e)>-FkuLecjyh_U;Ik5Gi$C%ju)3b= z#Pcaxyf$PWDSxaFXaEj%Y|zp18doMzr^nRbA|)3JTe3ITW(6m*(p%0Ij17|S|J~E- zi!6^pUXDQ>Jr)qMV~^=x_BqfzJNHZuN(XzRiPL7?RcHW*x*8Q%qb*GK=XWwQ6{dxM z{t&pbJ+L4}zNm^bQw%t{KA5~#Y!>}Y$U;?yC82JdhuRjY%SwpKXAN;|ZuLw!^)PE) zvowa~%JSyq$Q^yrwy3<%mB}{@-8Q2D&e>Dqd=pQ((}ZKRx>HK+9~ z&W8XI{E?e$W=Q}6`z#WoKd!PVwK6buiJwGBkL_%)Nr$;@vRUF29YqG%8X}q{e1~A_ zIT*h=T>Rzh($4*j6l&(#E_v+G`+qwl@G`r!%ZZREp;ZJ)=P-L4aa7Tu@`z(drM=h zVr#^FId}V~qfqo3@Ta_6(eBHPV4L?F9Ny3nx{PC1JW0C+yTF~omcl7T>iBziuF^?V zQ1NKUx{bLo_l{Z7#60!pXEFRon0G?zQZ2-flhg`ksUxj}qB}_Eo=3X#5R2Qxo-UoO zKrfiza-s-(_0!EJU3M+sq=E@6AG#(C-9m)!gl~iOzNR6hd3A|mLn$VXtk0l<@w-0d zIE=~15#G8R|DpUVs9bE-Ql3x{hU{d$PI7X)PCKZI!>DcB{lR;{pz22iS8vPelW#|L zOXd0>dzM*GaY`9>K7fFm%83p8>G_`)vCbaHmeT4xoA<9zNGxDf)^q<|cQ~x?hv+c0 z2xE^*TG4PZkp`kN%6FZ5nO1uD^Wn!0IPG$ zlaQEQ&XHBPRlV(HbjjOk6SVbg656;ed+no_a18MNV`@(&~87s?cS14U2}3B1&yeEvQHs@QT=Y^sGD0X zGVobT=qe2J7{lP;S621Sz?+#$1J2hV*C;;dcSj=e6w3fUw>QGmf0kRVWT8f3{wni= z^cyIX`!j(G!UJSV(9iIA?hWqZMT-!4-Q1B?g)4Kgg<@iMq1kgn*nt0J$%b9V#=puX z5Mi%YqSxMxgx~2Exo+#13Xx8mUP$v-kdI6lWPX#4;Wt;G9nOfN1!b473S=>*a0u}W zB=Fhc^t;gJX9Y6%LCEj)DmouvK(5apW>z@;n$X`+kH%adcIfX=UNRv^DG?_yf7|y) z)f*#zrx-@e6>*!YPM~!~c`+oVA%O~A>fjv7>vHN6M?Aj;6PhX)`vGAU!LBB`?z43$YC z-d|_O`c*Xuh5KMjsA`NsW5x}ihdZ4PHsjW~*pBfI&fx&zRLgjg;cl$I0O47!Z`k7x zSBKf2jKTlBR^!%Kp!!oMTQ1$v3c-&&&Ae6UV#7v8NK*92BYCZ;C#@^nl!1dCxG-<} zQB~&4)qXosT$WxOP*MOTzHo6-|S#+%Z>_`8tFi$5PV_ zoNJm5c#WRzJL5G~o>M@|BN2Yg6S2Go$7-TZN}Q(>N^D!HoS`tE>cB6_?HtzSBVzTR zA!S2`RnN0|cmrRvi43V?^o8uW+_VQ>tvOD<326>3S(8gv>)7lLTjCQkc*T%%`zIrY z{%i%c{S2fO?cVrR!@A3^d$r=xu<@r6*m$T5{Lx%nF`MH05s0Fm^C_RrF_Ng=Ci7^Z|!()-#c zTy0f}8OF+>5bbWqd4LvJ@CF@9Tm}#Zf+WTzLVDry)p6kg{C_4xn7w`ot$#s_Ky$cK z4hyNiKA7*p1JN*$1AYN!zFdi#(0&m|&0Q9az*X=XN$sq8Kf%=osB)17Z}>w-?454L0(vD|P z`VEAW)G~Swo0Jg8fSHBUPA=%D7SC2q7h>l?ScNBVGQC$T?*%F1H777x!BXs7n!f`A z%E?H}nwqRjl`zZvd-`z5>!!=_FWM)AQ)7FZbm|%7MVeZA#*QgEZo$C}EPS~4l8f2e z;A-G1ZEOy|v(Q)3vkqqN^N31B#eerO!H7Z3n?QOMm_EXEwZca0?Z6^0bnb>^JVkX-G%#4pf?t}Z z2?#8)DL%p4PNpCEaGpj)!E6)<2f}AM79D%}qqeEiIl>k=VMTQa8)w>v)FVxzoaSnK4#{|*NFaQ`(ltZj+;P#OCvAutbV@#{`mzYMu z(*E{*iVlfCA`$)#GjrJ@JH^S63r-F%DP6+6?(EsrF!{lOZh2^=g?bJ9iFCy!DO~0Z zgx$wxJv&Y;0E%OP@ep}Ec)Jn(Mt}*EYg9<2_j?QLb8%S-O^feC4slW5@HZZKXQOL8 znC<49LU~bKeWhZF1RCEKpagOi$^`ZW7rp%h6pnLgn}1odqdmK@`Fdt|x8n6z(?L8#+$Ow^&;y;(HDD%87ygkkqLgBpK#sm*;jN(k)6*I{%UAuFQa2{&RJj3 zI#S`gh3W@xPH7K@R!no**#Ah$N3;PAFQwe^<*I*dkY6PK<^Qm-7# zNG0vd$D?&j_Z?Qd4aOn&u>k+{mEc_K)7pDN(!Se!GdwI!!eO|B7IQ68?v3~W)l$I; z-lF>bJSCg$E}lA1Z(=T_o@KTVnrr^N52D0gY))412!vYq_)yUBkO7)dvOuD>JvGA$ z5T#jGY@$BJp#SzItEd$@^HCpFNT&E-knpVe{MK8hRj$a+lXgJHvisIEGB}&X1z)>U z@f;Ynj<3xM5$BhU@_wYSfd`97%N-xJJxAB<`U% zrm;HbbC_S75APA;!=8TDH$=>&;F2BxHGUSc!8v;_U~Py=QI*TX{*P z%Ux#Nm>+7Ph3{lT3*bd{-0)ml`?>GHL}#UCiydV*tV$_@R%A2b9JpbO)KY4IDX8z{ zbO!kF4Fj58tilM(U3-jdL3*x1*+Dh%uND#9d?NX+HR{oK;z>u}2t^2m>ugVBNz+wB z7n)*9N!c>s)I5PV2lCvIMZAPCz+W<0>={|?9+hqN-ZdDk+wJ--kiokxfba=Cw}1i0 zXfiO6j2|L=I9U`Hrb2EH`H*aZ7}?l6t-hcXMDIefpNO2V#i2;~0UtGjYDp2Ud7=k8FHfe!5a@_?b5&0Jyh_$0Aq`-J(htrzPM2QNfo{kkk zS->sV^Ci0VNK}Zj)ja22A|ey>wwSZ`v(q;(DbPv-)0Tq?%UX#Dj{-QFY3 zL5=WSAJqzR(a`WlsL>%^z0C&&;QH(!bICF}i^A>&%{?Art5pKAY_fJxl5|RV8xtMl z6`e_h;h;LUe*PV~-67Jy1d~{teku=EJ_IwQd_@dZT*2Nz0y}>+4RTfbZU5a#mxd{X zr=uU@LlASIX0bXt1)R72**QdpRS$&Fzr-|V1`KGxp{!w=Y;Dwp!^RfT&SkKUX+=R+ z-u@R*Z`aX)h>v2T5~h6U2s^5A5*e7vMCv3XVUM54hlY7U}l2%x-5;%5)0qFV#Z?Q}@X+H`gNePK#*Dohv}j!V^lj}Pdu ziG7-6VbP}N^o&=!cZ3^W0H_)z|E&)F^|11tr{(#pkQuu|I)SUOQ=+3VP}OLQwrniX zvb(@3w6dZSFej{uQ(;s5Srw3dqa-M}3aHQDb(=H}7qDkURdA`dQB{e+_K0*AR0NUwL9A?(kHa?FfcJnXCf!j~jYTt+lvScVtQ#H4P%%KWomg1Wv1iRm9< za3y6dsZnjQL=jM(j*U#5yOMaG~fRkrsF_Q%D1%w^YD9Lc8csoX@V6UmyyX zURg7B_%$0+)-b!qqxj6=9sxKda}o&vM_TL^$6rb>VZ(EG$kKPE@wmakMJC{WbOELa zJVlF_h8I@5pZIo1mTt@UXE=v#=IDnzqfXreh>+(lwhs$K8BqsagDtrOJ|@37KXgGw zT)Fgirj4!vmd3tfSQi{Ey2oETylV0~7%+tul5vq9;P>`mLWbqpB80!O#Z3{qxZv~1 zWlGKw;UuYU$3iWU8*7akXLJ{mjnDw!u9F?31@f9Qe`Z#47xs?nbskzd=pef5)m4Nh z6!qeh$^l0w-^&;U1AjF}Va@N^CN&c}uGUYHOvh^{N)w2~swFt%M7Z;9s|UICc9SO# ztNb?$;OdE$lv@+m{%f@Tenrm&=z7BjzxTk8`os=&%LR-Q)2^&&rdgg;!OWQ3*g56G z%}@fwg`1BlZ1&}8<$CN4+Cy65^(KIH&afbTV0vw)Yz6Y_1g$@ht5)j;zaQ*#e2T~o zd?#4`q+!4ADm4*JAI@P~#DSFJm628Qs}pdfQq^(%o~GH?me`_Oi0E>#s(No-K@^t0LQ>Ap=@G zxkT1a`YX?GQ{M?|L;DB4NBTdwMt55Y!d^jnyk0LZ8Y0{oiN{Z4t~@!bB_yO+bsUHl zTp7a3*idMRxxVUhur)*iK>-m`3r}>{A^L&H@DYw`(6l;z^D?!(QvG>FYdL#x=Lid^D+D z10NKOhJeWhIqQ;TZ3o1@y$t62s=&(EgTZ=oJK|lphPY&@=AG`ws{o!?d6 zo9Bj$jYEft@U)TDp8v%{uRx0Si35#a#17rkNWzg5++MkHj9;0>!0f<}nwNEAfGo(h zxbA=(%{Kwu@U3}*kF9r7cJoGJbt|IIpi?Ph0Qo*(^843UEL5kVAd8U##0XvGIp~^G zM`>mQzya+ZQeA54Wq;wy`m~F=a#>hqx1vcVXiML0wr9R?ec``PVe;^ z=oGYPn*NP*IXCNd{m$g}kNU#i`t=Wz(-y|pp;h-kr?c#UR$JWC8A%9`%4RWPYk6fS z?CxKp-nGd}P&}>v%2i?a`8H-XXW24^{+*2%3}Pqu-7p&pihxj%+2i!T(O-=gr=~>O zXb}A#!tY!}!6oi@Q5>FTyJ`pIYB)^Q#qPBO%cLa=kT z_S9fn?yLfAfcDMaOh>`CDP@AlEs{b@ z6PrBOU=Oxxj&xXn=4MAv1U$9`{VouRtm}6={m@W9C_AreL-uEzWaYI){=R>4rCeZO z3uEBaLHq&QSn$z5WZL&lUyiz{ug-?(OzH&%2*&CN<}M4^m&vOqo;G1J!h*AVU|59V z4*zsw!CC>bzS_Mpd5`8R;=+z5#M@(J=~~IO>mk<;~wd`XRBK-V0HYbhKc6X!~@dI|ohxy59=1AfoS zr?9qI%~A%K@Y0RcSV~A!$O8Vs!v1rF+3i#_3iV#g$@<)JFo;-Dn;6mAW|C<9n={9@ zY(M0@F1IFj1F?uXBC;aUQ$ybqQws_2qu1v1YmY%rh5NfZ;6!fP7|xAGeRtoKv)4c) zs(;@p)N-I%@-G`l-QTvT6#b7^f0IJUTqNB1RE@gyQ#b50EM`U<^?lJ3pvecmBnp~X z=ok@($?_2!y!kCs!}<%(`r`34U$m}G^G*2)qsb25s6^yn!YNuc(Z$?fff66YxppN_ zbC7H!!J6D|3#$crC(D^jz~qt?{O&s%v!R%X)o$VZD7_9NPI-@qw%DXCAiO;pqXxS{ zH7D~NulhW~iDhE;w}m85*|4p`w)ziCln`flU5YV6{1yq|FHvY|e|Q3|AufO_Sm2mz znU0}WTAhSs?h5O=KDoHAuo-PuCSADxt$3^8PSvGukD?twql{i7(f#t$qgp!W)?odJ z(`o(a-}?$kEa`a89gN*iCX7hyeBgg8v2}tsf@UxLOSNimu2OV8oqfR$pZ{s|iA0x^ zf?wHCJdwS;YM7y8y2Ys-+Of8Fsyx7K*y5OhDjn* zQ_F=T-eBwrBExuWb}s?9u0XE>z4#V9cO24g4`&K zu0b&3TRpqGeD443gnEueynF|Q%nrCzms#Be4yq_#k|7_Q?>6t4PyNli|28QP4}MST zZGi~&*oFa!_k?=LH1K-z(#X!Jh zo@W*|2|_Y>hzGe1H0b~9^|AHrUr+#t?e_%!PLB2^o&h>4W zVKBE4>8BtcntF~ZwoFKqKss6SKAnLAMkbkX+RqT-!QpW>+Sb9pECje^j@y9@?Ut4V zCuTHg>xCaaR(l_?RF@l9)zvJL*JJ`bVo&{YUAe8V3D|BzA-|7c&QHX#vIqw>kqbfc zwm)*WMgJW<#FIP8(lUx!uko2qx@&Zr$eY2AY~Kfy)eyfYDwIwZ-v=Td$abky# z3v3Hpq|x6#1$zk5OfX!c1=gk3zTb9qdTgaW`=-JiQH`yB!!wn%|D zT@Oz))g}r&jIV_ai{>KW$TKjX*1Qk6TR-}q60+2Nsj}>qaaZLT6hTT+qpwWDJxuWL zuTtvU!aaN3^2eMEUV5{Hw;7yPuXJDZy614-I$!z_o^{5Lo(G;3t=W|R>vJGAt#w>l z!uS-3v+V{u^ihto$@zH6yj@g=>|e>G-QAx^VZRZnvaU^J*+(3=}LN?vsawhrFFcjAVtY-VNRI#U>UXo_dCy*HOSu(SnFn4AzH?B zZ+b*y{Cb^3WQ=T}eR#l)j9EM^w}jX+PCV{zzu3O84+sJ45v~W%)R&ja{0o;oSqYlM+ z)P&{E4Z`|ub286_=$S)YsEYekW8lJ;xk54`ZXkKc_t2i$oj<^`VcoQ9$T5cCNfT;K zMIGu0K_V6?x>Wvyd&8mZ>%5=2%o>|aR%vx%{AZaA((Xwd1LBc_>moPSj@vU(aYhSbFs-ef360Y;6!~a=uryl;`>BzDtE_B>lj5QE96E5WB+K zr1f933S)JvQiJ+#q>>w!Awu-out2w?jND8`1gt+aDQ)?A04lwAHdzizWoimM8f+vRhNarCA-K@D-Y@F#r89QJPqmkT%U1C8?v7Lx*U z^rdR=oolF{p|xk})ca_ZlhUqjRPiwnoIRtPe@xe}Jz1TP@0xH>bvPp20k<~@A3ucC ziL@6A5CaMp>Po<4oktF}B}xr`yru$*(3D02>8=b0S2e+f1dPG3Gb3$TBU% zmSiP=V#njd2&Cz?!|kaUT}8nS;wMF|ByiWRf$5SXNG6DjrXs>RzJ)$h^5zV zh|!vUl-qZQqy+B<8~L!Ez7D@rqUtnfP(&hwTXpDTYrx@_!PV79i_4I)*C}W{A7IL$ zP>W(vnb@p)rt2N!O3h_w@Httg>p^X32~0I12XDrM5}5BvTh zscK^@#_Dxvo^@{ujAR(Okoy!lZPprM^|!m}-Ll!(oeZm46N1(G#Y*f|A#J8v5w_h2 z?!-N^8|4EXyoRZ0P@o-z-LP{AMX`!$59`OxJ;+3Z`rK++WZKkG$1}>?WI_Z*8n#VW z)h(`ZcEysnWT;`5f!TTt*Nz1Bu)Fi?ime>&G(l;&J}p>1X`-Jxk_MCVtjTgR0AtUw z-78?m`0tB^OcB%*qb4{u+vXVj@RMEZ)37Mqyr2aQ7Nht>Cz zwLlC@ToZvTFiyPxj*QtT`CY#Dgx2#f-Hm%*G!Ea8nD)96C0$cKM(&F}8mC+1Y0}@jAGrY=r966*2*dfVia{C!tnvBZxKLmm&MxKQn)(vs+VmO?GbPZVMWY z!X&~p&xPZ^x=NH8r_DI#1qP0Kr5f8v;jySkHZ6ABoMNiJ&JgrXWLR)SN27n?1S&0~ zViyBElTX7$Mxv^mb?iJr?oHO|$bW9`oRNWrxvo$>x_8 z$bnj#97=C3*^0c2RB)UsD3A4U|*9sHjZjQ_|b#Fhpx+Nfvvbi zqk5%fkvFwtEDb1BnQ;2@I3r1aV>p8UfD_=`2^&-duPdhIwykp;9Y1P!m5fvt%gG+z zm932<&dnzor5U~F0&r0MbKlbA|Lr#WPitW!sOpD6A^_<_oo}$t&*I~K-)HkmTXS}} z$8@o}NEO)&gl%ROm!H*Dp5WASKAV{E;G)lRJD=U`G%d8?mhx{bK!%;Kze(Y;I>Fh@OlS5m#MJS5 z3kbiK3Sb=DkpIyo6Gf=9GU;G(7%FL$qXNnlm7Kh&(Wg#YRr7QmMg9({FDC_ zp0cd+w?}h77JihcA~2}(MWprC$j))&0SE#oWi6jtL z+i|3PZqV%-rcshrndp;*x8bfTWe1{5+sQ=r)WUz}qJ+;^Z^(TSm5OO#vb21p=Wec$ z@mw2Q+Q_#ZD;SA|q!+ioUCnx200q4#ingc8q`@RQVhEnCcbMXod^1}iV}Xw_$~P6{ z!~+e{b6b)v_-J$(fmwlD9jYNBDl>qa;F-Vs57=x4u;1(|E+~N}e~ed^v*m|ubT&6& z>PS>TXLTr_GniTfh$~*ah3H0u5O-sTW3KR-EAK;k)A8I*0;|mWxiILW`7Q=%ACr(Q z6feaUGa!V_?w)i(OC`tGu-ow|n^QzZN1}tKos#5&ddy}jqC?Fs9d^Kava-a)SPx%R zr4afrI6WFzuxOGYGaj0|CrX>yB#Xg|0;>o>cFls}t2=R?O}60Ba; z`dx7*$Fm&|U{vEg2ahY?>(Nis+p@W76134^DR&kYfQYR>EE8&D05UTBwAB{le!txQ z#KUzlm!rX~u5>uN^)HXKwoTVA8fi2_JUibNt8VA7BiSf5@k;RPFD|yIEQ0-&QXjyf z$!D`Xvlmi}t>xBN6)&)~jl89Ibc+xmiGAAtXC=l(Gc3}#^R>SepQU&oHL(P9>rd|e z*903*Mcj5x6QmF3BZIw2f;!t@^;&kA(?3|u!+^t&Gy1l&e{nR}wEFj{>Nr|V#4m7r zT_a{ySGuNoCUdl+%8+I(Ma%Ss;=d4{W*X-;cBEQD6MH8DTlaHntEkaYt+@7VbpI`@ zu^&F>bs}W-n-pNKX2Q5JoWC^Rra}d<*vQ)~qb!1{lU)M$@YONcvEz7-Pa}E005sA9l73fV&#c#RDs` zAA}@P`}##kZV#=$d-bB}i=uL2l{3YzbjgeZn(KYa${Vq)S3+c1&9fVvA-r=eVV%>K zy$v!^gc{xoke45^YdTAtX6P!$(B*YYPI7*68i7+^U1oa$oyLiGrvwb=Px+aL2uYP|!iL zC)Qzkc#%&IERu<2)x)T~*ht*UZ$jqv(=Dg4jJaY<(*u*~zVw%sD3v=4Db`vYAO7cR zPb$V!OknJ;zN)`X40M3f`EjHA9MbcB>Yb9f$a(te5|j)N8CEZb5FlT_QN+W33BZcU z#%$?hE)q=-4cEU5BV$vQO|u zq0+dqUT-;mB9N~lAoj)nO1)^K;mr^*sdaa>cmYAp@SF-9GcR0xePY#Z-W4-=8=y!% zRdo%v8;JdEWBMlHVC*CGF5l?Ft!}(%E1_05LF>yJ>YB_qd;E02X^x19bEZ{vQqA6q z@h(#{2F?@9*<{7%(>f-YP#ZC>w@sbt-3!^+7&I z@9IJEFan&7XJn;t{6YjvEgR#HXi@b*x{NOpzg26X&JfZ8=`$A&h4-FpxXS!iU?aR{hrII+>?U9|p)) z2*)ZBO*NILz}vUsn(Y<=;X_WnVNU*XNA1s#R$i2EbVfhdL?k;RX*SiC?b7z6QH(&p z0Ht75&~1UZOp$rpB3W@A$yan2Kq^kQ99!noc*1u%g=3cg>qQ(5u9D_cqu}H;WO8%-%A5T+&;EU;=a?)70*0$jHqY9AC&8DXLP4Ulj zjg#tr^rgfc8#JzK+CvPF*i>Pg-fQ zGtl+a0-qP?;&DL}Lu@nWqcht1wd+q1c6vCEswCAmwa35uUegSG?@SiGA8k`HgD|EX zZJ+jQ1uOj#3CpQMIASQmf-_H|=n~*r&=+fjmK{o>A#rd6DzX4N33X%*F)i`34h~1RkUtt6? zs^caJS7++&zJCAAt*}P^$=Joy)AQ8?e%qFP-Y@Yr#vur1lTE+A@8TPnl)Lo(73eVQ zaPt+_;SgT#C%^lZ_KSi;C^ePe;XGrU0W#HJR_7JfO@0f)8MN6i=}#;-x5s;rg*+ zYWlO|p)d6-55gCgLih?ShW%T$fH@Skv*v;Ei^gwRv(plsvYB62>b;zopDCeB8wx^D zQ$saPv@7i!CZf(YRZ&NWynke;9})xXjAmW|jxKV430HPM`2%WlN-!`=e-)!^e@M_R zh8td|^V31`TVg^s-B|Wnd-|tWb8thw)_MuKyJ_*O=PzRq-Q!51YwS3QMi1Eiwj7xU zRL@s|yC;R|W`7*wdudTK40;594NUHHy<&=PnhspJ+!=--WbJj4fo_It^6sim{lpw6 zwNJ?7`Xk%^UW%SP9DZH<>>P$4a7qf0wDmmdXj5Bkw*MG#yqlkiC#fx#R*T%5 zTGy9j3;7ic&AFpI4$h+YwUhI$?+WF{!s_F3C9k`73$)jVGSksVdm8Fc%cA;J*qWH5 zNz7Ii7Y?V^ivLT0_WSc-61sqx;UJKjYG`|{>(czlTGuks^}%Rc^K4Wpd=X07>NwNz z^rY2dJBGu`T2a5AZo$hTYOG#H`&wCgm16ap_Jhb<)NF91%Mm^ zHld5*Bk07B7ER#p!$Ug7Ns8A;!#k$4YH%pfQL&WRH153yCC#aIc(N{Rh*{x(umt)=A;q* zI1R3BxOHV&Ek=6kaXz)|rWPq7$1NR~hST$BGuCU8069CcSzyYa*kt=Mln#Ao*7G4dh^+|@MeORZ)Cd@mi8Sgun;E4{ zRwD!q&o05e;KLf1GnXrNC1k?@>hDr@zo~_-ejyY49>|y@o<`fXaJJo>)@xu?svey! z0Ww;H-(%~JgjW9Rd(ae0hn=6(!BxitXO9ODvPNhB{}>D;$hx1={BlTKmC0hH{((WW zV$R|U2#Nl07JzB(c=WeSa5sRG9tNZW=NL`fA|Og%0Ahg+$7E;(p#Q8^|C^k`e&Py4 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

8QN&!r+IdaGuHYZM;u%kyGu^rpD06=WFr=L7- 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 n><34#Oa?2bK~?Dk!&EorO+#?v@c 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 z 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 { + + test.beforeEach(async ({ page }) => { + console.log(`Running ${test.info().title}`); + }); + + test('should show up in 4x3 grid at the end of the video if it is configured and after postRoll', async ({ page }) => { + await page.goto('/suggested_videos_e2e.html'); + + const fullPlayer = page.locator('#fluid_video_wrapper_fluid-player-e2e-case'); + const video = page.locator('video'); + + fullPlayer.click(); + await waitForVideoToPlay(video); + + const videoDuration = await getVideoDuration(video); + await setVideoCurrentTime(video, videoDuration - 5); + + await waitForVideoToPlay(video); + await page.waitForTimeout(5500); + + const suggestedVideosGrid = page.locator('.suggested_tile_grid'); + await expect(suggestedVideosGrid).not.toBeVisible(); + + await page.waitForTimeout(3000); + const skipButton = page.locator('.skip_button'); + skipButton.click(); + + await expect(suggestedVideosGrid).toBeVisible(); + expect(await suggestedVideosGrid.screenshot()).toMatchSnapshot('baseline-sv-grid.png', { threshold: 0.02 }); + }); + +}); + diff --git a/client/fluid-player/package-lock.json b/client/fluid-player/package-lock.json new file mode 100644 index 0000000..97a0f14 --- /dev/null +++ b/client/fluid-player/package-lock.json @@ -0,0 +1,7233 @@ +{ + "name": "fluid-player", + "version": "3.46.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fluid-player", + "version": "3.46.0", + "license": "MIT", + "dependencies": { + "dashjs": "^4.5.2", + "es6-promise": "^4.2.8", + "hls.js": "^1.5.13", + "panolens": "^0.12.1", + "videojs-vtt.js": "^0.15.4" + }, + "devDependencies": { + "@babel/core": "^7.20.12", + "@babel/preset-env": "^7.20.2", + "@playwright/test": "^1.49.0", + "@types/node": "^22.9.1", + "babel-loader": "^9.1.2", + "cheerio": "^1.0.0-rc.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.7.3", + "html-webpack-plugin": "^5.5.0", + "semver": "^7.3.2", + "style-loader": "^3.3.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.1.1", + "webpack-dev-server": "^4.11.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "dev": true, + "license": "MIT", + "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.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "license": "MIT", + "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.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", + "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", + "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-static-block instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-export-namespace-from instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-json-strings instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", + "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz", + "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", + "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", + "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", + "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", + "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", + "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@playwright/test": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0.tgz", + "integrity": "sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.49.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", + "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", + "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.31", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "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, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", + "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", + "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", + "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "deprecated": "package has been renamed to acorn-import-attributes", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ajv-keywords/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz", + "integrity": "sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz", + "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz", + "integrity": "sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A==", + "license": "MIT", + "dependencies": { + "bcp-47": "^1.0.0", + "bcp-47-match": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/bonjour-service/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "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/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/codem-isoboxer": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/codem-isoboxer/-/codem-isoboxer-0.3.6.tgz", + "integrity": "sha512-LuO8/7LW6XuR5ERn1yavXAfodGRhuY2yP60JTZIw5yNYMCE5lUVbk3NFUCJxjnphQH+Xemp5hOGb1LgUXm00Xw==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/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==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.27.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", + "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dashjs": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/dashjs/-/dashjs-4.5.2.tgz", + "integrity": "sha512-WXPk0lPDSaHjiSVoVRh2jQPiMmB1alKUH8hV2CVmaI0vPUeT1wIY7madVE38SthfOmwS9IJViv1RrxrxdGjElg==", + "license": "BSD-3-Clause", + "dependencies": { + "bcp-47-match": "^1.0.3", + "bcp-47-normalize": "^1.1.1", + "codem-isoboxer": "0.3.6", + "es6-promise": "^4.2.8", + "fast-deep-equal": "2.0.1", + "html-entities": "^1.2.1", + "imsc": "^1.0.2", + "localforage": "^1.7.1", + "ua-parser-js": "^1.0.2" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.285", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.285.tgz", + "integrity": "sha512-47o4PPgxfU1KMNejz+Dgaodf7YTcg48uOfV1oM6cs3adrl2+7R+dHkt3Jpxqo0LRCbGJEzTKMUt0RdvByb/leg==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/express/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==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "license": "MIT", + "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-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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz", + "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "ISC" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hls.js": { + "version": "1.5.15", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.15.tgz", + "integrity": "sha512-6cD7xN6bycBHaXz2WyPIaHn/iXFizE5au2yvY5q9aC4wfihxAr16C9fUy4nxh2a3wOw0fEgLRa9dN6wsYjlpNg==", + "license": "Apache-2.0" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/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==", + "dev": true, + "license": "MIT", + "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/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imsc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/imsc/-/imsc-1.1.3.tgz", + "integrity": "sha512-IY0hMkVTNoqoYwKEp5UvNNKp/A5jeJUOrIO7judgOyhHT+xC6PA4VBOMAOhdtAYbMRHx9DTgI8p6Z6jhYQPFDA==", + "license": "BSD-2-Clause", + "dependencies": { + "sax": "1.2.1" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "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==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", + "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/panolens": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/panolens/-/panolens-0.12.1.tgz", + "integrity": "sha512-2hpjm+rRnDdaLD5Bak49K0Y9/X6vOr1OcyJx5piSA6sCOs1tsgchMgKIwpSGCMpBMHWZ10E/Cz4BIwyXYebt5g==", + "license": "MIT", + "dependencies": { + "three": "^0.105.2" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/playwright": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", + "integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.49.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", + "integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "license": "ISC" + }, + "node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.16.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", + "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "dev": true, + "license": "BSD-2-Clause", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/three": { + "version": "0.105.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.105.2.tgz", + "integrity": "sha512-L3Al37k4g3hVbgFFS251UVtIc25chhyN0/RvXzR0C+uIBToV6EKDG+MZzEXm9L2miGUVMK27W46/VkP6WUZXMg==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz", + "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "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==", + "dev": true, + "license": "BSD-2-Clause", + "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": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/videojs-vtt.js": { + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.4.tgz", + "integrity": "sha512-r6IhM325fcLb1D6pgsMkTQT1PpFdUdYZa1iqk7wJEu+QlibBwATPfPc9Bg8Jiym0GE5yP1AG2rMLu+QMVWkYtA==", + "license": "Apache-2.0", + "dependencies": { + "global": "^4.3.1" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz", + "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.0", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.4", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "dev": true, + "license": "MIT", + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/client/fluid-player/package.json b/client/fluid-player/package.json new file mode 100644 index 0000000..d966999 --- /dev/null +++ b/client/fluid-player/package.json @@ -0,0 +1,60 @@ +{ + "name": "fluid-player", + "version": "3.46.0", + "description": "Fluid Player is a free HTML5 video player", + "main": "src/index.js", + "scripts": { + "build": "webpack --mode=production", + "build-cdn": "webpack --mode=production --env dist='current' && webpack --mode=production --env dist='versioned'", + "build-dev": "webpack --mode=development", + "build-dev-debug": "webpack --mode=development --debug", + "dev-server": "webpack serve --mode=development --host 0.0.0.0", + "dev-server-debug": "webpack serve --mode=development --env debug --host 0.0.0.0", + "dev-server-test": "webpack serve --mode=production --no-live-reload --host 0.0.0.0", + "start": "npm run dev-server-debug", + "e2e-ui": "npx playwright test --ui", + "e2e-report": "npx playwright show-report", + "e2e": "npx playwright test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/fluid-player/fluid-player.git" + }, + "author": "EXOGROUP ", + "license": "MIT", + "bugs": { + "url": "https://github.com/fluid-player/fluid-player/issues" + }, + "homepage": "https://fluidplayer.com", + "com_fluidplayer": { + "cdn": "https://cdn.fluidplayer.com" + }, + "browserslist": [ + "> 0.25%", + "not dead", + "IE 11" + ], + "dependencies": { + "dashjs": "^4.5.2", + "es6-promise": "^4.2.8", + "hls.js": "^1.5.13", + "panolens": "^0.12.1", + "videojs-vtt.js": "^0.15.4" + }, + "devDependencies": { + "@babel/core": "^7.20.12", + "@babel/preset-env": "^7.20.2", + "@playwright/test": "^1.49.0", + "@types/node": "^22.9.1", + "babel-loader": "^9.1.2", + "cheerio": "^1.0.0-rc.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.7.3", + "html-webpack-plugin": "^5.5.0", + "semver": "^7.3.2", + "style-loader": "^3.3.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.1.1", + "webpack-dev-server": "^4.11.1" + } +} diff --git a/client/fluid-player/playwright.config.ts b/client/fluid-player/playwright.config.ts new file mode 100644 index 0000000..e71cea4 --- /dev/null +++ b/client/fluid-player/playwright.config.ts @@ -0,0 +1,73 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './e2e', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:8080', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + // { + // name: 'chromium', + // use: { ...devices['Desktop Chrome'] }, + // }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + // { + // name: 'webkit', + // use: { ...devices['Desktop Safari'] }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + snapshotPathTemplate: '{testDir}/snapshots/{arg}{ext}', // Use the specified filename + + /* Run your local dev server before starting the tests */ + // webServer: { + // command: 'npm run start', + // url: 'http://127.0.0.1:3000', + // reuseExistingServer: !process.env.CI, + // }, +}); diff --git a/client/fluid-player/src/browser.js b/client/fluid-player/src/browser.js new file mode 100644 index 0000000..9628126 --- /dev/null +++ b/client/fluid-player/src/browser.js @@ -0,0 +1,19 @@ +/** + * Build entry point for CDN builds. + * You SHOULD NOT import this file except if you plan to build browser distribution of Fluid Player. + */ + +import fluidPlayerInitializer from './index'; + +// Import CSS automatically in browser builds. +import './css/fluidplayer.css'; + +if (window) { + /** + * Register public interface. + */ + if (!window.fluidPlayer) { + window.fluidPlayer = fluidPlayerInitializer; + } +} + diff --git a/client/fluid-player/src/css/fluidplayer.css b/client/fluid-player/src/css/fluidplayer.css new file mode 100644 index 0000000..7ed8fb6 --- /dev/null +++ b/client/fluid-player/src/css/fluidplayer.css @@ -0,0 +1,1590 @@ +@import "./suggestedVideos.css"; + +.fluid_video_wrapper { + animation: none; + animation-delay: 0; + animation-direction: normal; + animation-duration: 0; + animation-fill-mode: none; + animation-iteration-count: 1; + animation-name: none; + animation-play-state: running; + animation-timing-function: ease; + backface-visibility: visible; + background: 0; + background-attachment: scroll; + background-clip: border-box; + background-color: transparent; + background-image: none; + background-origin: padding-box; + background-position: 0 0; + background-position-x: 0; + background-position-y: 0; + background-repeat: repeat; + background-size: auto auto; + border: 0; + border-style: none; + border-width: medium; + border-color: inherit; + border-bottom: 0; + border-bottom-color: inherit; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom-style: none; + border-bottom-width: medium; + border-collapse: separate; + border-image: none; + border-left: 0; + border-left-color: inherit; + border-left-style: none; + border-left-width: medium; + border-radius: 0; + border-right: 0; + border-right-color: inherit; + border-right-style: none; + border-right-width: medium; + border-spacing: 0; + border-top: 0; + border-top-color: inherit; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top-style: none; + border-top-width: medium; + bottom: auto; + box-shadow: none; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + caption-side: top; + clear: none; + clip: auto; + color: inherit; + columns: auto; + column-count: auto; + column-fill: balance; + column-gap: normal; + column-rule: medium none currentColor; + column-rule-color: currentColor; + column-rule-style: none; + column-rule-width: none; + column-span: 1; + column-width: auto; + content: normal; + counter-increment: none; + counter-reset: none; + cursor: auto; + direction: ltr; + display: inline; + empty-cells: show; + float: none; + font: normal; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-size: medium; + font-style: normal; + font-variant: normal; + font-weight: normal; + height: auto; + hyphens: none; + left: auto; + letter-spacing: normal; + line-height: normal; + list-style: none; + list-style-image: none; + list-style-position: outside; + list-style-type: disc; + margin: 0; + margin-bottom: 0; + margin-left: 0; + margin-right: 0; + margin-top: 0; + max-height: none; + max-width: none; + min-height: 0; + min-width: 0; + opacity: 1; + orphans: 0; + outline: 0; + outline-color: invert; + outline-style: none; + outline-width: medium; + overflow: visible; + overflow-x: visible; + overflow-y: visible; + padding: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + page-break-after: auto; + page-break-before: auto; + page-break-inside: auto; + perspective: none; + perspective-origin: 50% 50%; + position: static; + /* May need to alter quotes for different locales (e.g fr) */ + quotes: '\201C' '\201D' '\2018' '\2019'; + right: auto; + tab-size: 8; + table-layout: auto; + text-align: inherit; + text-align-last: auto; + text-decoration: none; + text-decoration-color: inherit; + text-decoration-line: none; + text-decoration-style: solid; + text-indent: 0; + text-shadow: none; + text-transform: none; + top: auto; + transform: none; + transform-style: flat; + transition: none; + transition-delay: 0s; + transition-duration: 0s; + transition-property: none; + transition-timing-function: ease; + unicode-bidi: normal; + vertical-align: baseline; + visibility: visible; + white-space: normal; + widows: 0; + width: auto; + word-spacing: normal; + z-index: auto; + -webkit-tap-highlight-color: transparent; +} + +.fluid_video_wrapper canvas { + pointer-events: none; +} + +.fluid_video_wrapper, +.fluid_video_wrapper * { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.fluid_video_wrapper:after, .fluid_video_wrapper:before { + content: none; +} + +.fluid_video_wrapper { + position: relative; + display: inline-block; +} + +.fluid_video_wrapper video { + position: relative; + background-color: #000000; + display: block; +} + +.fluid_video_wrapper .vast_video_loading { + display: table; + text-align: center; + width: 100%; + height: 100%; + top: 0; + left: 0; + pointer-events: auto; + z-index: 1; +} + +.fluid_video_wrapper .vast_video_loading:before { + background-image: url("../static/fluid-spinner.svg"); + background-position: center, center; + background-repeat: no-repeat, repeat; + background-color: rgba(0, 0, 0, 0.2); + content: ''; + position: absolute; + height: 100%; + width: 100%; + top: 0; + left: 0; +} + +.skip_button { + position: absolute; + bottom: 50px; + right: 0; + background-color: rgba(0, 0, 0, 0.7); + padding: 13px 21px 13px 21px; +} + +.skip_button, .skip_button a { + color: #ffffff; + text-decoration: none; + cursor: pointer; + z-index: 10; + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-weight: normal; + white-space: nowrap; + text-align: start; +} + +.skip_button a span.skip_button_icon { + display: inline-block; + text-align: left; + width: 21px; + position: relative; + bottom: 20px; +} + +.skip_button a span.skip_button_icon:before { + background: url('../static/fluid-icons.svg') no-repeat; + position: absolute; + height: 18px; + width: 18px; + top: 6px; + content: ""; + opacity: 0.8; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; + background-position: -122px -57px; +} + +.skip_button a span.skip_button_icon:before:hover { + opacity: 1; +} + +.skip_button_disabled { + cursor: default !important; + padding: 13px 21px 13px 21px; +} + +.close_button { + position: absolute; + background: #000000 url("../static/close-icon.svg") no-repeat scroll center center; + height: 16px; + width: 16px; + top: 0; + right: 0; + background-size: 18px 18px; + cursor: pointer; + padding: 1px; + z-index: 31; +} + +.close_button:hover { + background-color: #000000; + border: 1px solid #ffffff; +} + +.vast_clickthrough_layer { + /*IE Fix*/ + background-color: white; + opacity: 0; +} + +.fluid_ad_playing { + position: absolute; + background-color: black; + opacity: 0.8; + border-radius: 1px; + color: #ffffff; + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-weight: normal; + white-space: nowrap; + text-align: start; + line-height: 18px; + z-index: 10; + padding: 13px 21px 13px 21px; +} + +.fluid_ad_cta { + position: absolute; + background-color: rgba(0, 0, 0, 0.7); + color: #ffffff; + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-weight: normal; + text-align: right; + cursor: pointer; + z-index: 10; + padding: 13px 21px 13px 13px; + max-width: 50%; +} + +.fluid_ad_cta.left { + text-align: left; +} + +.fluid_ad_cta a { + text-decoration: none; + color: #ffffff; + line-height: 18px; +} + +.fluid_ad_cta:hover, +.skip_button:not(.skip_button_disabled):hover { + background-color: rgba(0, 0, 0, 1); +} + +.fluid_html_on_pause, +.fluid_html_on_pause_container, +.fluid_pseudo_poster { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + z-index: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + pointer-events: none; +} + +.fluid_html_on_pause_container *, +.fluid_html_on_pause * { + pointer-events: auto; +} + +/*Mobile Layout*/ +.fluid_video_wrapper.mobile .skip_button { + bottom: 50px; +} + +/* +.fluid_video_wrapper.mobile .fluid_ad_cta { + bottom: 125px; +} +*/ +.fluid_initial_play { + width: 60px; + height: 60px; + border-radius: 50px; + cursor: pointer; +} + +.fluid_initial_play_button { + margin-top: 15px; + margin-left: 23px; + border-style: solid; + border-width: 15px 0 15px 21px; + border-color: transparent transparent transparent #ffffff; +} + +.fluid_initial_pause_button { + margin-top: 15px; + margin-left: 17px; + width: 8px; + height: 31px; + border: 9px solid white; + border-top: 0; + border-bottom: 0; +} + +.fluid_timeline_preview { + bottom: 11px; + color: #ffffff; + font-size: 13px; + line-height: 18px; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-weight: normal; + text-align: start; + padding: 13px 21px 13px 21px; + background-color: rgba(0, 0, 0, 0.85); + border-radius: 1px; +} + +/* Duration */ +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_fluid_control_duration { + display: inline-block; + white-space: nowrap; + height: 24px; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-size: 13px; + font-weight: normal; + font-style: normal; + text-align: left; + text-decoration: none; + line-height: 21px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_fluid_control_duration.cardboard_time { + left: 13px; + top: -15px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_fluid_control_duration.cardboard_time .ad_timer_prefix { + color: #F2C94C; +} + +.fluid_video_wrapper.fluid_player_layout_default .ad_countdown .ad_timer_prefix { + color: #F2C94C; +} + +.fluid_video_wrapper.fluid_player_layout_default .ad_countdown { + /*display: none;*/ + position: absolute; + right: 0; + width: 75px; + bottom: 5px; + height: 24px; + color: red; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-size: 13px; + font-weight: normal; + font-style: normal; + text-align: left; + text-decoration: none; + line-height: 21px; +} + +.initial_controls_show { + visibility: visible !important; + opacity: 1 !important; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container { + color: white; + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: -moz-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.6) 100%); /* FF3.6-15 */ + background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.6) 100%); /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.6) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#ad000000', GradientType=0); /* IE6-9 */ + height: 100%; + width: 100%; + z-index: 0; + pointer-events: none; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel { + height: 96px; + width: 72px; + left: 10px; + top: 10px; + position: absolute; + background: rgba(0, 0, 0, 0.7); + text-align: center; + border-radius: 6px; + overflow: hidden; + pointer-events: auto; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_button { + cursor: pointer; + display: inline-block; + text-align: left; + height: 24px; + width: 24px; + position: relative; + background: url(../static/fluid-icons.svg) no-repeat; + opacity: 0.8; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_button:hover { + opacity: 1; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_joystick_up { + background-position: -336px -55px; + -webkit-transform: rotate(270deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(270deg); /* IE 9 */ + transform: rotate(270deg); /* Firefox 16+, IE 10+, Opera */ + display: block; + left: calc(50% - 12px); + top: 0; + position: absolute; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_joystick_left { + background-position: -336px -55px; + -webkit-transform: rotate(180deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(1890deg); /* IE 9 */ + transform: rotate(180deg); /* Firefox 16+, IE 10+, Opera */ + display: block; + left: 0; + top: 24px; + position: absolute; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_joystick_right { + background-position: -336px -55px; + -webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(0deg); /* IE 9 */ + transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */ + display: block; + right: 0; + top: 24px; + position: absolute; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_joystick_down { + background-position: -336px -55px; + -webkit-transform: rotate(90deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(90deg); /* IE 9 */ + transform: rotate(90deg); /* Firefox 16+, IE 10+, Opera */ + display: block; + left: calc(50% - 12px); + top: 48px; + position: absolute; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_joystick_zoomdefault { + background-position: -336px -17px; + top: 72px; + -webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(0deg); /* IE 9 */ + transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */ + position: absolute; + left: calc(50% - 12px); +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_joystick_zoomin { + background-position: -305px -55px; + top: 72px; + -webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(0deg); /* IE 9 */ + transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */ + position: absolute; + right: 0; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vr_container .fluid_vr_joystick_panel .fluid_vr_joystick_zoomout { + background-position: -305px -17px; + top: 72px; + -webkit-transform: rotate(0deg); /* Chrome, Opera 15+, Safari 3.1+ */ + -ms-transform: rotate(0deg); /* IE 9 */ + transform: rotate(0deg); /* Firefox 16+, IE 10+, Opera */ + position: absolute; + left: 0; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container.fluid_vr_controls_container { + width: 50% !important; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container.fluid_vr2_controls_container { + width: 50% !important; + left: 50%; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container { + color: white; + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: -moz-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.6) 100%); /* FF3.6-15 */ + background: -webkit-linear-gradient(top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.6) 100%); /* Chrome10-25,Safari5.1-6 */ + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.6) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#ad000000', GradientType=0); /* IE6-9 */ + height: 53px; + z-index: 1; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vpaid_iframe { + position: absolute; + top: 0; + width: 100%; + height: 100%; + left: 0; + z-index: -10; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vpaid_nonlinear_slot_iframe { + z-index: 30; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_vpaid_slot { + position: absolute !important; + top: 0 !important; + width: 100% !important; + height: 100% !important; + left: 0 !important; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_subtitles_container { + color: white; + position: absolute; + bottom: 46px; + left: 0; + right: 0; + height: auto; + z-index: 1; + text-align: center; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_subtitles_container div { + display: inline; + background: black; + color: white; + font-size: 1em; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + padding: 0.25em; + border-radius: 4px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fade_out { + visibility: hidden; + opacity: 0; + -webkit-transition: visibility 0.5s, opacity 0.5s; /* Safari */ + transition: visibility 0.5s, opacity 0.5s; +} + +.fluid_video_wrapper.fluid_player_layout_default .fade_in { + visibility: visible; + opacity: 1; + -webkit-transition: visibility 0.5s, opacity 0.5s; /* Safari */ + transition: visibility 0.5s, opacity 0.5s; +} + +.fluid_video_wrapper.fluid_player_layout_default.pseudo_fullscreen { + width: 100% !important; + height: 100% !important; + top: 0; + left: 0; + position: fixed; + z-index: 99999; +} + +.fluid_video_wrapper.fluid_player_layout_default:-webkit-full-screen { + width: 100% !important; + height: 100% !important; + position: absolute; + top: 0; + left: 0; +} + +.fluid_video_wrapper.fluid_player_layout_default:-ms-fullscreen { + width: 100% !important; + height: 100% !important; + position: absolute; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_context_menu { + background-color: #000000; + color: #ffffff; + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-weight: normal; + white-space: nowrap; + text-align: start; + z-index: 11; + opacity: 0.8; + border-radius: 1px; +} + +/* IE 10+ */ +_:-ms-lang(x), +.fluid_video_wrapper.fluid_player_layout_default .fluid_context_menu { + text-align: left; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_context_menu ul { + list-style: none; + padding: 0; + margin: 0; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_context_menu ul li { + padding: 13px 71px 13px 21px; + cursor: pointer; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_context_menu ul li + li { + border-top: 1px solid #000000; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_context_menu ul li:hover { + background-color: #1e1e1e; + color: #fbfaff; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_left { + width: 24px; + left: 20px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container.skip_controls .fluid_controls_left { + width: 80px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button { + width: 24px; + height: 24px; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_duration { + display: flex; + align-items: center; +} + +.fluid_button_live_indicator { + margin-right: 10px; + display: inline-flex; + align-items: center; + padding: 2px 5px; + background-color: red; + color: white; + border-radius: 4px; + font-weight: bold; + font-size: 11px; + margin-bottom: 3px; +} + +.live_circle { + position: relative; + display: inline-block; + width: 6px; + height: 6px; + background-color: transparent; + border: 1px solid #ffffff; + border-radius: 50%; + margin-left: 3px; +} + +.live_circle::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 4px; + height: 4px; + background-color: #ffffff; + border-radius: 50%; +} + +/* On smaller devices (mobile) */ +@media (max-width: 768px) { + .fluid_button_live_indicator { + position: absolute; + font-size: 8px; + top: -30px; + left: -40px; + padding: 2px 3px !important; + } +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right { + left: 60px; + right: 20px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container.skip_controls .fluid_controls_right { + left: 110px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_left, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right { + position: absolute; + height: 24px; + top: 23px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container { + height: 14px; + position: absolute; + left: 13px; + right: 13px; + z-index: 1; + top: 8px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_controls_progress { + position: absolute; + top: 5px; + width: 100%; + height: 4px; + background-color: rgba(255, 255, 255, 0.25); +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_controls_buffered { + position: absolute; + top: 5px; + width: 0; + height: 3px; + background-color: rgba(255, 255, 255, 0.5); + z-index: -1; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_controls_progress, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_controls_progress .fluid_controls_currentprogress { + position: absolute; + height: 3px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container:hover .fluid_controls_progress, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container:hover .fluid_controls_buffered, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container:hover .fluid_controls_ad_markers_holder { + margin-top: -1px; + height: 5px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container:hover .fluid_controls_progress .fluid_controls_currentprogress { + height: 5px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_timeline_preview_container { + border: 1px solid #262626; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_timeline_preview_container, .fluid_timeline_preview_container_shadow { + bottom: 14px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container.fluid_slider .fluid_controls_progress .fluid_controls_currentprogress .fluid_controls_currentpos { + background-color: white; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container.fluid_slider .fluid_controls_progress .fluid_controls_currentprogress .fluid_controls_currentpos, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container.fluid_ad_slider .fluid_controls_progress .fluid_controls_currentprogress .fluid_controls_currentpos { + opacity: 0; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container.fluid_slider:hover .fluid_controls_progress .fluid_controls_currentprogress .fluid_controls_currentpos { + opacity: 1; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container.fluid_slider .fluid_controls_progress .fluid_controls_currentprogress .fluid_controls_currentpos { + -webkit-transition: opacity 0.3s; /* Safari */ + transition: opacity 0.3s; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_ad_markers_holder { + position: absolute; + top: 5px; + width: 100%; + height: 3px; + z-index: 2; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_ad_marker { + position: absolute; + background-color: #FFCC00; + height: 100%; + width: 6px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_volume_container { + height: 24px; + width: 56px; + left: 25px; + top: -1px; + z-index: 2; + opacity: 0.8; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; + display: none; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_volume_container:hover { + opacity: 1; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_volume_container .fluid_control_volume { + position: relative; + height: 3px; + width: 100%; + margin-top: 10px; + background-color: rgba(171, 172, 172, 0.68); + z-index: 3; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_volume_container .fluid_control_volume .fluid_control_currentvolume { + float: left; + background-color: white; + height: 3px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_volume_container .fluid_control_volume .fluid_control_currentvolume .fluid_control_volume_currentpos { + background-color: white; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_controls_progress .fluid_controls_currentpos { + right: -4px; + z-index: 3; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_volume_container .fluid_control_volume .fluid_control_currentvolume .fluid_control_volume_currentpos, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_controls_progress .fluid_controls_currentpos { + width: 11px; + height: 11px; + position: absolute; + top: -4px; + border-radius: 6px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_progress_container .fluid_controls_progress .fluid_controls_currentpos { + width: 13px; + height: 13px; + position: absolute; + top: -4px; + border-radius: 6px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container.no_volume_bar .fluid_controls_right .fluid_control_volume_container { + display: none; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_slider { + cursor: pointer; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container div div { + display: block; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button.fluid_button_fullscreen, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button.fluid_button_fullscreen_exit, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button.fluid_button_mini_player { + float: right; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_video_source, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_subtitles, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_cardboard { + font-size: 13px; + height: 24px; + line-height: 24px; + float: right; + cursor: pointer; + position: relative; + text-align: right; + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Safari */ + -khtml-user-select: none; /* Konqueror HTML */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_video_source .fluid_video_sources_title, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_subtitles .fluid_subtitles_title { + width: 80px; + overflow: hidden; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_subtitles .fluid_subtitles_list, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_video_source .fluid_video_sources_list, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_video_playback_rates { + position: absolute; + bottom: 25px; + right: 3px; + z-index: 888888; + opacity: 99%; + background-color: rgba(0, 0, 0, 1); + border-radius: 2px; + color: #ffffff; + font-size: 13px; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-weight: normal; + white-space: nowrap; + text-align: start; + width: max-content; + padding: 0.5em; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_subtitles .fluid_subtitles_list .fluid_subtitle_list_item, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_video_source .fluid_video_sources_list .fluid_video_source_list_item { + padding: 12px 34px 12px 24px; + line-height: 15px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_video_source .fluid_video_sources_list .fluid_video_source_list_item:hover, +.fluid_video_playback_rates_item:hover, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_subtitles .fluid_subtitles_list .fluid_subtitle_list_item:hover { + background-color: #3a3a3a; +} + + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_volume_container, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button.fluid_button_volume, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button.fluid_button_mute { + position: absolute; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button.fluid_button_volume, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button.fluid_button_mute { + left: -10px; +} + +/* Button Icons */ +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_live_indicator, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_play, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_pause, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_back, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_forward, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_volume, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_mute, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_video_source, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_fullscreen, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_fullscreen_exit, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_playback_rate, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_download, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_theatre, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_subtitles, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_cardboard, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_mini_player { + display: inline-block; + text-align: left; + height: 24px; + width: 24px; + position: relative; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_play:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_pause:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_back:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_forward:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_volume:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_mute:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_video_source:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_fullscreen:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_fullscreen_exit:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_playback_rate:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_download:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_theatre:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_subtitles:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_cardboard:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_mini_player:before{ + background: url('../static/fluid-icons.svg') no-repeat; + position: absolute; + height: 24px; + width: 24px; + top: 1px; + left: 5px; + content: ""; + opacity: 0.8; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_play:before { + background-position: -15px -19px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_pause:before { + background-position: -15px -57px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_volume:before { + background-position: -52px -19px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_mute:before { + background-position: -52px -57px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_fullscreen:before { + background-position: -88px -19px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_fullscreen_exit:before { + background-position: -88px -57px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_video_source:before { + background-position: -122px -19px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_playback_rate:before { + background-position: -232px -19px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_download:before { + background-position: -194px -18px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_theatre:before { + background-position: -195px -56px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_subtitles:before { + background-position: -269px -19px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_cardboard:before { + background-position: -269px -56px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_back:before { + background: url('../static/skip-backward.svg') no-repeat; + background-position: -2px -2px; +} + + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_forward:before { + background: url('../static/skip-forward.svg') no-repeat; + background-position: -2px -2px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_mini_player:before { + background: url('../static/miniplayer-toggle-on.svg') no-repeat 0 0; + background-size: 20px; +} + +.fluid_video_wrapper.fluid_mini_player_mode .fluid_controls_container .fluid_button.fluid_button_mini_player:before { + background: url('../static/miniplayer-toggle-off.svg') no-repeat 0 0; + background-size: 20px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_back { + margin-left: 5px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_video_source:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_fullscreen_exit:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_fullscreen:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_mute:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_volume:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_pause:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_play:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_back:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_skip_forward:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_playback_rate:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_download:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_theatre:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_subtitles:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_cardboard:hover:before, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_mini_player:hover:before { + opacity: 1; +} + +.fp_title { + position: absolute; + top: 10px; + left: 10px; + color: #ffffff; + font-size: 15px; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + font-weight: normal; + white-space: nowrap; +} + +/* Pulse class and keyframe animation */ +.transform-active { + animation: flash 1s infinite; + display: inline-block !important; + opacity: 0; +} + +@-webkit-keyframes flash { + 0% { + opacity: 0.6; + -webkit-box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.5); + } + 70% { + -webkit-box-shadow: 0 0 0 20px rgba(255, 255, 255, 0); + } + 100% { + opacity: 0; + display: none; + -webkit-box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); + } +} + +@keyframes flash { + 0% { + opacity: 0.6; + -moz-box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.5); + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0.6); + } + 70% { + -moz-box-shadow: 0 0 0 20px rgba(255, 255, 255, 0); + box-shadow: 0 0 0 20px rgba(255, 255, 255, 0); + } + 100% { + opacity: 0; + display: none; + -moz-box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); + box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); + } +} + +.fluid_nonLinear_top, .fluid_nonLinear_middle, .fluid_nonLinear_bottom { + flex-direction: column; + align-items: center; + cursor: pointer; + display: flex; + vertical-align: middle; + align-content: center; + border: 1px solid #777777; + position: absolute; + left: 50%; + margin-right: -50%; + background-color: rgba(0, 0, 0, 0.7); +} + +.fluid_nonLinear_top { + top: 20px; + transform: translate(-50%); +} + +.fluid_nonLinear_middle { + top: 50%; + transform: translate(-50%, -50%); +} + +.fluid_nonLinear_bottom { + bottom: 50px; + transform: translate(-50%); +} + +.fluid_vpaidNonLinear_top, .fluid_vpaidNonLinear_middle, .fluid_vpaidNonLinear_bottom { + flex-direction: column; + align-items: center; + cursor: pointer; + vertical-align: middle; + align-content: center; + position: absolute; + display: flex; +} + +.fluid_vpaidNonLinear_frame { + margin: auto; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.fluid_vpaidNonLinear_top { + top: 20px; +} + +.fluid_vpaidNonLinear_middle { + top: 50%; +} + +.fluid_vpaidNonLinear_bottom { + bottom: 50px; +} + +.add_icon_clickthrough { + color: #F2C94C; + line-height: 18px; + text-overflow: ellipsis; + max-width: 100%; + white-space: nowrap; + overflow: hidden; + display: inline-block; +} + +.add_icon_clickthrough:before { + background: url('../static/fluid-icons.svg') no-repeat; + height: 18px; + width: 18px; + top: 30px; + padding: 3px 22px 0 0; + content: ""; + background-position: -162px -57px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_theatre, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_playback_rate, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_video_source, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_download, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_subtitles, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_cardboard { + float: right; + padding-right: 5px; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_theatre, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_playback_rate, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_video_source, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_download, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_subtitles, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_button.fluid_button_cardboard { + display: none; +} + +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_subtitles .fluid_subtitles_list, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_button_video_source .fluid_video_sources_list, +.fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_video_playback_rates { + z-index: 888888 !important; + opacity: 0.9 !important; +} + +.fluid_video_playback_rates_item { + padding: 9px 25px 9px 25px; + line-height: 15px; + text-align: center; +} + +.fluid_theatre_mode { + position: fixed; + float: left; + top: 0; + z-index: 10; + box-shadow: 0px 15px 25px rgba(0, 0, 0, 0.8); +} + +.fluid_mini_player_mode { + position: fixed; + bottom: 10px; + right: 10px; + z-index: 10; +} + +.source_button_icon { + background: url('../static/fluid-icons.svg') no-repeat; + float: left; + cursor: pointer; + height: 18px; + width: 18px; + background-position: -164px -21px; + opacity: 0; +} + +.subtitle_button_icon { + background: url('../static/fluid-icons.svg') no-repeat; + float: left; + cursor: pointer; + height: 18px; + width: 18px; + background-position: -164px -21px; + opacity: 0; +} + +.source_selected { + opacity: 1 !important; +} + +.subtitle_selected { + opacity: 1 !important; +} + +@media only screen and (min-device-width: 375px) { + .fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_duration { + padding-left: 95px; + } + + .fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_duration.no_volume_bar { + padding-left: 32px; + } + + .fluid_video_wrapper.fluid_player_layout_default .fluid_controls_container .fluid_controls_right .fluid_control_volume_container { + display: block; + } +} + +.fp_logo { + visibility: hidden; + opacity: 0; + -webkit-transition: visibility 0.3s ease-in-out, opacity 0.3s ease-in-out; + -moz-transition: visibility 0.3s ease-in-out, opacity 0.3s ease-in-out; + -ms-transition: visibility 0.3s ease-in-out, opacity 0.3s ease-in-out; + -o-transition: visibility 0.3s ease-in-out, opacity 0.3s ease-in-out; + transition: visibility 0.3s ease-in-out, opacity 0.3s ease-in-out; +} + +.fp_hd_source::before { + font-weight: bolder; + font-size: 6pt; + content: 'HD'; + padding-left: 3px; +} + +/** MiniPlayer */ + +.fluid_video_wrapper.fluid_player_layout_default .mini-player-close-button-wrapper { + display: none; +} + +.fluid_video_wrapper.fluid_mini_player_mode .mini-player-close-button-wrapper { + position: absolute; + background: rgb(0,0,0); + background: linear-gradient(45deg, rgba(0,0,0,0) 90%, rgba(0,0,0,0.6) 110%); + height: 100%; + width: 100%; + top: 0; + right: 0; + z-index: 31; + display: block; + opacity: 0; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; + pointer-events: none; +} + +.fluid_video_wrapper.fluid_mini_player_mode .mini-player-close-button { + position: absolute; + background: transparent url("../static/close-icon.svg") no-repeat scroll center center; + height: 22px; + width: 22px; + top: 6px; + right: 6px; + background-size: 22px; + cursor: pointer; + z-index: 32; + display: block; + pointer-events: all; +} + +.fluid_video_wrapper.fluid_mini_player_mode:hover .mini-player-close-button-wrapper { + opacity: 1; +} + +.fluid_video_wrapper.fluid_mini_player_mode .disable-mini-player-mobile { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.fluidplayer-miniplayer-player-placeholder { + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: 1.5rem; + font-family: -apple-system, BlinkMacSystemFont, 'segoe ui', roboto, oxygen-sans, ubuntu, cantarell, 'helvetica neue', 'arial', sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; + background: #000 url('../static/miniplayer-toggle-on.svg') no-repeat 50% calc(50% - 48px); + background-size: 48px; + cursor: pointer; +} + +.fluid_video_wrapper.fluid_mini_player_mode.fluid_video_wrapper.fluid_mini_player_mode--top-left { + top: 10px; + left: 10px; +} + +.fluid_video_wrapper.fluid_mini_player_mode.fluid_video_wrapper.fluid_mini_player_mode--top-right { + top: 10px; + right: 10px; +} + +.fluid_video_wrapper.fluid_mini_player_mode.fluid_video_wrapper.fluid_mini_player_mode--bottom-left { + bottom: 10px; + left: 10px; +} + +.fluid_video_wrapper.fluid_mini_player_mode.fluid_video_wrapper.fluid_mini_player_mode--bottom-right { + bottom: 10px; + right: 10px; +} + +@media screen and (max-width: 768px) { + .fluid_video_wrapper.fluid_mini_player_mode > *:not(video, .ad_countdown, .fluid_nonLinear_ad, .disable-mini-player-mobile) { + display: none; + } + + .fluid_video_wrapper.fluid_mini_player_mode .fluid_nonLinear_ad { + z-index: 100; + } + + .fluid_video_wrapper.fluid_mini_player_mode .fluid_nonLinear_bottom { + bottom: 16px; + } + + .fluid_video_wrapper.fluid_mini_player_mode .fluid_nonLinear_top { + top: 16px; + } + + .fluid_video_wrapper.fluid_mini_player_mode .ad_countdown { + display: inline-block !important; + } + + .fluid_video_wrapper.fluid_mini_player_mode .disable-mini-player-mobile { + display: block; + touch-action: none; + } + + .fluidplayer-miniplayer-player-placeholder { + font-size: 1.25rem !important; + background-size: 32px !important; + background-position-y: calc(50% - 32px) !important; + } +} + +.fluid_video_wrapper .fluid_player_skip_offset { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + display: grid; + grid-template-columns: 1fr 1fr; + pointer-events: none; +} + +.fluid_video_wrapper .fluid_player_skip_offset__backward { + display: flex; + align-items: center; + margin: 10% 10% 10% 0; +} + +.fluid_video_wrapper .fluid_player_skip_offset__backward-icon { + background: rgba(0, 0, 0, .5) url('../static/skip-backward.svg') no-repeat -2px 3px; + width: 150px; + height: 150px; + background-size: contain; + opacity: 0; + transition: opacity 400ms ease-in; + border-radius: 150px; + margin-left: 20%; + pointer-events: none; + background-origin: content-box; + padding: 10px; +} + +.fluid_video_wrapper .fluid_player_skip_offset__forward { + display: flex; + align-items: center; + flex-direction: row-reverse; + margin: 10% 0 10% 10%; +} + +.fluid_video_wrapper .fluid_player_skip_offset__forward-icon { + background: rgba(0, 0, 0, .5) url('../static/skip-forward.svg') no-repeat -2px 3px; + width: 150px; + height: 150px; + background-size: cover; + opacity: 0; + transition: opacity 400ms ease-in; + border-radius: 150px; + margin-right: 20%; + pointer-events: none; + background-origin: content-box; + padding: 10px; +} + +.fluid_video_wrapper .fluid_player_skip_offset__backward-icon.animate, +.fluid_video_wrapper .fluid_player_skip_offset__forward-icon.animate { + opacity: 1; + transition: opacity 150ms ease-out; +} + +@media screen and (max-width: 768px) { + .fluid_video_wrapper .fluid_player_skip_offset__backward-icon, + .fluid_video_wrapper .fluid_player_skip_offset__forward-icon { + width: 50px; + height: 50px; + border-radius: 50px; + background-position-x: 0; + background-position-y: 0; + padding: 5px; + } +} diff --git a/client/fluid-player/src/css/suggestedVideos.css b/client/fluid-player/src/css/suggestedVideos.css new file mode 100644 index 0000000..18c1126 --- /dev/null +++ b/client/fluid-player/src/css/suggestedVideos.css @@ -0,0 +1,143 @@ +.suggested_tile_grid { + --thumbnail-height: 120px; + } + +.suggested_tile_grid { + position: absolute; + left: 0; + width: 100%; + z-index: 100; + display: flex; + height: var(--thumbnail-height); + overflow-x: auto; + overflow-y: hidden; + justify-content: flex-start; + bottom: 53px; + top: initial; + column-gap: 10px; + row-gap: 10px; + white-space: nowrap; +} + +.suggested_tile { + aspect-ratio: 16/9; + display: flex; + justify-content: center; + align-items: center; + position: relative; + border-radius: 2px; + flex-shrink: 0; + width: calc(var(--thumbnail-height) * (16/9)); + height: var(--thumbnail-height); + + img { + height: -webkit-fill-available; + } +} + +.suggested_tile_image { + max-width: 100%; + max-height: 100%; +} + +.suggested_tile:first-child { + margin-left: 20px; +} + +.suggested_tile:last-child { + margin-right: 20px; +} + +.suggested_tile_overlay { + position: absolute; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.6); + color: #ffffff; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity 0.25s; +} + +.suggested_tile_overlay .suggested_tile_title { + position: absolute; + bottom: 0px; + left: 10px; +} + +.suggested_tile_overlay--blur { + backdrop-filter: blur(5px); +} + +.suggested_tile_overlay>* { + transform: translateY(20px); + transition: transform 0.25s; +} + +.suggested_tile_overlay:hover { + opacity: 1; +} + +.suggested_tile_overlay:hover>* { + transform: translateY(0); +} + +.suggested_tile:hover { + cursor: pointer; +} + +@media only screen and (max-width: 600px) and (orientation: portrait) { + .suggested_tile_grid { + display: none; + } +} + +/* Medium devices like tablet portrait */ +@media only screen and (min-width: 992px) { + .suggested_tile_grid { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: calc(100% - 53px); + display: grid; + grid-template-columns: repeat(3, 20%); + grid-template-rows: min-content min-content; + column-gap: 40px; + row-gap: 10px; + z-index: 100; + align-content: center; + justify-content: center; + } + + /* hide the last 6 video tiles */ + .suggested_tile:nth-child(n+7) { + display: none; + } + + .suggested_tile:first-child { + margin-left: 0px; + } + + .suggested_tile:last-child { + margin-right: 0px; + } +} + +/* Desktop */ +@media only screen and (min-width: 1200px) { + .suggested_tile_grid { + grid-template-columns: repeat(4, 20%); + column-gap: 10px; + } + .suggested_tile { + width: initial; + height: initial; + } + .suggested_tile:nth-child(n+7) { + display: flex; + } +} diff --git a/client/fluid-player/src/fluidplayer.js b/client/fluid-player/src/fluidplayer.js new file mode 100644 index 0000000..2b334f8 --- /dev/null +++ b/client/fluid-player/src/fluidplayer.js @@ -0,0 +1,3469 @@ +// @ts-check +'use strict'; + +// Player modules +import VPAIDModule from './modules/vpaid'; +import VASTModule from './modules/vast'; +import CardboardModule from './modules/cardboard'; +import SubtitleModule from './modules/subtitles'; +import TimelineModule from './modules/timeline'; +import AdSupportModule from './modules/adsupport'; +import StreamingModule from './modules/streaming'; +import UtilsModule from './modules/utils'; +import SuggestedVideosModule from './modules/suggestedVideos'; +import MiniPlayerModule from './modules/miniplayer'; + +const FP_MODULES = [ + VPAIDModule, + VASTModule, + CardboardModule, + SubtitleModule, + TimelineModule, + AdSupportModule, + StreamingModule, + UtilsModule, + SuggestedVideosModule, + MiniPlayerModule +]; + +// Determine build mode +// noinspection JSUnresolvedVariable +const FP_DEVELOPMENT_MODE = typeof FP_ENV !== 'undefined' && FP_ENV === 'development'; + +// Are we running in debug mode? +// noinspection JSUnresolvedVariable +const FP_RUNTIME_DEBUG = typeof FP_DEBUG !== 'undefined' && FP_DEBUG === true; + +let playerInstances = 0; + +/** + * @this {import("./types").IFluidPlayer} + */ +const fluidPlayerClass = function () { + // "self" always points to current instance of the player within the scope of the instance + // This should help readability and context awareness slightly... + const self = this; + + self.domRef = { + player: null + }; + + // noinspection JSUnresolvedVariable + self.version = typeof FP_BUILD_VERSION !== 'undefined' ? FP_BUILD_VERSION : ''; + // noinspection JSUnresolvedVariable + self.homepage = typeof FP_HOMEPAGE !== 'undefined' + ? FP_HOMEPAGE + '/?utm_source=player&utm_medium=context_menu&utm_campaign=organic' + : ''; + self.destructors = []; + + self.init = (playerTarget, options) => { + // Install player modules and features + const moduleOptions = { + development: FP_DEVELOPMENT_MODE, + debug: FP_RUNTIME_DEBUG, + }; + + for (const playerModule of FP_MODULES) { + playerModule(self, moduleOptions); + } + /** + * @type {HTMLVideoElement} + */ + let playerNode; + if (playerTarget instanceof HTMLVideoElement) { + playerNode = playerTarget; + + // Automatically assign ID if none exists + if (!playerTarget.id) { + playerTarget.id = 'fluid_player_instance_' + (playerInstances++).toString(); + } + } else if (typeof playerTarget === 'string' || playerTarget instanceof String) { + // @ts-expect-error + playerNode = document.getElementById(playerTarget); + } else { + throw 'Invalid initializer - player target must be HTMLVideoElement or ID'; + } + + if (!playerNode) { + throw 'Could not find a HTML node to attach to for target ' + playerTarget + '"'; + } + + if (playerNode.classList.contains('js-fluid-player')) { + throw 'Invalid initializer - player target already is initialized'; + } + + playerNode.setAttribute('playsinline', ''); + playerNode.setAttribute('webkit-playsinline', ''); + playerNode.classList.add('js-fluid-player'); + + self.domRef.player = playerNode; + self.vrROTATION_POSITION = 0.1; + self.vrROTATION_SPEED = 80; + self.vrMode = false; + self.vrPanorama = null; + self.vrViewer = null; + self.vpaidTimer = null; + self.vpaidAdUnit = null; + self.vastOptions = null; + /** + * Don't use this as a way to change the DOM. DOM manipulation should be done with domRef. + */ + self.videoPlayerId = playerNode.id; + self.originalSrc = self.getCurrentSrc(); + self.isCurrentlyPlayingAd = false; + self.recentWaiting = false; + self.latestVolume = 1; + self.currentVideoDuration = 0; + self.firstPlayLaunched = false; + self.suppressClickthrough = false; + self.timelinePreviewData = []; + self.mainVideoCurrentTime = 0; + self.mainVideoDuration = 0; + self.isTimer = false; + self.timer = null; + self.timerPool = {}; + self.rollsById = {}; + self.adPool = {}; + self.adGroupedByRolls = {}; + self.onPauseRollAdPods = []; + self.currentOnPauseRollAd = ''; + self.preRollAdsResolved = false; + self.preRollAdPods = []; + self.preRollAdPodsLength = 0; + self.preRollVastResolved = 0; + self.temporaryAdPods = []; + self.availableRolls = ['preRoll', 'midRoll', 'postRoll', 'onPauseRoll']; + self.supportedNonLinearAd = ['300x250', '468x60', '728x90']; + self.autoplayAfterAd = true; + self.nonLinearDuration = 15; + self.supportedStaticTypes = ['image/gif', 'image/jpeg', 'image/png']; + self.inactivityTimeout = null; + self.isUserActive = null; + self.nonLinearVerticalAlign = 'bottom'; + self.vpaidNonLinearCloseButton = true; + self.showTimeOnHover = true; + self.initialAnimationSet = true; + self.theatreMode = false; + self.theatreModeAdvanced = false; + self.fullscreenMode = false; + self.originalWidth = playerNode.offsetWidth; + self.originalHeight = playerNode.offsetHeight; + self.dashPlayer = false; + self.hlsPlayer = false; + self.dashScriptLoaded = false; + self.hlsScriptLoaded = false; + self.isPlayingMedia = false; + self.isSwitchingSource = false; + self.isLoading = false; + self.isInIframe = self.inIframe(); + self.mainVideoReadyState = false; + self.xmlCollection = []; + self.inLineFound = null; + self.fluidStorage = {}; + self.fluidPseudoPause = false; + self.mobileInfo = self.getMobileOs(); + self.events = {}; + self.timeSkipOffsetAmount = 10; + // Only for linear ads, non linear are not taken into account + self.currentMediaSourceType = 'source'; + + //Default options + self.displayOptions = { + layoutControls: { + mediaType: self.getCurrentSrcType(), + primaryColor: false, + posterImage: false, + posterImageSize: 'contain', + adProgressColor: '#f9d300', + playButtonShowing: true, + playPauseAnimation: true, + closeButtonCaption: 'Close', // Remove? + fillToContainer: false, + autoPlay: false, + preload: 'auto', + mute: false, + loop: null, + keyboardControl: true, + allowDownload: false, + playbackRateEnabled: false, + subtitlesEnabled: false, + subtitlesOnByDefault: true, + showCardBoardView: false, + showCardBoardJoystick: false, + allowTheatre: true, + doubleclickFullscreen: true, + autoRotateFullScreen: false, + theatreSettings: { + width: '100%', + height: '60%', + marginTop: 0, + horizontalAlign: 'center', + keepPosition: false + }, + theatreAdvanced: { + theatreElement: null, + }, + title: null, + logo: { + imageUrl: null, + position: 'top left', + clickUrl: null, + opacity: 1, + mouseOverImageUrl: null, + imageMargin: '2px', + hideWithControls: false, + showOverAds: false + }, + controlBar: { + autoHide: false, + autoHideTimeout: 3, + animated: true, + playbackRates: ['x2', 'x1.5', 'x1', 'x0.5'] + }, + timelinePreview: { + spriteImage: false, + spriteRelativePath: false + }, + htmlOnPauseBlock: { + html: null, + height: null, + width: null + }, + layout: 'default', //options: 'default', '' + playerInitCallback: (function () { + }), + persistentSettings: { + volume: true, + quality: true, + speed: true, + theatre: true + }, + controlForwardBackward: { + show: false, + doubleTapMobile: true + }, + contextMenu: { + controls: true, + links: [] + }, + miniPlayer: { + enabled: true, + width: 400, + height: 225, + widthMobile: 50, + placeholderText: 'Playing in Miniplayer', + position: 'bottom right', + autoToggle: false, + }, + roundedCorners: 0 + }, + suggestedVideos: { + configUrl: null + }, + vastOptions: { + adList: {}, + skipButtonCaption: 'Skip ad in [seconds]', + skipButtonClickCaption: 'Skip Ad ', + adText: null, + adTextPosition: 'top left', + adCTAText: 'Visit now!', + adCTATextPosition: 'bottom right', + adCTATextVast: false, + adClickable: true, + vastTimeout: 5000, + showProgressbarMarkers: false, + allowVPAID: false, + showPlayButton: false, + maxAllowedVastTagRedirects: 3, + vpaidTimeout: 3000, + + vastAdvanced: { + vastLoadedCallback: (function () { + }), + noVastVideoCallback: (function () { + }), + vastVideoSkippedCallback: (function () { + }), + vastVideoEndedCallback: (function () { + }) + } + }, + hls: { + overrideNative: false + }, + captions: { + play: 'Play', + pause: 'Pause', + mute: 'Mute', + unmute: 'Unmute', + fullscreen: 'Fullscreen', + subtitles: 'Subtitles', + exitFullscreen: 'Exit Fullscreen', + }, + debug: FP_RUNTIME_DEBUG, + modules: { + configureHls: (options) => { + return options; + }, + onBeforeInitHls: (hls) => { + }, + onAfterInitHls: (hls) => { + }, + configureDash: (options) => { + return options; + }, + onBeforeInitDash: (dash) => { + }, + onAfterInitDash: (dash) => { + } + }, + onBeforeXMLHttpRequestOpen: (request) => { + }, + onBeforeXMLHttpRequest: (request) => { + if (FP_RUNTIME_DEBUG || FP_DEVELOPMENT_MODE) { + console.debug('[FP_DEBUG] Request made', request); + } + } + }; + + if (!!options.hlsjsConfig) { + console.error('[FP_ERROR] player option hlsjsConfig is removed and has no effect. ' + + 'Use module callbacks instead!') + } + + /** + * Replaces values from objects without replacing the default object + * + * @param defaults + * @param options + * @returns {object} + */ + function overrideDefaults(defaults, options) { + Object.keys(options).forEach(defaultKey => { + if ( + typeof options[defaultKey] === 'object' && + options[defaultKey] !== null && + !Array.isArray(options[defaultKey]) + ) { + overrideDefaults(defaults[defaultKey], options[defaultKey]); + } else if (typeof options[defaultKey] !== 'undefined') { + defaults[defaultKey] = options[defaultKey]; + } + }); + + return defaults; + } + + overrideDefaults(self.displayOptions, options); + + self.domRef.wrapper = self.setupPlayerWrapper(); + + playerNode.addEventListener('webkitfullscreenchange', self.recalculateAdDimensions); + playerNode.addEventListener('fullscreenchange', self.recalculateAdDimensions); + playerNode.addEventListener('waiting', self.onRecentWaiting); + playerNode.addEventListener('pause', self.onFluidPlayerPause); + playerNode.addEventListener('error', self.onErrorDetection); + playerNode.addEventListener('ended', self.onMainVideoEnded); + playerNode.addEventListener('durationchange', () => { + self.currentVideoDuration = self.getCurrentVideoDuration(); + }); + + // 'loadedmetadata' inconsistently fires because the audio can already be loaded when the listener is added. + // Here we use readystate to see if metadata has already loaded + if (playerNode.readyState > 0) { + self.mainVideoReady(); + } else { + playerNode.addEventListener('loadedmetadata', self.mainVideoReady); + } + + if (self.displayOptions.layoutControls.showCardBoardView) { + // This fixes cross origin errors on three.js + playerNode.setAttribute('crossOrigin', 'anonymous'); + } + + //Manually load the video duration if the video was loaded before adding the event listener + self.currentVideoDuration = self.getCurrentVideoDuration(); + + if (isNaN(self.currentVideoDuration) || !isFinite(self.currentVideoDuration)) { + self.currentVideoDuration = 0; + } + + self.setLayout(); + + //Set the volume control state + self.latestVolume = playerNode.volume; + + // Set the default animation setting + self.initialAnimationSet = self.displayOptions.layoutControls.playPauseAnimation; + + //Set the custom fullscreen behaviour + self.handleFullscreen(); + + self.initLogo(); + + self.initTitle(); + + self.initMute(); + + self.initLoop(); + + self.displayOptions.layoutControls.playerInitCallback(); + + self.createVideoSourceSwitch(); + + self.createSubtitles(); + + self.createCardboard(); + + self.userActivityChecker(); + + self.setVastList(); + + self.setPersistentSettings(); + + self.generateSuggestedVideoList(); + + // Previously prevented to be initialized if preRolls were set up + // but now the streamers support reinitialization + self.initialiseStreamers(); + self.detectLiveStream(); + self.showLiveIndicator(); + + const _play_videoPlayer = playerNode.play; + + playerNode.play = function () { + let promise = null; + + if (self.displayOptions.layoutControls.showCardBoardView) { + if (typeof DeviceOrientationEvent !== 'undefined' && typeof DeviceOrientationEvent.requestPermission === 'function') { + DeviceOrientationEvent.requestPermission() + .then(function (response) { + if (response === 'granted') { + self.debugMessage('DeviceOrientationEvent permission granted!'); + } + }) + .catch(console.error); + } + } + + try { + promise = _play_videoPlayer.apply(this, arguments); + + if (promise !== undefined && promise !== null) { + promise.then(() => { + self.isPlayingMedia = true; + clearTimeout(self.promiseTimeout); + }).catch(error => { + console.error('[FP_ERROR] Playback error', error); + const isAbortError = (typeof error.name !== 'undefined' && error.name === 'AbortError'); + // Ignore abort errors which caused for example Safari or autoplay functions + // (example: interrupted by a new load request) + // (example: interrupted by a new load request) + if (isAbortError) { + // Ignore AbortError error reporting + } else { + self.announceLocalError(202, 'Failed to play video.'); + } + + clearTimeout(self.promiseTimeout); + }); + + self.promiseTimeout = setTimeout(function () { + if (self.isPlayingMedia === false) { + self.announceLocalError(204, '[FP_ERROR] Timeout error. Failed to play video?'); + } + }, 5000); + + } + + return promise; + } catch (error) { + console.error('[FP_ERROR] Playback error', error); + self.announceLocalError(201, 'Failed to play video.'); + } + }; + + const videoPauseOriginal = playerNode.pause; + playerNode.pause = function () { + if (self.isPlayingMedia === true) { + self.isPlayingMedia = false; + return videoPauseOriginal.apply(this, arguments); + } + + // just in case + if (self.isCurrentlyPlayingVideo(self.domRef.player)) { + try { + self.isPlayingMedia = false; + return videoPauseOriginal.apply(this, arguments); + } catch (e) { + self.announceLocalError(203, 'Failed to play video.'); + } + } + }; + + if (!!self.displayOptions.layoutControls.autoPlay && !self.dashScriptLoaded && !self.hlsScriptLoaded) { + //There is known issue with Safari 11+, will prevent autoPlay, so we wont try + const browserVersion = self.getBrowserVersion(); + + if ('Safari' === browserVersion.browserName) { + return; + } + + playerNode.play(); + } + + if (!self.mobileInfo.userOs) { + if (!self.displayOptions.layoutControls.controlBar.autoHide) { + self.domRef.wrapper.addEventListener('mouseleave', self.handleMouseleave, false); + } + self.domRef.wrapper.addEventListener('mouseenter', self.showControlBar, false); + self.domRef.wrapper.addEventListener('mouseenter', self.showTitle, false); + } else { + //On mobile mouseleave behavior does not make sense, so it's better to keep controls, once the playback starts + //Autohide behavior on timer is a separate functionality + self.hideControlBar(); + self.domRef.wrapper.addEventListener('touchstart', self.showControlBar, { passive: true }); + } + + //Keyboard Controls + if (self.displayOptions.layoutControls.keyboardControl) { + self.keyboardControl(); + } + + if (self.displayOptions.layoutControls.controlBar.autoHide) { + self.linkControlBarUserActivity(); + } + + // Hide the captions on init if user added subtitles track. + // We are taking captions track kind of as metadata + try { + if (!!self.domRef.player.textTracks) { + for (const textTrack of self.domRef.player.textTracks) { + textTrack.mode = 'hidden'; + } + } + } catch (_ignored) { + } + }; + + self.getCurrentVideoDuration = () => { + if (self.domRef.player) { + return self.domRef.player.duration; + } + + return 0; + }; + + self.toggleLoader = (showLoader) => { + self.isLoading = !!showLoader; + + const loaderDiv = self.domRef.wrapper.querySelector('.vast_video_loading'); + + if (loaderDiv) { + loaderDiv.style.display = showLoader ? 'table' : 'none'; + } + }; + + self.sendRequest = (url, withCredentials, timeout, functionReadyStateChange) => { + const xmlHttpReq = new XMLHttpRequest(); + + xmlHttpReq.onreadystatechange = functionReadyStateChange; + + self.displayOptions.onBeforeXMLHttpRequestOpen(xmlHttpReq); + + xmlHttpReq.open('GET', url, true); + xmlHttpReq.withCredentials = withCredentials; + xmlHttpReq.timeout = timeout; + + self.displayOptions.onBeforeXMLHttpRequest(xmlHttpReq); + + xmlHttpReq.send(); + }; + + /** + * Makes a XMLHttpRequest encapsulated by a Promise + * + * @param url + * @param withCredentials + * @param timeout + * @returns {Promise} + */ + self.sendRequestAsync = async (url, withCredentials, timeout) => { + return await new Promise((resolve, reject) => { + const xmlHttpReq = new XMLHttpRequest(); + + xmlHttpReq.onreadystatechange = (event) => { + const response = event.target; + + if (response.readyState === 4 && response.status >= 200 && response.status < 300) { + resolve(response); + } else if (response.readyState === 4) { + reject(response); + } + }; + + self.displayOptions.onBeforeXMLHttpRequestOpen(xmlHttpReq); + + xmlHttpReq.open('GET', url, true); + xmlHttpReq.withCredentials = withCredentials; + xmlHttpReq.timeout = timeout; + + self.displayOptions.onBeforeXMLHttpRequest(xmlHttpReq); + + xmlHttpReq.send(); + }) + }; + + // TODO: rename + self.announceLocalError = (code, msg) => { + const parsedCode = typeof (code) !== 'undefined' ? parseInt(code) : 900; + let message = '[Error] (' + parsedCode + '): '; + message += !msg ? 'Failed to load Vast' : msg; + console.warn(message); + }; + + // TODO: move this somewhere else and refactor + self.debugMessage = (...msg) => { + const style = 'color: #fff; font-weight: bold; background-color: #1a5e87; padding: 3px 6px; border-radius: 3px;'; + + if (self.displayOptions.debug) { + console.log('%cFP DEBUG', style, ...msg); + } + }; + + self.onMainVideoEnded = (event) => { + self.debugMessage('onMainVideoEnded is called'); + + if (self.isCurrentlyPlayingAd && self.autoplayAfterAd) { // It may be in-stream ending, and if it's not postroll then we don't execute anything + return; + } + + //we can remove timer as no more ad will be shown + if (Math.floor(self.getCurrentTime()) >= Math.floor(self.mainVideoDuration)) { + + // play pre-roll ad + // sometime pre-roll ad will be missed because we are clearing the timer + self.adKeytimePlay(Math.floor(self.mainVideoDuration)); + + clearInterval(self.timer); + } + + if (!!self.displayOptions.layoutControls.loop) { + self.switchToMainVideo(); + self.playPauseToggle(); + } + + // Event listener doesn't wait on flags to be flipped from post roll ads, needs small time out to compensate + setTimeout(() => { + if (!self.isCurrentlyPlayingAd && self.displayOptions.suggestedVideos.configUrl) { + self.displaySuggestedVideos(); + } + }, 100); + }; + + self.getCurrentTime = () => { + return self.isCurrentlyPlayingAd + ? self.mainVideoCurrentTime + : self.domRef.player.currentTime; + }; + + /** + * Gets the src value of the first source element of the video tag. + * + * @returns string|null + */ + self.getCurrentSrc = () => { + const sources = self.domRef.player.getElementsByTagName('source'); + + if (sources.length) { + return sources[0].getAttribute('src'); + } + + return null; + }; + + /** + * Src types required for streaming elements + */ + self.getCurrentSrcType = () => { + const sources = self.domRef.player.getElementsByTagName('source'); + + if (!sources.length) { + return null; + } + + for (let i = 0; i < sources.length; i++) { + if (sources[i].getAttribute('src') === self.originalSrc) { + return sources[i].getAttribute('type').toLowerCase(); + } + } + + return null; + }; + + self.onRecentWaiting = () => { + self.recentWaiting = true; + + setTimeout(function () { + self.recentWaiting = false; + }, 1000); + }; + + /** + * Dispatches a custom pause event which is not present when seeking. + */ + self.onFluidPlayerPause = () => { + setTimeout(function () { + if (self.recentWaiting) { + return; + } + + const event = document.createEvent('CustomEvent'); + event.initEvent('fluidplayerpause', false, true); + self.domRef.player.dispatchEvent(event); + }, 100); + }; + + self.checkShouldDisplayVolumeBar = () => { + return 'iOS' !== self.getMobileOs().userOs; + }; + + self.generateCustomControlTags = (options) => { + /** + * @type {CustomControls} + */ + const controls = {}; + + // Loader + controls.loader = document.createElement('div'); + controls.loader.className = 'vast_video_loading'; + controls.loader.style.display = 'none'; + + // Root element + controls.root = document.createElement('div'); + controls.root.className = 'fluid_controls_container'; + + if (!options.displayVolumeBar) { + controls.root.className = controls.root.className + ' no_volume_bar'; + } + + if (options.controlForwardBackward) { + controls.root.className = controls.root.className + ' skip_controls'; + } + + // Left container + controls.leftContainer = document.createElement('div'); + controls.leftContainer.className = 'fluid_controls_left'; + controls.root.appendChild(controls.leftContainer); + + // Left container -> Play/Pause + controls.playPause = document.createElement('div'); + controls.playPause.className = 'fluid_button fluid_button_play fluid_control_playpause'; + controls.leftContainer.appendChild(controls.playPause); + + if (options.controlForwardBackward) { + // Left container -> Skip backwards + controls.skipBack = document.createElement('div'); + controls.skipBack.className = 'fluid_button fluid_button_skip_back'; + controls.leftContainer.appendChild(controls.skipBack); + + // Left container -> Skip forward + controls.skipForward = document.createElement('div'); + controls.skipForward.className = 'fluid_button fluid_button_skip_forward'; + controls.leftContainer.appendChild(controls.skipForward); + } + + // Progress container + controls.progressContainer = document.createElement('div'); + controls.progressContainer.className = 'fluid_controls_progress_container fluid_slider'; + controls.root.appendChild(controls.progressContainer); + + // Progress container -> Progress wrapper + controls.progressWrapper = document.createElement('div'); + controls.progressWrapper.className = 'fluid_controls_progress'; + controls.progressContainer.appendChild(controls.progressWrapper); + + // Progress container -> Progress wrapper -> Current progress + controls.progressCurrent = document.createElement('div'); + controls.progressCurrent.className = 'fluid_controls_currentprogress'; + controls.progressCurrent.style.backgroundColor = options.primaryColor; + controls.progressWrapper.appendChild(controls.progressCurrent); + + // Progress container -> Progress wrapper -> Current progress -> Marker + controls.progress_current_marker = document.createElement('div'); + controls.progress_current_marker.className = 'fluid_controls_currentpos'; + controls.progressCurrent.appendChild(controls.progress_current_marker); + + // Progress container -> Buffered indicator + controls.bufferedIndicator = document.createElement('div'); + controls.bufferedIndicator.className = 'fluid_controls_buffered'; + controls.progressContainer.appendChild(controls.bufferedIndicator); + + // Progress container -> Ad markers + controls.adMarkers = document.createElement('div'); + controls.adMarkers.className = 'fluid_controls_ad_markers_holder'; + controls.progressContainer.appendChild(controls.adMarkers); + + // Right container + controls.rightContainer = document.createElement('div'); + controls.rightContainer.className = 'fluid_controls_right'; + controls.root.appendChild(controls.rightContainer); + + // Right container -> Fullscreen + controls.fullscreen = document.createElement('div'); + controls.fullscreen.className = 'fluid_button fluid_control_fullscreen fluid_button_fullscreen'; + controls.rightContainer.appendChild(controls.fullscreen); + + if (options.miniPlayer.enabled) { + // Right container -> MiniPlayer + controls.miniPlayer = document.createElement('div'); + controls.miniPlayer.className = 'fluid_button fluid_control_mini_player fluid_button_mini_player'; + controls.rightContainer.appendChild(controls.miniPlayer); + } + + // Right container -> Theatre + controls.theatre = document.createElement('div'); + controls.theatre.className = 'fluid_button fluid_control_theatre fluid_button_theatre'; + controls.rightContainer.appendChild(controls.theatre); + + // Right container -> Cardboard + controls.cardboard = document.createElement('div'); + controls.cardboard.className = 'fluid_button fluid_control_cardboard fluid_button_cardboard'; + controls.rightContainer.appendChild(controls.cardboard); + + // Right container -> Subtitles + controls.subtitles = document.createElement('div'); + controls.subtitles.className = 'fluid_button fluid_control_subtitles fluid_button_subtitles'; + controls.rightContainer.appendChild(controls.subtitles); + + // Right container -> Video source + controls.videoSource = document.createElement('div'); + controls.videoSource.className = 'fluid_button fluid_control_video_source fluid_button_video_source'; + controls.rightContainer.appendChild(controls.videoSource); + + // Right container -> Playback rate + controls.playbackRate = document.createElement('div'); + controls.playbackRate.className = 'fluid_button fluid_control_playback_rate fluid_button_playback_rate'; + controls.rightContainer.appendChild(controls.playbackRate); + + // Right container -> Download + controls.download = document.createElement('div'); + controls.download.className = 'fluid_button fluid_control_download fluid_button_download'; + controls.rightContainer.appendChild(controls.download); + + // Right container -> Volume container + controls.volumeContainer = document.createElement('div'); + controls.volumeContainer.className = 'fluid_control_volume_container fluid_slider'; + controls.rightContainer.appendChild(controls.volumeContainer); + + // Right container -> Volume container -> Volume + controls.volume = document.createElement('div'); + controls.volume.className = 'fluid_control_volume'; + controls.volumeContainer.appendChild(controls.volume); + + // Right container -> Volume container -> Volume -> Current + controls.volumeCurrent = document.createElement('div'); + controls.volumeCurrent.className = 'fluid_control_currentvolume'; + controls.volume.appendChild(controls.volumeCurrent); + + // Right container -> Volume container -> Volume -> Current -> position + controls.volumeCurrentPos = document.createElement('div'); + controls.volumeCurrentPos.className = 'fluid_control_volume_currentpos'; + controls.volumeCurrent.appendChild(controls.volumeCurrentPos); + + // Right container -> Volume container + controls.mute = document.createElement('div'); + controls.mute.className = 'fluid_button fluid_button_volume fluid_control_mute'; + controls.rightContainer.appendChild(controls.mute); + + // Right container -> Volume Control + Live Steam Button + const durationContainer = document.createElement('div'); + durationContainer.className = 'fluid_control_duration'; + + controls.duration = document.createElement('div'); + controls.duration.className = 'fluid_fluid_control_duration'; + controls.duration.innerText = '00:00 / 00:00'; + + if (!options.displayVolumeBar) { + durationContainer.className = durationContainer.className + ' no_volume_bar'; + } + + controls.live_indicator = document.createElement('div'); + controls.live_indicator.className = 'fluid_control_live_indicator'; + durationContainer.append(controls.live_indicator, controls.duration); + controls.rightContainer.appendChild(durationContainer); + + return controls; + }; + + self.detectLiveStream = () => { + const sourceElement = this.domRef.player.querySelector('source'); + const sourceUrl = sourceElement?.src || ''; + const isLiveAttribute = sourceElement?.getAttribute('data-live') === 'true'; + const isHLSorDASH = sourceUrl.includes('.m3u8') || sourceUrl.includes('.mpd'); + this.isLiveStream = isLiveAttribute || isHLSorDASH; + }; + + self.showLiveIndicator = () => { + const isLiveStream = this.isLiveStream || false; + if (isLiveStream) { + const liveIndicator = self.domRef.player.parentNode.getElementsByClassName('fluid_control_live_indicator'); + const liveIndicatorButton = document.createElement('span'); + liveIndicatorButton.className = 'fluid_button_live_indicator'; + liveIndicatorButton.innerHTML = `LIVE`; + + liveIndicatorButton.addEventListener('click', () => { + self.domRef.player.currentTime = self.currentVideoDuration; + }); + + for (let i = 0; i < liveIndicator.length; i++) { + liveIndicator[i].appendChild(liveIndicatorButton); + } + + } + }; + + self.controlPlayPauseToggle = () => { + const playPauseButton = self.domRef.player.parentNode.getElementsByClassName('fluid_control_playpause'); + const menuOptionPlay = self.domRef.wrapper.querySelector('.context_option_play'); + const controlsDisplay = self.domRef.player.parentNode.getElementsByClassName('fluid_controls_container'); + const fpLogo = self.domRef.wrapper.querySelector('.logo_holder'); + + const initialPlay = self.domRef.wrapper.querySelector('.fluid_initial_play'); + if (initialPlay) { + self.domRef.wrapper.querySelector('.fluid_initial_play').style.display = "none"; + self.domRef.wrapper.querySelector('.fluid_initial_play_button_container').style.opacity = "1"; + } + + if (!self.domRef.player.paused) { + for (let i = 0; i < playPauseButton.length; i++) { + playPauseButton[i].className = playPauseButton[i].className.replace(/\bfluid_button_play\b/g, 'fluid_button_pause'); + } + + for (let i = 0; i < controlsDisplay.length; i++) { + controlsDisplay[i].classList.remove('initial_controls_show'); + } + + if (fpLogo) { + fpLogo.classList.remove('initial_controls_show'); + } + + if (menuOptionPlay !== null) { + menuOptionPlay.innerHTML = self.displayOptions.captions.pause; + } + + return; + } + + for (let i = 0; i < playPauseButton.length; i++) { + playPauseButton[i].className = playPauseButton[i].className.replace(/\bfluid_button_pause\b/g, 'fluid_button_play'); + } + + for (let i = 0; i < controlsDisplay.length; i++) { + controlsDisplay[i].classList.add('initial_controls_show'); + } + + if (self.isCurrentlyPlayingAd && self.displayOptions.vastOptions.showPlayButton) { + self.domRef.wrapper.querySelector('.fluid_initial_play').style.display = "block"; + self.domRef.wrapper.querySelector('.fluid_initial_play_button_container').style.opacity = "1"; + } + + if (fpLogo) { + fpLogo.classList.add('initial_controls_show'); + } + + if (menuOptionPlay !== null) { + menuOptionPlay.innerHTML = self.displayOptions.captions.play; + } + }; + + self.playPauseAnimationToggle = (play) => { + if (self.isCurrentlyPlayingAd || !self.displayOptions.layoutControls.playPauseAnimation || self.isSwitchingSource) { + return; + } + + const playButtonElement = self.domRef.wrapper.querySelector('.fluid_initial_play_button, .fluid_initial_pause_button'); + + if (play) { + playButtonElement.classList.remove('fluid_initial_pause_button'); + playButtonElement.classList.add('fluid_initial_play_button'); + } else { + playButtonElement.classList.remove('fluid_initial_play_button'); + playButtonElement.classList.add('fluid_initial_pause_button'); + } + + self.domRef.wrapper.querySelector('.fluid_initial_play').classList.add('transform-active'); + setTimeout( + function () { + self.domRef.wrapper.querySelector('.fluid_initial_play').classList.remove('transform-active'); + }, + 800 + ); + }; + + self.contolProgressbarUpdate = () => { + const currentProgressTag = self.domRef.player.parentNode.getElementsByClassName('fluid_controls_currentprogress'); + + for (let i = 0; i < currentProgressTag.length; i++) { + currentProgressTag[i].style.width = (self.domRef.player.currentTime / self.currentVideoDuration * 100) + '%'; + } + }; + + self.controlDurationUpdate = () => { + const currentPlayTime = self.formatTime(self.domRef.player.currentTime); + + let isLiveHls = false; + if (self.hlsPlayer) { + isLiveHls = self.hlsPlayer.levels && + self.hlsPlayer.levels[self.hlsPlayer.currentLevel] && + self.hlsPlayer.levels[self.hlsPlayer.currentLevel].details.live; + } + + let durationText; + if (isNaN(self.currentVideoDuration) || !isFinite(self.currentVideoDuration) || isLiveHls) { + durationText = currentPlayTime; + } else { + const totalTime = self.formatTime(self.currentVideoDuration); + durationText = currentPlayTime + ' / ' + totalTime; + } + + const timePlaceholder = self.domRef.player.parentNode.getElementsByClassName('fluid_control_duration'); + + self.detectLiveStream(); + + for (let i = 0; i < timePlaceholder.length; i++) { + timePlaceholder[i].innerHTML = ''; + + if (this.isLiveStream) { + const liveIndicatorButton = document.createElement('span'); + liveIndicatorButton.className = 'fluid_button_live_indicator'; + liveIndicatorButton.innerHTML = `LIVE`; + liveIndicatorButton.addEventListener('pointerdown', () => { + self.domRef.player.currentTime = self.currentVideoDuration; + }); + timePlaceholder[i].appendChild(liveIndicatorButton); + } + + const durationTextElement = document.createElement('span'); + durationTextElement.className = 'fluid_fluid_control_duration'; + durationTextElement.innerText = durationText; + timePlaceholder[i].appendChild(durationTextElement); + } + }; + + self.contolVolumebarUpdate = () => { + const currentVolumeTag = self.domRef.wrapper.querySelector('.fluid_control_currentvolume'); + const volumeposTag = self.domRef.wrapper.querySelector('.fluid_control_volume_currentpos'); + const volumebarTotalWidth = self.domRef.wrapper.querySelector('.fluid_control_volume').clientWidth; + const volumeposTagWidth = volumeposTag.clientWidth; + const muteButtonTag = self.domRef.player.parentNode.getElementsByClassName('fluid_control_mute'); + const menuOptionMute = self.domRef.wrapper.querySelector('.context_option_mute'); + + if (0 !== self.domRef.player.volume) { + self.latestVolume = self.domRef.player.volume; + self.fluidStorage.fluidMute = false; + } else { + self.fluidStorage.fluidMute = true; + } + + if (self.domRef.player.volume && !self.domRef.player.muted) { + for (let i = 0; i < muteButtonTag.length; i++) { + muteButtonTag[i].className = muteButtonTag[i].className.replace(/\bfluid_button_mute\b/g, 'fluid_button_volume'); + } + + if (menuOptionMute !== null) { + menuOptionMute.innerHTML = self.displayOptions.captions.mute; + } + + } else { + for (let i = 0; i < muteButtonTag.length; i++) { + muteButtonTag[i].className = muteButtonTag[i].className.replace(/\bfluid_button_volume\b/g, 'fluid_button_mute'); + } + + if (menuOptionMute !== null) { + menuOptionMute.innerHTML = self.displayOptions.captions.unmute; + } + } + currentVolumeTag.style.width = (self.domRef.player.volume * volumebarTotalWidth) + 'px'; + volumeposTag.style.left = (self.domRef.player.volume * volumebarTotalWidth - (volumeposTagWidth / 2)) + 'px'; + }; + + self.muteToggle = () => { + if (0 !== self.domRef.player.volume && !self.domRef.player.muted) { + self.domRef.player.volume = 0; + self.domRef.player.muted = true; + } else { + self.domRef.player.volume = self.latestVolume; + self.domRef.player.muted = false; + } + + // Persistent settings + self.fluidStorage.fluidVolume = self.latestVolume; + self.fluidStorage.fluidMute = self.domRef.player.muted; + }; + + self.checkFullscreenSupport = () => { + const videoPlayerWrapper = self.domRef.wrapper; + + if (videoPlayerWrapper.mozRequestFullScreen) { + return { + goFullscreen: 'mozRequestFullScreen', + exitFullscreen: 'mozCancelFullScreen', + isFullscreen: 'mozFullScreenElement' + }; + + } else if (videoPlayerWrapper.webkitRequestFullscreen) { + return { + goFullscreen: 'webkitRequestFullscreen', + exitFullscreen: 'webkitExitFullscreen', + isFullscreen: 'webkitFullscreenElement' + }; + + } else if (videoPlayerWrapper.msRequestFullscreen) { + return { + goFullscreen: 'msRequestFullscreen', + exitFullscreen: 'msExitFullscreen', + isFullscreen: 'msFullscreenElement' + }; + + } else if (videoPlayerWrapper.requestFullscreen) { + return { + goFullscreen: 'requestFullscreen', + exitFullscreen: 'exitFullscreen', + isFullscreen: 'fullscreenElement' + }; + + } else if (self.domRef.player.webkitSupportsFullscreen) { + return { + goFullscreen: 'webkitEnterFullscreen', + exitFullscreen: 'webkitExitFullscreen', + isFullscreen: 'webkitDisplayingFullscreen' + }; + } + + return false; + }; + + self.fullscreenOff = (fullscreenButton, menuOptionFullscreen) => { + for (let i = 0; i < fullscreenButton.length; i++) { + fullscreenButton[i].className = fullscreenButton[i].className.replace(/\bfluid_button_fullscreen_exit\b/g, 'fluid_button_fullscreen'); + } + if (menuOptionFullscreen !== null) { + menuOptionFullscreen.innerHTML = 'Fullscreen'; + } + self.fullscreenMode = false; + }; + + self.fullscreenOn = (fullscreenButton, menuOptionFullscreen) => { + for (let i = 0; i < fullscreenButton.length; i++) { + fullscreenButton[i].className = fullscreenButton[i].className.replace(/\bfluid_button_fullscreen\b/g, 'fluid_button_fullscreen_exit'); + } + + if (menuOptionFullscreen !== null) { + menuOptionFullscreen.innerHTML = self.displayOptions.captions.exitFullscreen; + } + self.fullscreenMode = true; + }; + + self.fullscreenToggle = () => { + self.debugMessage(`Toggling Full Screen`); + const videoPlayerTag = self.domRef.player; + const fullscreenTag = self.domRef.wrapper; + const requestFullscreenFunctionNames = self.checkFullscreenSupport(); + const fullscreenButton = videoPlayerTag.parentNode.getElementsByClassName('fluid_control_fullscreen'); + const menuOptionFullscreen = fullscreenTag.querySelector('.context_option_fullscreen'); + self.resetDisplayMode('fullScreen'); + + let functionNameToExecute; + + if (requestFullscreenFunctionNames) { + // iOS fullscreen elements are different and so need to be treated separately + if (requestFullscreenFunctionNames.goFullscreen === 'webkitEnterFullscreen') { + if (!videoPlayerTag[requestFullscreenFunctionNames.isFullscreen]) { + functionNameToExecute = 'videoPlayerTag.' + requestFullscreenFunctionNames.goFullscreen + '();'; + self.fullscreenOn(fullscreenButton, menuOptionFullscreen); + new Function('videoPlayerTag', functionNameToExecute)(videoPlayerTag); + } + } else { + if (document[requestFullscreenFunctionNames.isFullscreen] === null) { + //Go fullscreen + functionNameToExecute = 'videoPlayerTag.' + requestFullscreenFunctionNames.goFullscreen + '();'; + self.fullscreenOn(fullscreenButton, menuOptionFullscreen); + } else { + //Exit fullscreen + functionNameToExecute = 'document.' + requestFullscreenFunctionNames.exitFullscreen + '();'; + self.fullscreenOff(fullscreenButton, menuOptionFullscreen); + } + new Function('videoPlayerTag', functionNameToExecute)(fullscreenTag); + } + } else { + //The browser does not support the Fullscreen API, so a pseudo-fullscreen implementation is used + if (fullscreenTag.className.search(/\bpseudo_fullscreen\b/g) !== -1) { + fullscreenTag.className = fullscreenTag.className.replace(/\bpseudo_fullscreen\b/g, ''); + self.fullscreenOff(fullscreenButton, menuOptionFullscreen); + } else { + fullscreenTag.className += ' pseudo_fullscreen'; + self.fullscreenOn(fullscreenButton, menuOptionFullscreen); + } + } + + self.resizeVpaidAuto(); + + // Listen for fullscreen exit event on safari, as the fullscreen mode uses the native UI in iOS + self.domRef.player.addEventListener('webkitendfullscreen', () => { + self.fullscreenOff(fullscreenButton, menuOptionFullscreen); + }); + }; + + self.findClosestParent = (el, selector) => { + let matchesFn = null; + + // find vendor prefix + ['matches', 'webkitMatchesSelector', 'mozMatchesSelector', 'msMatchesSelector', 'oMatchesSelector'].some(function (fn) { + if (typeof document.body[fn] == 'function') { + matchesFn = fn; + return true; + } + return false; + }); + + let parent; + + // Check if the current element matches the selector + if (el[matchesFn](selector)) { + return el; + } + + // traverse parents + while (el) { + parent = el.parentElement; + if (parent && parent[matchesFn](selector)) { + return parent; + } + el = parent; + } + + return null; + }; + + self.getTranslateX = (el) => { + let coordinates = null; + + try { + const results = el.style.transform.match(/translate3d\((-?\d+px,\s?){2}-?\d+px\)/); + + if (results && results.length) { + coordinates = results[0] + .replace('translate3d(', '') + .replace(')', '') + .replace(/\s/g, '') + .replace(/px/g, '') + .split(',') + ; + } + } catch (e) { + coordinates = null; + } + + return (coordinates && (coordinates.length === 3)) ? parseInt(coordinates[0]) : 0; + }; + + self.getEventOffsetX = (evt, el) => { + let x = 0; + let translateX = 0; + + while (el && !isNaN(el.offsetLeft)) { + translateX = self.getTranslateX(el); + + if (el.tagName === 'BODY') { + x += el.offsetLeft + el.clientLeft + translateX - (el.scrollLeft || document.documentElement.scrollLeft); + } else { + x += el.offsetLeft + el.clientLeft + translateX - el.scrollLeft; + } + + el = el.offsetParent; + } + + let eventX; + if (typeof evt.touches !== 'undefined' && typeof evt.touches[0] !== 'undefined') { + eventX = evt.touches[0].clientX; + } else { + eventX = evt.clientX + } + + return eventX - x; + }; + + self.getEventOffsetY = (evt, el) => { + let fullscreenMultiplier = 1; + + const requestFullscreenFunctionNames = self.checkFullscreenSupport(); + if (requestFullscreenFunctionNames && document[requestFullscreenFunctionNames.isFullscreen]) { + fullscreenMultiplier = 0; + } + + let y = 0; + + while (el && !isNaN(el.offsetTop)) { + if (el.tagName === 'BODY') { + y += el.offsetTop - ((el.scrollTop || document.documentElement.scrollTop) * fullscreenMultiplier); + + } else { + y += el.offsetTop - (el.scrollTop * fullscreenMultiplier); + } + + el = el.offsetParent; + } + + return evt.clientY - y; + }; + + self.onProgressbarMouseDown = (event) => { + self.displayOptions.layoutControls.playPauseAnimation = false; + // we need an initial position for touchstart events, as mouse up has no offset x for iOS + let initialPosition; + + if (self.displayOptions.layoutControls.showCardBoardView) { + initialPosition = self.getEventOffsetX(event, event.target.parentNode); + } else { + initialPosition = self.getEventOffsetX(event, self.domRef.wrapper.querySelector('.fluid_controls_progress_container')); + } + + if (self.isCurrentlyPlayingAd) { + return; + } + + self.fluidPseudoPause = true; + + const initiallyPaused = self.domRef.player.paused; + if (!initiallyPaused) { + self.domRef.player.pause(); + } + + const shiftTime = timeBarX => { + const totalWidth = self.domRef.wrapper.querySelector('.fluid_controls_progress_container').clientWidth; + if (totalWidth) { + self.domRef.player.currentTime = self.currentVideoDuration * timeBarX / totalWidth; + } + + self.hideSuggestedVideos(); + }; + + const onProgressbarMouseMove = event => { + const currentX = self.getEventOffsetX(event, event.target.parentNode); + initialPosition = NaN; // mouse up will fire after the move, we don't want to trigger the initial position in the event of iOS + shiftTime(currentX); + self.contolProgressbarUpdate(); + self.controlDurationUpdate(); + }; + + const onProgressbarMouseUp = event => { + document.removeEventListener('mousemove', onProgressbarMouseMove); + document.removeEventListener('touchmove', onProgressbarMouseMove); + document.removeEventListener('mouseup', onProgressbarMouseUp); + document.removeEventListener('touchend', onProgressbarMouseUp); + + let clickedX = self.getEventOffsetX(event, event.target.parentNode); + + if (isNaN(clickedX) && !isNaN(initialPosition)) { + clickedX = initialPosition; + } + + if (!isNaN(clickedX)) { + shiftTime(clickedX); + } + + if (!initiallyPaused) { + self.play(); + } + + // Wait till video played then re-enable the animations + if (self.initialAnimationSet) { + setTimeout(() => { + self.displayOptions.layoutControls.playPauseAnimation = self.initialAnimationSet; + }, 200); + } + self.fluidPseudoPause = false; + }; + + document.addEventListener('mouseup', onProgressbarMouseUp); + document.addEventListener('touchend', onProgressbarMouseUp, { passive: true }); + document.addEventListener('mousemove', onProgressbarMouseMove); + document.addEventListener('touchmove', onProgressbarMouseMove, { passive: true }); + }; + + self.onVolumeBarMouseDown = () => { + const shiftVolume = volumeBarX => { + const totalWidth = self.domRef.controls.volumeContainer.clientWidth; + + if (totalWidth) { + let newVolume = volumeBarX / totalWidth; + + if (newVolume < 0.05) { + newVolume = 0; + self.domRef.player.muted = true; + } else if (newVolume > 0.95) { + newVolume = 1; + } + + if (self.domRef.player.muted && newVolume > 0) { + self.domRef.player.muted = false; + } + + self.setVolume(newVolume); + } + } + + const onVolumeBarMouseMove = event => { + const currentX = self.getEventOffsetX(event, self.domRef.controls.volumeContainer); + shiftVolume(currentX); + } + + const onVolumeBarMouseUp = event => { + document.removeEventListener('mousemove', onVolumeBarMouseMove); + document.removeEventListener('touchmove', onVolumeBarMouseMove); + document.removeEventListener('mouseup', onVolumeBarMouseUp); + document.removeEventListener('touchend', onVolumeBarMouseUp); + + const currentX = self.getEventOffsetX(event, self.domRef.controls.volumeContainer); + + if (!isNaN(currentX)) { + shiftVolume(currentX); + } + } + + document.addEventListener('mouseup', onVolumeBarMouseUp); + document.addEventListener('touchend', onVolumeBarMouseUp, { passive: true }); + document.addEventListener('mousemove', onVolumeBarMouseMove); + document.addEventListener('touchmove', onVolumeBarMouseMove, { passive: true }); + }; + + self.findRoll = (roll) => { + const ids = []; + ids.length = 0; + + if (!roll || !self.hasOwnProperty('rollsById')) { + return; + } + + for (let key in self.rollsById) { + if (!self.rollsById.hasOwnProperty(key)) { + continue; + } + + if (self.rollsById[key].roll === roll) { + ids.push(key); + } + } + + return ids; + }; + + self.onKeyboardVolumeChange = (direction) => { + let volume = self.domRef.player.volume; + + if ('asc' === direction) { + volume += 0.05; + } else if ('desc' === direction) { + volume -= 0.05; + } + + if (volume < 0.05) { + volume = 0; + } else if (volume > 0.95) { + volume = 1; + } + + self.setVolume(volume); + }; + + self.onKeyboardSeekPosition = (keyCode) => { + if (self.isCurrentlyPlayingAd) { + return; + } + + self.domRef.player.currentTime = self.getNewCurrentTimeValueByKeyCode( + keyCode, + self.domRef.player.currentTime, + self.domRef.player.duration + ); + }; + + self.getNewCurrentTimeValueByKeyCode = (keyCode, currentTime, duration) => { + let newCurrentTime = currentTime; + + switch (keyCode) { + case 35://End + newCurrentTime = duration; + break; + case 36://Home + newCurrentTime = 0; + break; + case 48://0 + case 49://1 + case 50://2 + case 51://3 + case 52://4 + case 53://5 + case 54://6 + case 55://7 + case 56://8 + case 57://9 + if (keyCode < 58 && keyCode > 47) { + const percent = (keyCode - 48) * 10; + newCurrentTime = duration * percent / 100; + } + break; + } + + return newCurrentTime; + }; + + self.handleMouseleave = (event) => { + if (typeof event.clientX !== 'undefined' + && self.domRef.wrapper.contains(document.elementFromPoint(event.clientX, event.clientY))) { + //false positive; we didn't actually leave the player + return; + } + + self.hideControlBar(); + self.hideTitle(); + }; + + self.handleMouseenterForKeyboard = () => { + if (self.captureKey) { + return; + } + + self.captureKey = event => { + event.stopPropagation(); + const keyCode = event.keyCode; + + switch (keyCode) { + case 70://f + self.fullscreenToggle(); + event.preventDefault(); + break; + case 13://Enter + case 32://Space + self.playPauseToggle(); + event.preventDefault(); + break; + case 77://m + self.muteToggle(); + event.preventDefault(); + break; + case 38://up arrow + self.onKeyboardVolumeChange('asc'); + event.preventDefault(); + break; + case 40://down arrow + self.onKeyboardVolumeChange('desc'); + event.preventDefault(); + break; + case 37://left arrow + self.skipRelative(-self.timeSkipOffsetAmount); + break; + case 39://right arrow + self.skipRelative(self.timeSkipOffsetAmount); + break; + case 35://End + case 36://Home + case 48://0 + case 49://1 + case 50://2 + case 51://3 + case 52://4 + case 53://5 + case 54://6 + case 55://7 + case 56://8 + case 57://9 + self.onKeyboardSeekPosition(keyCode); + event.preventDefault(); + break; + case 73: // i + self.toggleMiniPlayer(undefined, true); + break; + } + + return false; + + }; + + document.addEventListener('keydown', self.captureKey, true); + }; + + self.keyboardControl = () => { + self.domRef.wrapper.addEventListener('click', self.handleMouseenterForKeyboard, false); + + // When we click outside player, we stop registering keyboard events + const clickHandler = self.handleWindowClick.bind(self); + + self.destructors.push(() => { + window.removeEventListener('click', clickHandler); + }); + + window.addEventListener('click', clickHandler); + }; + + self.handleWindowClick = (e) => { + if (!self.domRef.wrapper) { + console.warn('Dangling click event listener should be collected for unknown wrapper.' + + 'Did you forget to call destroy on player instance?'); + return; + } + + const inScopeClick = self.domRef.wrapper.contains(e.target) || e.target.classList.contains('.js-skipHref'); + + if (inScopeClick) { + return; + } + + document.removeEventListener('keydown', self.captureKey, true); + delete self['captureKey']; + + if (self.theatreMode && !self.theatreModeAdvanced) { + self.theatreToggle(); + } + }; + + self.initialPlay = () => { + self.domRef.player.addEventListener('playing', () => { + self.toggleLoader(false); + }); + + self.domRef.player.addEventListener('timeupdate', () => { + // some places we are manually displaying toggleLoader + // user experience toggleLoader being displayed even when content is playing in background + self.toggleLoader(false); + }); + + self.domRef.player.addEventListener('waiting', () => { + self.toggleLoader(true); + }); + + if (!self.displayOptions.layoutControls.playButtonShowing) { + // Controls always showing until the video is first played + const initialControlsDisplay = self.domRef.wrapper.querySelector('.fluid_controls_container'); + initialControlsDisplay.classList.remove('initial_controls_show'); + // The logo shows before playing but may need to be removed + const fpPlayer = self.domRef.wrapper.querySelector('.logo_holder'); + if (fpPlayer) { + fpPlayer.classList.remove('initial_controls_show'); + } + } + + if (!self.firstPlayLaunched) { + self.playPauseToggle(); + self.domRef.player.removeEventListener('play', self.initialPlay); + } + }; + + self.playPauseToggle = () => { + self.hideSuggestedVideos(); + const isFirstStart = !self.firstPlayLaunched; + const preRolls = self.findRoll('preRoll'); + + if (!isFirstStart || preRolls.length === 0) { + if (isFirstStart && preRolls.length === 0) { + self.firstPlayLaunched = true; + self.displayOptions.vastOptions.vastAdvanced.noVastVideoCallback(); + } + + if (self.domRef.player.paused) { + if (self.isCurrentlyPlayingAd && self.vastOptions !== null && self.vastOptions.vpaid) { + // resume the vpaid linear ad + self.resumeVpaidAd(); + } else { + // Check if video has ended. If so, replay + if (Math.floor(self.currentVideoDuration) === Math.floor(self.domRef.player.currentTime)) { + self.initialiseStreamers(); + self.domRef.player.currentTime = 0; + } + + // resume the regular linear vast or content video player + if (self.dashPlayer) { + self.dashPlayer.play(); + } else { + self.domRef.player.play(); + } + } + + self.playPauseAnimationToggle(true); + + } else if (!isFirstStart) { + if (self.isCurrentlyPlayingAd && self.vastOptions !== null && self.vastOptions.vpaid) { + // pause the vpaid linear ad + self.pauseVpaidAd(); + } else { + // pause the regular linear vast or content video player + self.domRef.player.pause(); + } + + self.playPauseAnimationToggle(false); + } + + self.toggleOnPauseAd(); + } else { + self.isCurrentlyPlayingAd = true; + + // Workaround for Safari or Mobile Chrome - otherwise it blocks the subsequent + // play() command, because it considers it not being triggered by the user. + // The URL is hardcoded here to cover widest possible use cases. + // If you know of an alternative workaround for this issue - let us know! + const browserVersion = self.getBrowserVersion(); + const isChromeAndroid = self.mobileInfo.userOs !== false + && self.mobileInfo.userOs === 'Android' + && browserVersion.browserName === 'Google Chrome'; + + if ('Safari' === browserVersion.browserName || isChromeAndroid) { + self.domRef.player.src = 'https://cdn.fluidplayer.com/static/blank.mp4'; + self.domRef.player.play(); + self.playPauseAnimationToggle(true); + } + + self.firstPlayLaunched = true; + + //trigger the loading of the VAST Tag + self.prepareVast('preRoll'); + self.preRollAdPodsLength = preRolls.length; + } + + const prepareVastAdsThatKnowDuration = () => { + self.prepareVast('onPauseRoll'); + self.scheduleOnDemandRolls(); + }; + + if (isFirstStart) { + // Remove the div that was placed as a fix for poster image and DASH streaming, if it exists + const pseudoPoster = self.domRef.wrapper.querySelector('.fluid_pseudo_poster'); + if (pseudoPoster) { + pseudoPoster.parentNode.removeChild(pseudoPoster); + } + + if (self.mainVideoDuration > 0) { + prepareVastAdsThatKnowDuration(); + } else { + self.domRef.player.addEventListener('mainVideoDurationSet', prepareVastAdsThatKnowDuration); + } + } + + self.adTimer(); + + const blockOnPause = self.domRef.wrapper.querySelector('.fluid_html_on_pause_container'); + + if (blockOnPause && !self.isCurrentlyPlayingAd) { + if (self.domRef.player.paused) { + blockOnPause.style.display = 'flex'; + } else { + blockOnPause.style.display = 'none'; + } + } + }; + + self.setCustomControls = () => { + //Set the Play/Pause behaviour + self.trackEvent(self.domRef.player.parentNode, 'click', '.fluid_control_playpause', () => { + if (!self.firstPlayLaunched) { + self.domRef.player.removeEventListener('play', self.initialPlay); + } + + self.playPauseToggle(); + }, false); + + self.domRef.player.addEventListener('play', () => { + self.controlPlayPauseToggle(); + self.contolVolumebarUpdate(); + }, false); + + self.domRef.player.addEventListener('fluidplayerpause', () => { + self.controlPlayPauseToggle(); + }, false); + + //Set the progressbar + self.domRef.player.addEventListener('timeupdate', () => { + self.contolProgressbarUpdate(); + self.controlDurationUpdate(); + }); + + const isMobileChecks = self.getMobileOs(); + const eventOn = (isMobileChecks.userOs) ? 'touchstart' : 'mousedown'; + + if (self.displayOptions.layoutControls.showCardBoardView) { + self.trackEvent( + self.domRef.player.parentNode, + eventOn, + '.fluid_controls_progress_container', + event => self.onProgressbarMouseDown(event), + false + ); + } else { + self.domRef.wrapper.querySelector('.fluid_controls_progress_container') + .addEventListener(eventOn, event => self.onProgressbarMouseDown(event), { passive: true }); + } + + //Set the volume controls + self.domRef.wrapper.querySelector('.fluid_control_volume_container') + .addEventListener(eventOn, event => self.onVolumeBarMouseDown(), { passive: true }); + + self.domRef.player.addEventListener('volumechange', () => self.contolVolumebarUpdate()); + + self.trackEvent(self.domRef.player.parentNode, 'click', '.fluid_control_mute', () => self.muteToggle()); + + self.setBuffering(); + + //Set the fullscreen control + self.trackEvent(self.domRef.player.parentNode, 'click', '.fluid_control_fullscreen', () => self.fullscreenToggle()); + + // Theatre mode + if (self.displayOptions.layoutControls.allowTheatre && !self.isInIframe) { + self.domRef.wrapper.querySelector('.fluid_control_theatre').style.display = 'inline-block'; + self.trackEvent(self.domRef.player.parentNode, 'click', '.fluid_control_theatre', () => self.theatreToggle()); + } else { + self.domRef.wrapper.querySelector('.fluid_control_theatre').style.display = 'none'; + } + + // Mini Player + if (self.displayOptions.layoutControls.miniPlayer.enabled && !self.isInIframe) { + self.trackEvent(self.domRef.player.parentNode, 'click', '.fluid_control_mini_player', () => self.toggleMiniPlayer(undefined, true)); + } + + self.domRef.player.addEventListener('ratechange', () => { + if (self.isCurrentlyPlayingAd) { + self.playbackRate = 1; + } + }); + }; + + // Create the time position preview only if the vtt previews aren't enabled + self.createTimePositionPreview = () => { + if (!self.showTimeOnHover) { + return; + } + + const progressContainer = self.domRef.wrapper.querySelector('.fluid_controls_progress_container'); + const previewContainer = document.createElement('div'); + + previewContainer.className = 'fluid_timeline_preview'; + previewContainer.style.display = 'none'; + previewContainer.style.position = 'absolute'; + + progressContainer.appendChild(previewContainer); + + // Set up hover for time position preview display + self.domRef.wrapper.querySelector('.fluid_controls_progress_container') + .addEventListener('mousemove', event => { + const progressContainer = self.domRef.wrapper.querySelector('.fluid_controls_progress_container'); + const totalWidth = progressContainer.clientWidth; + const hoverTimeItem = self.domRef.wrapper.querySelector('.fluid_timeline_preview'); + const hoverQ = self.getEventOffsetX(event, progressContainer); + + const hoverSecondQ = self.currentVideoDuration * hoverQ / totalWidth; + hoverTimeItem.innerText = self.formatTime(hoverSecondQ); + + hoverTimeItem.style.display = 'block'; + hoverTimeItem.style.left = (hoverSecondQ / self.domRef.player.duration * 100) + "%"; + }, false); + + // Hide timeline preview on mouseout + self.domRef.wrapper.querySelector('.fluid_controls_progress_container') + .addEventListener('mouseout', () => { + const hoverTimeItem = self.domRef.wrapper.querySelector('.fluid_timeline_preview'); + hoverTimeItem.style.display = 'none'; + }, false); + }; + + self.setCustomContextMenu = () => { + const playerWrapper = self.domRef.wrapper; + + const showDefaultControls = self.displayOptions.layoutControls.contextMenu.controls; + const extraLinks = self.displayOptions.layoutControls.contextMenu.links; + + //Create own context menu + const divContextMenu = document.createElement('div'); + divContextMenu.className = 'fluid_context_menu'; + divContextMenu.style.display = 'none'; + divContextMenu.style.position = 'absolute'; + + const contextMenuList = document.createElement('ul'); + divContextMenu.appendChild(contextMenuList); + + if (Array.isArray(extraLinks)) { + extraLinks.forEach(function appendExtraLinks(link, index) { + const linkItem = document.createElement('li'); + linkItem.innerHTML = link.label; + linkItem.addEventListener('click', () => window.open(link.href, '_blank'), false); + contextMenuList.appendChild(linkItem); + }); + } + + if (showDefaultControls) { + const menuItemPlay = document.createElement('li'); + menuItemPlay.className = 'context_option_play'; + menuItemPlay.innerHTML = self.displayOptions.captions.play; + menuItemPlay.addEventListener('click', () => self.playPauseToggle(), false); + contextMenuList.appendChild(menuItemPlay); + + const menuItemMute = document.createElement('li'); + menuItemMute.className = 'context_option_mute'; + menuItemMute.innerHTML = self.displayOptions.captions.mute; + menuItemMute.addEventListener('click', () => self.muteToggle(), false); + contextMenuList.appendChild(menuItemMute); + + const menuItemFullscreen = document.createElement('li'); + menuItemFullscreen.className = 'context_option_fullscreen'; + menuItemFullscreen.innerHTML = self.displayOptions.captions.fullscreen; + menuItemFullscreen.addEventListener('click', () => self.fullscreenToggle(), false); + contextMenuList.appendChild(menuItemFullscreen); + } + + const menuItemVersion = document.createElement('li'); + menuItemVersion.innerHTML = 'Fluid Player ' + self.version; + menuItemVersion.addEventListener('click', () => window.open(self.homepage, '_blank'), false) + contextMenuList.appendChild(menuItemVersion); + + self.domRef.player.parentNode.insertBefore(divContextMenu, self.domRef.player.nextSibling); + + //Disable the default context menu + playerWrapper.addEventListener('contextmenu', e => { + e.preventDefault(); + + divContextMenu.style.left = self.getEventOffsetX(e, self.domRef.player) + 'px'; + divContextMenu.style.top = self.getEventOffsetY(e, self.domRef.player) + 'px'; + divContextMenu.style.display = 'block'; + }, false); + + //Hide the context menu on clicking elsewhere + document.addEventListener('click', e => { + if ((e.target !== self.domRef.player) || e.button !== 2) { + divContextMenu.style.display = 'none'; + } + }, false); + }; + + self.setDefaultLayout = () => { + self.domRef.wrapper.className += ' fluid_player_layout_' + self.displayOptions.layoutControls.layout; + + self.setCustomContextMenu(); + + const controls = self.generateCustomControlTags({ + displayVolumeBar: self.checkShouldDisplayVolumeBar(), + primaryColor: self.displayOptions.layoutControls.primaryColor + ? self.displayOptions.layoutControls.primaryColor + : 'red', + controlForwardBackward: !!self.displayOptions.layoutControls.controlForwardBackward.show, + miniPlayer: self.displayOptions.layoutControls.miniPlayer, + }); + + // Remove the default controls + self.domRef.player.removeAttribute('controls'); + + // Insert custom controls and append loader + self.domRef.player.parentNode.insertBefore(controls.root, self.domRef.player.nextSibling); + self.domRef.player.parentNode.insertBefore(controls.loader, self.domRef.player.nextSibling); + + // Register controls locally + self.domRef.controls = controls; + + /** + * Set the volumebar after its elements are properly rendered. + */ + let remainingAttemptsToInitiateVolumeBar = 100; + + const initiateVolumebar = function () { + if (!remainingAttemptsToInitiateVolumeBar) { + clearInterval(initiateVolumebarTimerId); + } else if (self.checkIfVolumebarIsRendered()) { + clearInterval(initiateVolumebarTimerId); + self.contolVolumebarUpdate(); + } else { + remainingAttemptsToInitiateVolumeBar--; + } + }; + let initiateVolumebarTimerId = setInterval(initiateVolumebar, 100); + self.destructors.push(() => clearInterval(initiateVolumebarTimerId)); + + if (self.displayOptions.layoutControls.doubleclickFullscreen && !(self.isTouchDevice() || !self.displayOptions.layoutControls.controlForwardBackward.doubleTapMobile)) { + self.domRef.player.addEventListener('dblclick', self.fullscreenToggle); + } + + if (self.getMobileOs().userOs === 'iOS') { + let orientationListenerAdded = false; + const observer = new IntersectionObserver((entries) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + self.domRef.player.inView = true; + if (self.displayOptions.layoutControls.autoRotateFullScreen && self.isTouchDevice() && !orientationListenerAdded) { + window.matchMedia("(orientation: landscape)").addEventListener('change', self.handleOrientationChange); + orientationListenerAdded = true; + } + } else { + self.domRef.player.inView = false; + } + }); + }); + + observer.observe(self.domRef.player); + } + + self.initHtmlOnPauseBlock(); + + self.setCustomControls(); + + self.setupThumbnailPreview(); + + self.createTimePositionPreview(); + + self.posterImage(); + + self.initPlayButton(); + + self.setVideoPreload(); + + self.createPlaybackList(); + + self.createDownload(); + + self.toggleMiniPlayerScreenDetection(); + + if (!!self.displayOptions.layoutControls.controlForwardBackward.show) { + self.initSkipControls(); + } + + if (!!self.displayOptions.layoutControls.controlForwardBackward.doubleTapMobile) { + self.initDoubleTapSkip(); + } + + self.initSkipAnimationElements(); + }; + + self.initSkipControls = () => { + self.domRef.controls.skipBack.addEventListener('click', self.skipRelative.bind(this, -self.timeSkipOffsetAmount)); + self.domRef.controls.skipForward.addEventListener('click', self.skipRelative.bind(this, self.timeSkipOffsetAmount)); + }; + + // Function to handle fullscreen toggle based on orientation + self.handleOrientationChange = () => { + const isLandscape = window.matchMedia("(orientation: landscape)").matches; + const videoPlayerTag = self.domRef.player; + const fullscreenTag = self.domRef.wrapper; + const requestFullscreenFunctionNames = self.checkFullscreenSupport(); + const fullscreenButton = videoPlayerTag.parentNode.getElementsByClassName('fluid_control_fullscreen'); + const menuOptionFullscreen = fullscreenTag.querySelector('.context_option_fullscreen'); + let functionNameToExecute; + if (isLandscape && self.domRef.player.inView) { + if (requestFullscreenFunctionNames) { + if (requestFullscreenFunctionNames.goFullscreen === 'webkitEnterFullscreen') { + functionNameToExecute = 'videoPlayerTag.' + requestFullscreenFunctionNames.goFullscreen + '();'; + self.fullscreenOn(fullscreenButton, menuOptionFullscreen); + new Function('videoPlayerTag', functionNameToExecute)(videoPlayerTag); + } else { + if (document[requestFullscreenFunctionNames.isFullscreen] === null) { + functionNameToExecute = 'videoPlayerTag.' + requestFullscreenFunctionNames.goFullscreen + '();'; + self.fullscreenOn(fullscreenButton, menuOptionFullscreen); + } + new Function('videoPlayerTag', functionNameToExecute)(fullscreenTag); + } + } else { + fullscreenTag.className += ' pseudo_fullscreen'; + self.fullscreenOn(fullscreenButton, menuOptionFullscreen); + } + } else { + fullscreenTag.className = fullscreenTag.className.replace(/\bpseudo_fullscreen\b/g, ''); + if (requestFullscreenFunctionNames) { + functionNameToExecute = 'document.' + requestFullscreenFunctionNames.exitFullscreen + '();'; + self.fullscreenOff(fullscreenButton, menuOptionFullscreen); + new Function('videoPlayerTag', functionNameToExecute)(fullscreenTag); + } else { + if (fullscreenTag.className.search(/\bpseudo_fullscreen\b/g) !== -1) { + fullscreenTag.className = fullscreenTag.className.replace(/\bpseudo_fullscreen\b/g, ''); + self.fullscreenOff(fullscreenButton, menuOptionFullscreen); + } + } + } + self.resizeVpaidAuto(); + } + + /** + * Creates the skip animation elements and appends them to the player + * + * @returns {void} + */ + self.initSkipAnimationElements = function initSkipAnimationElements() { + const skipAnimationWrapper = document.createElement('div'); + skipAnimationWrapper.classList.add('fluid_player_skip_offset'); + + const skipAnimationBackward = document.createElement('div'); + skipAnimationBackward.classList.add('fluid_player_skip_offset__backward'); + skipAnimationWrapper.appendChild(skipAnimationBackward); + + const skipAnimationBackwardIcon = document.createElement('div'); + skipAnimationBackwardIcon.classList.add('fluid_player_skip_offset__backward-icon'); + skipAnimationBackwardIcon.ontransitionend = () => skipAnimationBackwardIcon.classList.remove('animate'); + skipAnimationBackward.appendChild(skipAnimationBackwardIcon); + + const skipAnimationForward = document.createElement('div'); + skipAnimationForward.classList.add('fluid_player_skip_offset__forward'); + skipAnimationWrapper.appendChild(skipAnimationForward); + + const skipAnimationForwardIcon = document.createElement('div'); + skipAnimationForwardIcon.classList.add('fluid_player_skip_offset__forward-icon'); + skipAnimationForwardIcon.ontransitionend = () => skipAnimationForwardIcon.classList.remove('animate'); + skipAnimationForward.appendChild(skipAnimationForwardIcon); + + self.domRef.player.parentNode.insertBefore(skipAnimationWrapper, self.domRef.player.nextSibling); + } + + /** + * Initialises the double tap skip functionality + */ + self.initDoubleTapSkip = () => { + let hasDoubleClicked = false; + let timeouts = []; + + function clearTimeouts() { + timeouts.forEach(timeout => clearTimeout(timeout)); + timeouts = []; + } + + self.domRef.player.addEventListener('pointerdown', (event) => { + // Check if it's mobile on the fly and prevent double click skip if it is + if (!self.isTouchDevice()) { + return; + } + + if (!self.isControlBarVisible()) { + return; + } + + const { offsetX } = event + const { clientWidth } = self.domRef.player; + + // Simulates default behaviour if it's a single click + timeouts.push(setTimeout(() => { + hasDoubleClicked = false; + self.playPauseToggle(); + }, 300)); + + // Skips video time if it's a double click + if (hasDoubleClicked) { + clearTimeouts(); + hasDoubleClicked = false; + return self.skipRelative(offsetX < clientWidth / 2 ? -self.timeSkipOffsetAmount : self.timeSkipOffsetAmount); + } + + hasDoubleClicked = true; + }); + } + + /** + * Skips the video time by timeOffset relative to the current video time + * + * @param {number} timeOffset + */ + self.skipRelative = function skipRelative(timeOffset) { + self.debugMessage('skipping video time by ', timeOffset); + if (self.isCurrentlyPlayingAd) { + return; + } + + let skipTo = self.domRef.player.currentTime + timeOffset; + if (skipTo < 0) { + skipTo = 0; + } + self.domRef.player.currentTime = skipTo; + + // Trigger animation + if (timeOffset >= 0) { + const forwardElement = self.domRef.wrapper.querySelector(`.fluid_player_skip_offset__forward-icon`); + forwardElement.classList.add('animate'); + } else { + const backwardElement = self.domRef.wrapper.querySelector(`.fluid_player_skip_offset__backward-icon`); + backwardElement.classList.add('animate'); + } + } + + /** + * Checks if the volumebar is rendered and the styling applied by comparing + * the width of 2 elements that should look different. + * + * @returns Boolean + */ + self.checkIfVolumebarIsRendered = () => { + const volumeposTag = self.domRef.wrapper.querySelector('.fluid_control_volume_currentpos'); + const volumebarTotalWidth = self.domRef.wrapper.querySelector('.fluid_control_volume').clientWidth; + const volumeposTagWidth = volumeposTag.clientWidth; + + return volumeposTagWidth !== volumebarTotalWidth; + }; + + self.setLayout = () => { + //All other browsers + if (!self.isTouchDevice()) { + self.domRef.player.addEventListener('click', () => self.playPauseToggle(), false); + } + //Mobile Safari - because it does not emit a click event on initial click of the video + self.domRef.player.addEventListener('play', self.initialPlay, false); + self.setDefaultLayout(); + }; + + self.handleFullscreen = () => { + if (typeof document.vastFullsreenChangeEventListenersAdded !== 'undefined') { + return; + } + + ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'msfullscreenchange'].forEach(eventType => { + if (typeof (document['on' + eventType]) === 'object') { + document.addEventListener(eventType, function (ev) { + self.recalculateAdDimensions(); + }, false); + } + }); + + document.vastFullsreenChangeEventListenersAdded = true; + }; + + self.setupPlayerWrapper = () => { + const wrapper = document.createElement('div'); + + wrapper.id = 'fluid_video_wrapper_' + self.videoPlayerId; + wrapper.className = self.isTouchDevice() + ? 'fluid_video_wrapper mobile' + : 'fluid_video_wrapper'; + + //Assign the height/width dimensions to the wrapper + if (self.displayOptions.layoutControls.fillToContainer) { + wrapper.style.width = '100%'; + wrapper.style.height = '100%'; + } else { + wrapper.style.height = self.domRef.player.clientHeight + 'px'; + wrapper.style.width = self.domRef.player.clientWidth + 'px'; + } + + const parseBorderRadius = () => { + const roundedCorners = self.displayOptions.layoutControls.roundedCorners; + const parsedValue = Number(roundedCorners); + + return !isNaN(parsedValue) && parsedValue !== 0 + ? `${parsedValue}px` + : roundedCorners; + } + + wrapper.style.borderRadius = self.domRef.player.style.borderRadius = parseBorderRadius(); + wrapper.style.overflow = 'hidden'; + + self.domRef.player.style.height = '100%'; + self.domRef.player.style.width = '100%'; + + self.domRef.player.parentNode.insertBefore(wrapper, self.domRef.player); + wrapper.appendChild(self.domRef.player); + + return wrapper; + }; + + self.onErrorDetection = () => { + if (self.domRef.player.networkState === self.domRef.player.NETWORK_NO_SOURCE && self.isCurrentlyPlayingAd) { + //Probably the video ad file was not loaded successfully + self.playMainVideoWhenVastFails(401); + } + }; + + self.createVideoSourceSwitch = (initialLoad = true) => { + const sources = []; + const sourcesList = self.domRef.player.querySelectorAll('source'); + [].forEach.call(sourcesList, source => { + if (source.title && source.src) { + sources.push({ + 'title': source.title, + 'url': source.src, + 'isHD': (source.getAttribute('data-fluid-hd') != null) + }); + } + }); + + const sourceChangeButton = self.domRef.wrapper.querySelector('.fluid_control_video_source'); + self.videoSources = sources; + + if (self.videoSources.length > 1) { + sourceChangeButton.style.display = 'inline-block'; + } else { + sourceChangeButton.style.display = 'none'; + } + + if (self.videoSources.length <= 1) { + return; + } + + let appendSourceChange = false; + + const sourceChangeList = document.createElement('div'); + sourceChangeList.className = 'fluid_video_sources_list'; + sourceChangeList.style.display = 'none'; + + let firstSource = true; + for (const source of self.videoSources) { + // Fix for issues occurring on iOS with mkv files + const getTheType = source.url.split(".").pop(); + if (self.mobileInfo.userOs === 'iOS' && getTheType === 'mkv') { + continue; + } + + // On suggested videos, if the resolution doesn't exist in the new source list, use the first one in the list + // This gets overwritten if it's needed by setPersistentSettings() + if(firstSource && !initialLoad) { + self.domRef.player.src = source.url; + } + + const sourceSelected = (firstSource) ? "source_selected" : ""; + const hdElement = (source.isHD) ? '' : ''; + firstSource = false; + const sourceChangeDiv = document.createElement('div'); + sourceChangeDiv.className = 'fluid_video_source_list_item js-source_' + source.title; + sourceChangeDiv.innerHTML = '' + source.title + hdElement; + + sourceChangeDiv.addEventListener('click', function (event) { + event.stopPropagation(); + // While changing source the player size can flash, we want to set the pixel dimensions then back to 100% afterwards + self.domRef.player.style.width = self.domRef.player.clientWidth + 'px'; + self.domRef.player.style.height = self.domRef.player.clientHeight + 'px'; + + const videoChangedTo = this; + const sourceIcons = self.domRef.wrapper.getElementsByClassName('source_button_icon'); + for (let i = 0; i < sourceIcons.length; i++) { + sourceIcons[i].className = sourceIcons[i].className.replace('source_selected', ''); + } + videoChangedTo.firstChild.className += ' source_selected'; + + self.videoSources.forEach(source => { + if (source.title === videoChangedTo.innerText.replace(/(\r\n\t|\n|\r\t)/gm, '')) { + self.setBuffering(); + self.setVideoSource(source.url); + self.fluidStorage.fluidQuality = source.title; + } + }); + + self.openCloseVideoSourceSwitch(); + }); + + sourceChangeList.appendChild(sourceChangeDiv); + appendSourceChange = true; + } + + if (appendSourceChange) { + sourceChangeButton.appendChild(sourceChangeList); + // To reset player for suggested videos, in case the event listener already exists + sourceChangeButton.removeEventListener('click', self.openCloseVideoSourceSwitch); + sourceChangeButton.addEventListener('click', self.openCloseVideoSourceSwitch); + } else { + // Didn't give any source options + self.domRef.wrapper.querySelector('.fluid_control_video_source').style.display = 'none'; + } + }; + + self.openCloseVideoSourceSwitch = () => { + const sourceChangeList = self.domRef.wrapper.querySelector('.fluid_video_sources_list'); + + if (self.isCurrentlyPlayingAd || self.isShowingSuggestedVideos()) { + sourceChangeList.style.display = 'none'; + return; + } + + if (sourceChangeList.style.display !== 'none') { + sourceChangeList.style.display = 'none'; + return; + } + + sourceChangeList.style.display = 'block'; + const mouseOut = () => { + sourceChangeList.removeEventListener('mouseleave', mouseOut); + sourceChangeList.style.display = 'none'; + }; + sourceChangeList.addEventListener('mouseleave', mouseOut); + }; + + self.setVideoSource = (url) => { + if (self.mobileInfo.userOs === 'iOS' && url.indexOf('.mkv') > 0) { + console.log('[FP_ERROR] .mkv files not supported by iOS devices.'); + return false; + } + + if (self.isCurrentlyPlayingAd) { + self.originalSrc = url; + return; + } + + self.isSwitchingSource = true; + let play = false; + if (!self.domRef.player.paused) { + self.domRef.player.pause(); + play = true; + } + + const currentTime = self.domRef.player.currentTime; + self.setCurrentTimeAndPlay(currentTime, play); + + self.domRef.player.src = url; + self.originalSrc = url; + self.displayOptions.layoutControls.mediaType = self.getCurrentSrcType(); + self.initialiseStreamers(); + }; + + self.setCurrentTimeAndPlay = (newCurrentTime, shouldPlay) => { + const loadedMetadata = () => { + self.domRef.player.currentTime = newCurrentTime; + self.domRef.player.removeEventListener('loadedmetadata', loadedMetadata); + // Safari ios and mac fix to set currentTime + if (self.mobileInfo.userOs === 'iOS' || self.getBrowserVersion().browserName.toLowerCase() === 'safari') { + self.domRef.player.addEventListener('playing', videoPlayStart); + } + + if (shouldPlay) { + self.domRef.player.play(); + } else { + self.domRef.player.pause(); + self.controlPlayPauseToggle(); + } + + self.isSwitchingSource = false; + self.domRef.player.style.width = '100%'; + self.domRef.player.style.height = '100%'; + }; + + let videoPlayStart = () => { + self.currentTime = newCurrentTime; + self.domRef.player.removeEventListener('playing', videoPlayStart); + }; + + self.domRef.player.addEventListener('loadedmetadata', loadedMetadata, false); + self.domRef.player.load(); + }; + + self.initTitle = () => { + if (!self.displayOptions.layoutControls.title) { + return; + } + + const titleHolder = document.createElement('div'); + self.domRef.player.parentNode.insertBefore(titleHolder, null); + titleHolder.innerHTML += self.displayOptions.layoutControls.title; + titleHolder.classList.add('fp_title'); + }; + + self.hasTitle = () => { + const title = self.domRef.wrapper.querySelector('.fp_title'); + const titleOption = self.displayOptions.layoutControls.title; + return title && titleOption != null; + }; + + self.hideTitle = () => { + const titleHolder = self.domRef.wrapper.querySelector('.fp_title'); + + if (!self.hasTitle()) { + return; + } + + titleHolder.classList.add('fade_out'); + }; + + self.showTitle = () => { + const titleHolder = self.domRef.wrapper.querySelector('.fp_title'); + + if (!self.hasTitle()) { + return; + } + + titleHolder.classList.remove('fade_out'); + }; + + self.initLogo = () => { + if (!self.displayOptions.layoutControls.logo.imageUrl) { + return; + } + + // Container div for the logo + // This is to allow for fade in and out logo_maintain_display + const logoHolder = document.createElement('div'); + logoHolder.className = 'logo_holder'; + if (self.displayOptions.layoutControls.logo.hideWithControls) { + logoHolder.classList.add('initial_controls_show', 'fp_logo'); + } else { + logoHolder.classList.add('logo_maintain_display'); + } + // The logo itself + const logoImage = document.createElement('img'); + if (self.displayOptions.layoutControls.logo.imageUrl) { + logoImage.src = self.displayOptions.layoutControls.logo.imageUrl; + } + + logoImage.style.position = 'absolute'; + logoImage.style.margin = self.displayOptions.layoutControls.logo.imageMargin; + const logoPosition = self.displayOptions.layoutControls.logo.position.toLowerCase(); + + if (logoPosition.indexOf('bottom') !== -1) { + logoImage.style.bottom = 0; + } else { + logoImage.style.top = 0; + } + if (logoPosition.indexOf('right') !== -1) { + logoImage.style.right = 0; + } else { + logoImage.style.left = 0; + } + if (self.displayOptions.layoutControls.logo.opacity) { + logoImage.style.opacity = self.displayOptions.layoutControls.logo.opacity; + } + + if (self.displayOptions.layoutControls.logo.clickUrl !== null) { + logoImage.style.cursor = 'pointer'; + logoImage.addEventListener('click', function () { + const win = window.open(self.displayOptions.layoutControls.logo.clickUrl, '_blank'); + win.focus(); + }); + } + + // If a mouseOverImage is provided then we must set up the listeners for it + if (self.displayOptions.layoutControls.logo.mouseOverImageUrl) { + logoImage.addEventListener('mouseover', function () { + logoImage.src = self.displayOptions.layoutControls.logo.mouseOverImageUrl; + }, false); + logoImage.addEventListener('mouseout', function () { + logoImage.src = self.displayOptions.layoutControls.logo.imageUrl; + }, false); + } + + self.domRef.player.parentNode.insertBefore(logoHolder, null); + logoHolder.appendChild(logoImage, null); + }; + + self.initHtmlOnPauseBlock = () => { + //If onPauseRoll is defined than HtmlOnPauseBlock won't be shown + if (self.hasValidOnPauseAd()) { + return; + } + + if (!self.displayOptions.layoutControls.htmlOnPauseBlock.html) { + return; + } + + const containerDiv = document.createElement('div'); + containerDiv.className = 'fluid_html_on_pause_container'; + containerDiv.style.display = 'none'; + containerDiv.innerHTML = self.displayOptions.layoutControls.htmlOnPauseBlock.html; + containerDiv.onclick = function (event) { + self.playPauseToggle(); + }; + + if (self.displayOptions.layoutControls.htmlOnPauseBlock.width) { + containerDiv.style.width = self.displayOptions.layoutControls.htmlOnPauseBlock.width + 'px'; + } + + if (self.displayOptions.layoutControls.htmlOnPauseBlock.height) { + containerDiv.style.height = self.displayOptions.layoutControls.htmlOnPauseBlock.height + 'px'; + } + + self.domRef.player.parentNode.insertBefore(containerDiv, null); + }; + + /** + * Play button in the middle when the video loads + */ + self.initPlayButton = () => { + // Create the html for the play button + const containerDiv = document.createElement('div'); + containerDiv.className = 'fluid_html_on_pause fluid_initial_play_button_container'; + const backgroundColor = (self.displayOptions.layoutControls.primaryColor) ? self.displayOptions.layoutControls.primaryColor : "#333333"; + containerDiv.innerHTML = '

'; + const initPlayEventTypes = ['click', 'touchend']; + const initPlayFunction = function () { + self.playPauseToggle(); + initPlayEventTypes.forEach(eventType => containerDiv.removeEventListener(eventType, initPlayFunction)) + }; + initPlayEventTypes.forEach(eventType => containerDiv.addEventListener(eventType, initPlayFunction)) + + // If the user has chosen to not show the play button we'll make it invisible + // We don't hide altogether because animations might still be used + if (!self.displayOptions.layoutControls.playButtonShowing) { + const initialControlsDisplay = self.domRef.wrapper.querySelector('.fluid_controls_container'); + initialControlsDisplay.classList.add('initial_controls_show'); + containerDiv.style.opacity = '0'; + } + + self.domRef.player.parentNode.insertBefore(containerDiv, null); + }; + + /** + * Set the mainVideoDuration property one the video is loaded + */ + self.mainVideoReady = () => { + if (!(self.mainVideoDuration === 0 && !self.isCurrentlyPlayingAd && self.mainVideoReadyState === false)) { + return; + } + const event = new CustomEvent('mainVideoDurationSet'); + + self.mainVideoDuration = self.domRef.player.duration; + self.mainVideoReadyState = true; + self.domRef.player.dispatchEvent(event); + self.domRef.player.removeEventListener('loadedmetadata', self.mainVideoReady); + }; + + self.userActivityChecker = () => { + const videoPlayer = self.domRef.wrapper; + self.newActivity = null; + + let isMouseStillDown = false; + + const activity = event => { + if (event.type === 'touchstart' || event.type === 'mousedown') { + isMouseStillDown = true; + } + if (event.type === 'touchend' || event.type === 'mouseup') { + isMouseStillDown = false; + } + self.newActivity = true; + }; + + const intervalId = setInterval(() => { + if (self.newActivity !== true) { + return; + } + + if (!isMouseStillDown && !self.isLoading) { + self.newActivity = false; + } + + if (self.isUserActive === false || !self.isControlBarVisible()) { + let event = new CustomEvent('userActive'); + self.domRef.player.dispatchEvent(event); + self.isUserActive = true; + } + + clearTimeout(self.inactivityTimeout); + + self.inactivityTimeout = setTimeout(() => { + if (self.newActivity === true) { + clearTimeout(self.inactivityTimeout); + return; + } + + self.isUserActive = false; + + let event = new CustomEvent('userInactive'); + self.domRef.player.dispatchEvent(event); + }, self.displayOptions.layoutControls.controlBar.autoHideTimeout * 1000); + }, 300); + + self.destructors.push(() => clearInterval(intervalId)); + + const listenTo = (self.isTouchDevice()) + ? ['touchstart', 'touchmove', 'touchend'] + : ['mousemove', 'mousedown', 'mouseup']; + + for (let i = 0; i < listenTo.length; i++) { + videoPlayer.addEventListener(listenTo[i], activity, { passive: true }); + } + }; + + self.hasControlBar = () => { + return !!self.domRef.wrapper.querySelector('.fluid_controls_container'); + }; + + self.isControlBarVisible = () => { + if (self.hasControlBar() === false) { + return false; + } + + const controlBar = self.domRef.wrapper.querySelector('.fluid_controls_container'); + const style = window.getComputedStyle(controlBar, null); + return !(style.opacity === 0 || style.visibility === 'hidden'); + }; + + self.setVideoPreload = () => { + self.domRef.player.setAttribute('preload', self.displayOptions.layoutControls.preload); + }; + + self.hideControlBar = () => { + if (self.isCurrentlyPlayingAd && !self.domRef.player.paused) { + self.toggleAdCountdown(true); + } + + self.domRef.player.style.cursor = 'none'; + + // handles both VR and Normal condition + if (!self.hasControlBar()) { + return; + } + + const divVastControls = self.domRef.player.parentNode.getElementsByClassName('fluid_controls_container'); + const fpLogo = self.domRef.player.parentNode.getElementsByClassName('fp_logo'); + + for (let i = 0; i < divVastControls.length; i++) { + if (self.displayOptions.layoutControls.controlBar.animated) { + divVastControls[i].classList.remove('fade_in'); + divVastControls[i].classList.add('fade_out'); + } else { + divVastControls[i].style.display = 'none'; + } + } + + if (self.displayOptions.layoutControls.logo.hideWithControls) { + for (let i = 0; i < fpLogo.length; i++) { + if (self.displayOptions.layoutControls.controlBar.animated) { + if (fpLogo[i]) { + fpLogo[i].classList.remove('fade_in'); + fpLogo[i].classList.add('fade_out'); + } + } else { + if (fpLogo[i]) { + fpLogo[i].style.display = 'none'; + } + } + } + } + }; + + self.showControlBar = (event) => { + if (self.isCurrentlyPlayingAd && !self.domRef.player.paused) { + self.toggleAdCountdown(false); + } + + if (event.type === 'mouseenter' || event.type === 'userActive') { + self.domRef.player.style.cursor = 'default'; + } + + if (!self.hasControlBar()) { + return; + } + + const divVastControls = self.domRef.player.parentNode.getElementsByClassName('fluid_controls_container'); + const fpLogo = self.domRef.player.parentNode.getElementsByClassName('fp_logo'); + for (let i = 0; i < divVastControls.length; i++) { + if (self.displayOptions.layoutControls.controlBar.animated) { + divVastControls[i].classList.remove('fade_out'); + divVastControls[i].classList.add('fade_in'); + } else { + divVastControls[i].style.display = 'block'; + } + } + if (self.displayOptions.layoutControls.logo.hideWithControls) { + for (let i = 0; i < fpLogo.length; i++) { + if (self.displayOptions.layoutControls.controlBar.animated) { + if (fpLogo[i]) { + fpLogo[i].classList.remove('fade_out'); + fpLogo[i].classList.add('fade_in'); + } + } else { + if (fpLogo[i]) { + fpLogo[i].style.display = 'block'; + } + } + } + } + }; + + self.linkControlBarUserActivity = () => { + self.domRef.player.addEventListener('userInactive', self.hideControlBar); + self.domRef.player.addEventListener('userInactive', self.hideTitle); + + self.domRef.player.addEventListener('userActive', self.showControlBar); + self.domRef.player.addEventListener('userActive', self.showTitle); + }; + + self.initMute = () => { + if (self.displayOptions.layoutControls.mute !== true) { + return; + } + + self.domRef.player.volume = 0; + }; + + self.initLoop = () => { + self.domRef.player.loop = !!self.displayOptions.layoutControls.loop; + }; + + self.setBuffering = () => { + let progressInterval; + const bufferBar = self.domRef.player.parentNode.getElementsByClassName('fluid_controls_buffered'); + + for (let j = 0; j < bufferBar.length; j++) { + bufferBar[j].style.width = 0; + } + + // Buffering + const logProgress = () => { + const duration = self.domRef.player.duration; + if (duration <= 0) { + return; + } + + for (let i = 0; i < self.domRef.player.buffered.length; i++) { + if (self.domRef.player.buffered.start(self.domRef.player.buffered.length - 1 - i) >= self.domRef.player.currentTime) { + continue; + } + + const newBufferLength = (self.domRef.player.buffered.end(self.domRef.player.buffered.length - 1 - i) / duration) * 100 + "%"; + + for (let j = 0; j < bufferBar.length; j++) { + bufferBar[j].style.width = newBufferLength; + } + + // Stop checking for buffering if the video is fully buffered + if (!!progressInterval && 1 === (self.domRef.player.buffered.end(self.domRef.player.buffered.length - 1 - i) / duration)) { + clearInterval(progressInterval); + } + + break; + } + }; + progressInterval = setInterval(logProgress, 500); + self.destructors.push(() => clearInterval(progressInterval)); + }; + + self.createPlaybackList = () => { + if (!self.displayOptions.layoutControls.playbackRateEnabled) { + return; + } + + const sourceChangeButton = self.domRef.wrapper.querySelector('.fluid_control_playback_rate'); + sourceChangeButton.style.display = 'inline-block'; + + const sourceChangeList = document.createElement('div'); + sourceChangeList.className = 'fluid_video_playback_rates'; + sourceChangeList.style.display = 'none'; + + if ( + !Array.isArray(self.displayOptions.layoutControls.controlBar.playbackRates) + || self.displayOptions.layoutControls.controlBar.playbackRates.some( + rate => typeof rate !== 'string' || Number.isNaN(Number(rate.replace('x', ''))) + ) + ) { + self.displayOptions.layoutControls.controlBar.playbackRates = ['x2', 'x1.5', 'x1', 'x0.5']; + } + + self.displayOptions.layoutControls.controlBar.playbackRates.forEach(function (rate) { + const sourceChangeDiv = document.createElement('div'); + sourceChangeDiv.className = 'fluid_video_playback_rates_item'; + sourceChangeDiv.innerText = rate; + + sourceChangeDiv.addEventListener('click', function (event) { + event.stopPropagation(); + let playbackRate = this.innerText.replace('x', ''); + self.setPlaybackSpeed(playbackRate); + self.openCloseVideoPlaybackRate(); + + }); + sourceChangeList.appendChild(sourceChangeDiv); + }); + + sourceChangeButton.appendChild(sourceChangeList); + sourceChangeButton.addEventListener('click', function () { + self.openCloseVideoPlaybackRate(); + }); + }; + + self.openCloseVideoPlaybackRate = () => { + const sourceChangeList = self.domRef.wrapper.querySelector('.fluid_video_playback_rates'); + + if (self.isCurrentlyPlayingAd || 'none' !== sourceChangeList.style.display) { + sourceChangeList.style.display = 'none'; + return; + } + + sourceChangeList.style.display = 'block'; + const mouseOut = function () { + sourceChangeList.removeEventListener('mouseleave', mouseOut); + sourceChangeList.style.display = 'none'; + }; + sourceChangeList.addEventListener('mouseleave', mouseOut); + }; + + self.createDownload = () => { + const downloadOption = self.domRef.wrapper.querySelector('.fluid_control_download'); + if (!self.displayOptions.layoutControls.allowDownload) { + return; + } + downloadOption.style.display = 'inline-block'; + + let downloadClick = document.createElement('a'); + downloadClick.className = 'fp_download_click'; + downloadClick.onclick = function (e) { + const linkItem = this; + + if (typeof e.stopImmediatePropagation !== 'undefined') { + e.stopImmediatePropagation(); + } + + setTimeout(function () { + linkItem.download = ''; + linkItem.href = ''; + }, 100); + }; + + downloadOption.appendChild(downloadClick); + + downloadOption.addEventListener('click', function () { + const downloadItem = self.domRef.wrapper.querySelector('.fp_download_click'); + downloadItem.download = self.originalSrc; + downloadItem.href = self.originalSrc; + downloadClick.click(); + }); + }; + + self.theatreToggle = () => { + self.debugMessage(`Toggling Theater Mode`); + if (self.isInIframe) { + return; + } + + // Theatre and fullscreen, it's only one or the other + this.resetDisplayMode('theaterMode'); + + // Advanced Theatre mode if specified + if (self.displayOptions.layoutControls.theatreAdvanced) { + const elementForTheatre = self.domRef.wrapper.querySelector(`#${self.displayOptions.layoutControls.theatreAdvanced.theatreElement}`); + const theatreClassToApply = self.displayOptions.layoutControls.theatreAdvanced.classToApply; + if (elementForTheatre != null && theatreClassToApply != null) { + if (!self.theatreMode) { + elementForTheatre.classList.add(theatreClassToApply); + } else { + elementForTheatre.classList.remove(theatreClassToApply); + } + self.theatreModeAdvanced = !self.theatreModeAdvanced; + } else { + console.log('[FP_ERROR] Theatre mode elements could not be found, defaulting behaviour.'); + // Default overlay behaviour + self.defaultTheatre(); + } + } else { + // Default overlay behaviour + self.defaultTheatre(); + } + + // Set correct variables + self.theatreMode = !self.theatreMode; + self.fluidStorage.fluidTheatre = self.theatreMode; + + // Trigger theatre event + const theatreEvent = (self.theatreMode) ? 'theatreModeOn' : 'theatreModeOff'; + const event = document.createEvent('CustomEvent'); + event.initEvent(theatreEvent, false, true); + self.domRef.player.dispatchEvent(event); + + self.resizeVpaidAuto(); + }; + + self.defaultTheatre = () => { + const videoWrapper = self.domRef.wrapper; + + if (self.theatreMode) { + videoWrapper.classList.remove('fluid_theatre_mode'); + videoWrapper.style.maxHeight = ''; + videoWrapper.style.marginTop = ''; + videoWrapper.style.left = ''; + videoWrapper.style.right = ''; + videoWrapper.style.position = ''; + if (!self.displayOptions.layoutControls.fillToContainer) { + videoWrapper.style.width = self.originalWidth + 'px'; + videoWrapper.style.height = self.originalHeight + 'px'; + } else { + videoWrapper.style.width = '100%'; + videoWrapper.style.height = '100%'; + } + return; + } + + videoWrapper.classList.add('fluid_theatre_mode'); + const workingWidth = self.displayOptions.layoutControls.theatreSettings.width; + let defaultHorizontalMargin = '10px'; + videoWrapper.style.width = workingWidth; + videoWrapper.style.height = self.displayOptions.layoutControls.theatreSettings.height; + videoWrapper.style.maxHeight = screen.height + "px"; + videoWrapper.style.marginTop = self.displayOptions.layoutControls.theatreSettings.marginTop + 'px'; + switch (self.displayOptions.layoutControls.theatreSettings.horizontalAlign) { + case 'center': + // We must calculate the margin differently based on whether they passed % or px + if (typeof (workingWidth) == 'string' && workingWidth.substr(workingWidth.length - 1) === "%") { + // A margin of half the remaining space + defaultHorizontalMargin = ((100 - parseInt(workingWidth.substring(0, workingWidth.length - 1))) / 2) + "%"; + } else if (typeof (workingWidth) == 'string' && workingWidth.substr(workingWidth.length - 2) === "px") { + // Half the (Remaining width / fullwidth) + defaultHorizontalMargin = (((screen.width - parseInt(workingWidth.substring(0, workingWidth.length - 2))) / screen.width) * 100 / 2) + "%"; + } else { + console.log('[FP_ERROR] Theatre width specified invalid.'); + } + + videoWrapper.style.left = defaultHorizontalMargin; + break; + case 'right': + videoWrapper.style.right = defaultHorizontalMargin; + break; + case 'left': + default: + videoWrapper.style.left = defaultHorizontalMargin; + break; + } + }; + + // Set the poster for the video, taken from custom params + // Cannot use the standard video tag poster image as it can be removed by the persistent settings + self.posterImage = () => { + if (!self.displayOptions.layoutControls.posterImage) { + return; + } + + const containerDiv = document.createElement('div'); + containerDiv.className = 'fluid_pseudo_poster'; + if (['auto', 'contain', 'cover'].indexOf(self.displayOptions.layoutControls.posterImageSize) === -1) { + console.log('[FP_ERROR] Not allowed value in posterImageSize'); + return; + } + containerDiv.style.background = "url('" + self.displayOptions.layoutControls.posterImage + "') center center / " + + self.displayOptions.layoutControls.posterImageSize + " no-repeat black"; + self.domRef.player.parentNode.insertBefore(containerDiv, null); + }; + + // This is called when a media type is unsupported. We'll find the current source and try set the next source if it exists + self.nextSource = () => { + const sources = self.domRef.player.getElementsByTagName('source'); + + if (!sources.length) { + return null; + } + + for (let i = 0; i < sources.length - 1; i++) { + if (sources[i].getAttribute('src') === self.originalSrc && sources[i + 1].getAttribute('src')) { + self.setVideoSource(sources[i + 1].getAttribute('src')); + return; + } + } + }; + + self.inIframe = () => { + try { + return window.self !== window.top; + } catch (e) { + return true; + } + }; + + self.setPersistentSettings = (ignoreMute = false) => { + try { + if (!(typeof (Storage) !== 'undefined' && typeof (localStorage) !== 'undefined')) { + return; + } + } catch (e) { + return; + } + + // See https://github.com/fluid-player/fluid-player/issues/271 + const testKey = '_fp_storage_enabled', storage = localStorage; + try { + storage.setItem(testKey, '1'); + storage.removeItem(testKey); + } catch (error) { + return false; + } + + self.fluidStorage = localStorage; + if (typeof (self.fluidStorage.fluidVolume) !== 'undefined' + && self.displayOptions.layoutControls.persistentSettings.volume + && !ignoreMute) { + self.setVolume(self.fluidStorage.fluidVolume); + + if (typeof (self.fluidStorage.fluidMute) !== 'undefined' && self.fluidStorage.fluidMute === 'true') { + self.muteToggle(); + } + } + + if (typeof (self.fluidStorage.fluidQuality) !== 'undefined' + && self.displayOptions.layoutControls.persistentSettings.quality) { + const sourceOption = self.domRef.wrapper.querySelector('.js-source_' + self.fluidStorage.fluidQuality); + const sourceChangeButton = self.domRef.wrapper.querySelector('.fluid_control_video_source'); + if (sourceOption) { + sourceOption.click(); + sourceChangeButton.click(); + } + } + + if (typeof (self.fluidStorage.fluidSpeed) !== 'undefined' + && self.displayOptions.layoutControls.persistentSettings.speed) { + self.setPlaybackSpeed(self.fluidStorage.fluidSpeed); + } + + if (typeof (self.fluidStorage.fluidTheatre) !== 'undefined' + && self.fluidStorage.fluidTheatre === 'true' + && self.displayOptions.layoutControls.persistentSettings.theatre) { + self.theatreToggle(); + } + }; + + // "API" Functions + self.play = () => { + if (!self.domRef.player.paused) { + return; + } + self.playPauseToggle(); + + return true; + }; + + self.pause = () => { + if (!self.domRef.player.paused) { + self.playPauseToggle(); + } + return true; + }; + + self.skipTo = (time) => { + self.domRef.player.currentTime = time; + }; + + self.setPlaybackSpeed = (speed) => { + if (self.isCurrentlyPlayingAd) { + return; + } + self.domRef.player.playbackRate = speed; + self.fluidStorage.fluidSpeed = speed; + }; + + self.setVolume = (passedVolume) => { + self.domRef.player.volume = passedVolume; + + // If user scrolls to volume 0, we should not store 0 as + // latest volume - there is a property called "muted" already + // and storing 0 will break the toggle. + // In case user scrolls to 0 we assume last volume to be 1 + // for toggle. + const latestVolume = 0 === passedVolume ? 1 : passedVolume; + + self.latestVolume = latestVolume; + self.fluidStorage.fluidVolume = latestVolume; + }; + + /** + * @param {HTMLVideoElement} instance + */ + self.isCurrentlyPlayingVideo = (instance) => { + return instance && instance.currentTime > 0 && !instance.paused && !instance.ended && instance.readyState > 2; + }; + + self.setHtmlOnPauseBlock = (passedHtml) => { + if (typeof passedHtml != 'object' || typeof passedHtml.html == 'undefined') { + return false; + } + + const htmlBlock = self.domRef.wrapper.querySelector('.fluid_html_on_pause_container'); + + // We create the HTML block from scratch if it doesn't already exist + if (!htmlBlock) { + const containerDiv = document.createElement('div'); + containerDiv.className = 'fluid_html_on_pause'; + containerDiv.style.display = 'none'; + containerDiv.innerHTML = passedHtml.html; + containerDiv.onclick = function () { + self.playPauseToggle(); + }; + + if (passedHtml.width) { + containerDiv.style.width = passedHtml.width + 'px'; + } + + if (passedHtml.height) { + containerDiv.style.height = passedHtml.height + 'px'; + } + + self.domRef.player.parentNode.insertBefore(containerDiv, null); + return; + } + + htmlBlock.innerHTML = passedHtml.html; + + if (passedHtml.width) { + htmlBlock.style.width = passedHtml.width + 'px'; + } + + if (passedHtml.height) { + htmlBlock.style.height = passedHtml.height + 'px'; + } + }; + + self.toggleControlBar = (show) => { + const controlBar = self.domRef.wrapper.querySelector('.fluid_controls_container'); + + if (show) { + controlBar.className += ' initial_controls_show'; + return; + } + + controlBar.className = controlBar.className.replace(' initial_controls_show', ''); + }; + + self.on = (eventCall, callback) => { + /** + * Improves events by adding player info to the callbacks + * + * source | preRoll | midRoll | postRoll + */ + const getAdditionalInfo = () => ({ + mediaSourceType: self.currentMediaSourceType + }); + + const functionCall = (event, additionalEventData = {}) => { + const additionalInfo = {...getAdditionalInfo(), ...additionalEventData} + return callback(event, additionalInfo); + } + + const eventHandlers = { + play: () => self.domRef.player.addEventListener('play', functionCall), + seeked: () => self.domRef.player.addEventListener('seeked', functionCall), + ended: () => self.domRef.player.addEventListener('ended', functionCall), + pause: () => self.domRef.player.addEventListener('pause', (event) => { + if (!self.fluidPseudoPause) { + functionCall(event) + } + }), + playing: () => self.domRef.player.addEventListener('playing', functionCall), + waiting: () => self.domRef.player.addEventListener('waiting', functionCall), + theatreModeOn: () => self.domRef.player.addEventListener('theatreModeOn', functionCall), + theatreModeOff: () => self.domRef.player.addEventListener('theatreModeOff', functionCall), + timeupdate: () => self.domRef.player.addEventListener('timeupdate', (event) => { + functionCall(event, { currentTime: self.domRef.player.currentTime }); + }), + miniPlayerToggle: () => self.domRef.player.addEventListener('miniPlayerToggle', functionCall) + }; + + if (!eventHandlers[eventCall]) { + console.error(`[FP_ERROR] Event "${eventCall}" is not recognized`); + return; + } + + // Call event handler + eventHandlers[eventCall](); + }; + + self.toggleLogo = (logo) => { + if (typeof logo != 'object' || !logo.imageUrl) { + return false; + } + + const logoBlock = self.domRef.wrapper.querySelector('.fp_logo'); + + // We create the logo from scratch if it doesn't already exist, they might not give everything correctly so we + self.displayOptions.layoutControls.logo.imageUrl = (logo.imageUrl) ? logo.imageUrl : null; + self.displayOptions.layoutControls.logo.position = (logo.position) ? logo.position : 'top left'; + self.displayOptions.layoutControls.logo.clickUrl = (logo.clickUrl) ? logo.clickUrl : null; + self.displayOptions.layoutControls.logo.opacity = (logo.opacity) ? logo.opacity : 1; + self.displayOptions.layoutControls.logo.mouseOverImageUrl = (logo.mouseOverImageUrl) ? logo.mouseOverImageUrl : null; + self.displayOptions.layoutControls.logo.imageMargin = (logo.imageMargin) ? logo.imageMargin : '2px'; + self.displayOptions.layoutControls.logo.hideWithControls = (logo.hideWithControls) ? logo.hideWithControls : false; + self.displayOptions.layoutControls.logo.showOverAds = (logo.showOverAds) ? logo.showOverAds : false; + + if (logoBlock) { + logoBlock.remove(); + } + + self.initLogo(); + }; + + // this functions helps in adding event listeners for future dynamic elements + // trackEvent(document, "click", ".some_elem", callBackFunction); + self.trackEvent = (el, evt, sel, handler) => { + if (typeof self.events[sel] === 'undefined') { + self.events[sel] = {}; + } + + if (typeof self.events[sel][evt] === 'undefined') { + self.events[sel][evt] = []; + } + + self.events[sel][evt].push(handler); + self.registerListener(el, evt, sel, handler); + }; + + self.registerListener = (el, evt, sel, handler) => { + const currentElements = el.querySelectorAll(sel); + for (let i = 0; i < currentElements.length; i++) { + currentElements[i].addEventListener(evt, handler); + } + }; + + self.copyEvents = (topLevelEl) => { + for (let sel in self.events) { + if (!self.events.hasOwnProperty(sel)) { + continue; + } + + for (let evt in self.events[sel]) { + if (!self.events[sel].hasOwnProperty(evt)) { + continue; + } + + for (let i = 0; i < self.events[sel][evt].length; i++) { + self.registerListener(topLevelEl, evt, sel, self.events[sel][evt][i]); + } + } + } + }; + + /** + * Resets all display types that are not the target display mode + * + * @param {'fullScreen'|'theaterMode'|'miniPlayer'} displayTarget + */ + self.resetDisplayMode = (displayTarget) => { + if (self.fullscreenMode && displayTarget !== 'fullScreen') { + self.fullscreenToggle(); + } + + if (self.theatreMode && displayTarget !== 'theaterMode') { + self.theatreToggle(); + } + + if (self.miniPlayerToggledOn && displayTarget !== 'miniPlayer') { + self.toggleMiniPlayer('off'); + } + } + + self.destroy = () => { + self.domRef.player.classList.remove('js-fluid-player'); + const numDestructors = self.destructors.length; + + if (0 === numDestructors) { + return; + } + + self.destructors.forEach(destructor => destructor.call(self)); + + const container = self.domRef.wrapper; + + if (!container) { + console.warn('Unable to remove wrapper element for Fluid Player instance - element not found'); + return; + } + + if ('function' === typeof container.remove) { + container.remove(); + return; + } + + if (container.parentNode) { + container.parentNode.removeChild(container); + return; + } + + console.error('Unable to remove wrapper element for Fluid Player instance - no parent'); + } +}; + +/** + * Public Fluid Player API interface + * @param {FluidPlayer} instance + */ +const fluidPlayerInterface = function (instance) { + this.play = () => { + return instance.play() + }; + + this.pause = () => { + return instance.pause() + }; + + this.skipTo = (position) => { + return instance.skipTo(position) + }; + + this.setPlaybackSpeed = (speed) => { + return instance.setPlaybackSpeed(speed) + }; + + this.setVolume = (volume) => { + return instance.setVolume(volume) + }; + + this.setHtmlOnPauseBlock = (options) => { + return instance.setHtmlOnPauseBlock(options) + }; + + this.toggleControlBar = (state) => { + return instance.toggleControlBar(state) + }; + + this.toggleFullScreen = (state) => { + return instance.fullscreenToggle(state) + }; + + this.toggleMiniPlayer = (state) => { + if (state === undefined) { + state = !instance.miniPlayerToggledOn; + } + + return instance.toggleMiniPlayer(state ? 'on' : 'off', true); + }; + + this.destroy = () => { + instance.domRef.player + return instance.destroy() + }; + + this.dashInstance = () => { + return !!instance.dashPlayer ? instance.dashPlayer : null; + } + + this.hlsInstance = () => { + return !!instance.hlsPlayer ? instance.hlsPlayer : null; + } + + this.on = (event, callback) => { + return instance.on(event, callback) + }; + + this.setDebug = (value) => { + instance.displayOptions.debug = value; + } +} + +/** + * Initialize and attach Fluid Player to instance of HTMLVideoElement + * + * @param target ID of HTMLVideoElement or reference to HTMLVideoElement + * @param options Fluid Player configuration options + * @returns {fluidPlayerInterface} + */ +const fluidPlayerInitializer = function (target, options) { + const instance = new fluidPlayerClass(); + + if (!options) { + options = {}; + } + + instance.init(target, options); + + const publicInstance = new fluidPlayerInterface(instance); + + if (window && FP_DEVELOPMENT_MODE) { + const debugApi = { + id: target, + options: options, + instance: publicInstance, + internals: instance + }; + + if (typeof window.fluidPlayerDebug === 'undefined') { + window.fluidPlayerDebug = []; + } + + window.fluidPlayerDebug.push(debugApi); + + console.log('Created instance of Fluid Player. ' + + 'Debug API available at window.fluidPlayerDebug[' + (window.fluidPlayerDebug.length - 1) + '].', debugApi); + } + + return publicInstance; +} + + +if (FP_DEVELOPMENT_MODE) { + console.log('Fluid Player - Development Build' + (FP_RUNTIME_DEBUG ? ' (in debug mode)' : '')); +} + +export default fluidPlayerInitializer; diff --git a/client/fluid-player/src/index.d.ts b/client/fluid-player/src/index.d.ts new file mode 100644 index 0000000..e9e232a --- /dev/null +++ b/client/fluid-player/src/index.d.ts @@ -0,0 +1,222 @@ +declare module 'fluid-player' { + function fluidPlayer( + target: HTMLVideoElement | String | string, + options?: Partial + ): FluidPlayerInstance; + + export default fluidPlayer; +} + +declare type AdditionalEventInfo = { mediaSourceType: 'ad' | 'source' }; +declare type OnPlay = (event: 'play', callback: (additionalInfo: AdditionalEventInfo) => void) => void; +declare type OnPlaying = + (event: 'playing', callback: (event: Event, additionalInfo: AdditionalEventInfo) => void) => void; +declare type OnPause = (event: 'pause', callback: (additionalInfo: AdditionalEventInfo) => void) => void; +declare type OnEnded = (event: 'ended', callback: (additionalInfo: AdditionalEventInfo) => void) => void; +declare type OnSeeked = (event: 'seeked', callback: (additionalInfo: AdditionalEventInfo) => void) => void; +declare type OnTheaterModeOn = + (event: 'theatreModeOn', callback: (event: Event, additionalInfo: AdditionalEventInfo) => void) => void; +declare type OnTheaterModeOff = + (event: 'theatreModeOff', callback: (event: Event, additionalInfo: AdditionalEventInfo) => void) => void; +declare type OnTimeUpdate = + (event: 'timeupdate', callback: (time: number, additionalInfo: AdditionalEventInfo) => void) => void; +declare type OnMiniPlayerToggle = + (event: 'miniPlayerToggle', callback: (event: CustomEvent<{ + isToggledOn: boolean + }>, additionalInfo: AdditionalEventInfo) => void) => void; + +declare interface FluidPlayerInstance { + play: () => void; + pause: () => void; + skipTo: (seconds: number) => void; + setPlaybackSpeed: (speed: number) => void; + setVolume: (volume: number) => void; + toggleControlBar: (shouldToggle: boolean) => void; + toggleFullScreen: (shouldToggle: boolean) => void; + toggleMiniPlayer: (shouldToggle: boolean) => void; + setHtmlOnPauseBlock: (pauseBlock: { html: string; width: number; height: number; }) => void; + destroy: () => void; + dashInstance: () => any | null; + hlsInstance: () => any | null; + on: OnPlay & OnPlaying & OnPause & OnEnded & OnSeeked & OnTheaterModeOn & OnTheaterModeOff & OnTimeUpdate & + OnMiniPlayerToggle; +} + +declare interface LayoutControls { + primaryColor: false | string; + posterImage: false | string; + posterImageSize: 'auto' | 'cover' | 'contain'; + playButtonShowing: boolean; + playPauseAnimation: boolean; + fillToContainer: boolean; + autoPlay: boolean; + preload: 'none' | 'metadata' | 'auto' | string; + mute: boolean; + doubleclickFullscreen: boolean; + subtitlesEnabled: boolean; + keyboardControl: boolean; + title: string; + loop: boolean; + logo: Partial<{ + imageUrl: string | null; + position: 'top right' | 'top left' | 'bottom right' | 'bottom left'; + clickUrl: string | null; + opacity: number; + mouseOverImageUrl: string | null; + imageMargin: string; + hideWithControls: boolean; + showOverAds: boolean; + }>; + controlBar: Partial<{ + autoHide: boolean; + autoHideTimeout: number; + animated: boolean; + }>; + timelinePreview: VTTPreviewOptions | StaticPreviewOptions; + htmlOnPauseBlock: Partial<{ + html: string | null; + height: number | null; + width: number | null; + }>; + layout: 'default' | string; + allowDownload: boolean; + playbackRateEnabled: boolean; + allowTheatre: boolean; + theatreAdvanced: Partial<{ + theatreElement: string; + classToApply: string; + }>; + theatreSettings: Partial<{ + width: string; + height: string; + marginTop: number; + horizontalAlign: 'center' | 'left' | 'right'; + }>; + playerInitCallback: () => void; + persistentSettings: Partial<{ + volume: boolean; + quality: boolean; + speed: boolean; + theatre: boolean; + }>; + controlForwardBackward: Partial<{ + show: boolean; + doubleTapMobile: boolean; + }>; + contextMenu: Partial<{ + controls: boolean; + links: Array<{ + href: string; + label: string; + }>; + }>; + miniPlayer: Partial<{ + enabled: boolean; + width: number; + height: number; + widthMobile: number; + placeholderText: string; + position: 'top right' | 'top left' | 'bottom right' | 'bottom left'; + autoToggle: boolean; + }>; + showCardBoardView: boolean; + showCardBoardJoystick: boolean; +} + +declare interface VTTPreviewOptions { + file: string; + type: 'VTT'; + spriteRelativePath?: boolean; + sprite?: string; +} + +declare interface StaticPreviewOptions { + type: 'static'; + frames: Array<{ + startTime: number; + endTime: number; + image: string; + x: number; + y: number; + w: number; + h: number; + }> +} + +declare interface VastOptions { + adList: Array; + skipButtonCaption: string; + skipButtonClickCaption: string; + adText: string; + adTextPosition: 'top right' | 'top left' | 'bottom right' | 'bottom left'; + adCTAText: string | boolean; + adCTATextPosition: 'top right' | 'top left' | 'bottom right' | 'bottom left'; + adCTATextVast: boolean; + vastTimeout: number; + showPlayButton: boolean; + maxAllowedVastTagRedirects: number; + showProgressbarMarkers: boolean; + adClickable: boolean; + allowVPAID: boolean; + vastAdvanced: Partial<{ + vastLoadedCallback: () => void; + noVastVideoCallback: () => void; + vastVideoSkippedCallback: () => void; + vastVideoEndedCallback: () => void; + }>; +} + +declare interface AdOptions { + vastTag: string; + roll: string; + fallbackVastTags?: Array; + adText?: string; + adTextPosition?: 'top right' | 'top left' | 'bottom right' | 'bottom left'; + adClickable?: boolean; + vAlign?: 'top' | 'middle' | 'bottom'; + nonLinearDuration?: number; + size?: '468x60' | '300x250' | '728x90'; +} + +declare interface PreRollAdOptions extends AdOptions { + roll: 'preRoll'; +} + +declare interface MidRollAdOptions extends AdOptions { + roll: 'midRoll'; + timer: number | string; +} + +declare interface PostRollAdOptions extends AdOptions { + roll: 'postRoll'; +} + +declare interface OnPauseRollAdOptions extends AdOptions { + roll: 'onPauseRoll'; +} + +declare interface ModulesOptions { + configureHls: (options: any) => any; + onBeforeInitHls: (hls: any) => void; + onAfterInitHls: (hls: any) => void; + configureDash: (options: any) => any; + onBeforeInitDash: (dash: any) => void; + onAfterInitDash: (dash: any) => void; +} + +declare interface FluidPlayerOptions { + layoutControls: Partial; + vastOptions: Partial; + modules: Partial; + onBeforeXMLHttpRequestOpen?: (request: XMLHttpRequest) => void; + onBeforeXMLHttpRequest?: (request: XMLHttpRequest) => void; + debug?: boolean; + captions: Partial<{ + play: string; + pause: string; + mute: string; + unmute: string; + fullscreen: string; + exitFullscreen: string; + }>; +} diff --git a/client/fluid-player/src/index.js b/client/fluid-player/src/index.js new file mode 100644 index 0000000..d26f47e --- /dev/null +++ b/client/fluid-player/src/index.js @@ -0,0 +1,33 @@ + +if ('undefined' === typeof FP_HOMEPAGE) { + globalThis.FP_HOMEPAGE = 'https://fluidplayer.com'; +} + +if ('undefined' === typeof FP_BUILD_VERSION) { + globalThis.FP_BUILD_VERSION = 'v3'; +} + +if ('undefined' === typeof FP_ENV) { + const isLocalhost = globalThis + && globalThis.location + && (globalThis.location.hostname === 'localhost' + || globalThis.location.hostname === '127.0.0.1' + || globalThis.location.hostname === ''); + + if ('undefined' !== typeof process && process && process.env && process.env.NODE_ENV) { + globalThis.FP_ENV = process.env.NODE_ENV; + } else if (globalThis && !isLocalhost) { + globalThis.FP_ENV = 'production'; + } else { + globalThis.FP_ENV = 'development'; + } +} + +if ('undefined' === typeof FP_DEBUG) { + globalThis.FP_DEBUG = false; +} + +import './polyfills'; +import fluidPlayerInitializer from './fluidplayer.js'; + +export default fluidPlayerInitializer; diff --git a/client/fluid-player/src/modules/adsupport.js b/client/fluid-player/src/modules/adsupport.js new file mode 100644 index 0000000..4fb2d6a --- /dev/null +++ b/client/fluid-player/src/modules/adsupport.js @@ -0,0 +1,1751 @@ +// @ts-check + +/** + * @param {import("../fluidplayer.js").FluidPlayer} playerInstance + * @param {unknown} options + */ +function adSupport(playerInstance, options) { + const VPAID_VERSION = '2.0'; + + playerInstance.renderLinearAd = (ad, backupTheVideoTime) => { + playerInstance.toggleLoader(false); + + //get the proper ad + playerInstance.vastOptions = ad; + + if (backupTheVideoTime) { + playerInstance.backupMainVideoContentTime(ad.rollListId); + } + + const playVideoPlayer = ad => { + playerInstance.switchPlayerToVpaidMode = ad => { + playerInstance.debugMessage('starting function switchPlayerToVpaidMode'); + const vpaidIframe = "fp_" + ad.id + "_fluid_vpaid_iframe"; + const creativeData = {}; + creativeData.AdParameters = ad.adParameters; + const slotElement = document.createElement('div'); + slotElement.className = 'fluid_vpaid_slot'; + slotElement.setAttribute('adListId', ad.id); + + playerInstance.domRef.player.parentNode.insertBefore(slotElement, vpaidIframe.nextSibling); + + const environmentVars = { + slot: slotElement, + videoSlot: playerInstance.domRef.player, + videoSlotCanAutoPlay: true + }; + + // calls this functions after ad unit is loaded in iframe + const ver = playerInstance.vpaidAdUnit.handshakeVersion(VPAID_VERSION); + const compare = playerInstance.compareVersion(VPAID_VERSION, ver); + if (compare === 1) { + //VPAID version of ad is lower than we need + ad.error = true; + playerInstance.playMainVideoWhenVpaidFails(403); + return false; + } + + if (playerInstance.vastOptions.skipoffset !== false) { + playerInstance.addSkipButton(); + } + + playerInstance.domRef.player.loop = false; + playerInstance.domRef.player.removeAttribute('controls'); //Remove the default Controls + + playerInstance.vpaidCallbackListenersAttach(); + const mode = (playerInstance.fullscreenMode ? 'fullscreen' : 'normal'); + const adWidth = playerInstance.domRef.player.offsetWidth; + const adHeight = playerInstance.domRef.player.offsetHeight; + playerInstance.vpaidAdUnit.initAd(adWidth, adHeight, mode, 3000, creativeData, environmentVars); + + const progressbarContainer = playerInstance.domRef.player.parentNode.getElementsByClassName('fluid_controls_currentprogress'); + for (let i = 0; i < progressbarContainer.length; i++) { + progressbarContainer[i].style.backgroundColor = playerInstance.displayOptions.layoutControls.adProgressColor; + } + + playerInstance.toggleLoader(false); + ad.played = true; + playerInstance.adFinished = false; + }; + + playerInstance.switchPlayerToVastMode = () => { + // Get the actual duration from the video file if it is not present in the VAST XML + if (!playerInstance.vastOptions.duration) { + playerInstance.vastOptions.duration = selectedMediaFile.delivery === 'streaming' ? + Infinity : playerInstance.domRef.player.duration; + } + + if (playerInstance.displayOptions.layoutControls.showCardBoardView) { + + if (!ad.landingPage) { + playerInstance.addCTAButton(ad.clickthroughUrl); + } else { + playerInstance.addCTAButton(ad.landingPage); + } + + } else { + let idAdClickable = [undefined, true] + .includes(playerInstance.displayOptions.vastOptions.adClickable); + + if (playerInstance.rollsById[ad.rollListId].adClickable !== undefined) { + idAdClickable = playerInstance.rollsById[ad.rollListId].adClickable; + } + + if (idAdClickable) { + playerInstance.addClickthroughLayer(); + } + + playerInstance.addCTAButton(ad.landingPage); + } + + if (playerInstance.vastOptions.skipoffset !== false) { + playerInstance.addSkipButton(); + } + + playerInstance.domRef.player.loop = false; + + playerInstance.addAdCountdown(); + + playerInstance.domRef.player.removeAttribute('controls'); //Remove the default Controls + + playerInstance.vastLogoBehaviour(true); + + const progressbarContainer = playerInstance.domRef.player.parentNode.getElementsByClassName('fluid_controls_currentprogress'); + for (let i = 0; i < progressbarContainer.length; i++) { + progressbarContainer[i].style.backgroundColor = playerInstance.displayOptions.layoutControls.adProgressColor; + } + + if (playerInstance.rollsById[ad.rollListId].adText || ad.adText) { + const adTextToShow = ad.adText ? ad.adText : playerInstance.rollsById[ad.rollListId].adText; + playerInstance.addAdPlayingText(adTextToShow); + } + + playerInstance.positionTextElements(ad); + + playerInstance.toggleLoader(false); + ad.played = true; + playerInstance.adFinished = false; + playerInstance.domRef.player.play(); + + //Announce the impressions + playerInstance.trackSingleEvent('impression'); + + playerInstance.domRef.player.removeEventListener('loadedmetadata', playerInstance.switchPlayerToVastMode); + + // if in vr mode then do not show + if (playerInstance.vrMode) { + const adCountDownTimerText = playerInstance.domRef.wrapper.querySelector('.ad_countdown'); + const ctaButton = playerInstance.domRef.wrapper.querySelector('.fluid_ad_cta'); + const addAdPlayingTextOverlay = playerInstance.domRef.wrapper.querySelector('.fluid_ad_playing'); + const skipBtn = playerInstance.domRef.wrapper.querySelector('.skip_button'); + + if (adCountDownTimerText) { + adCountDownTimerText.style.display = 'none'; + } + + if (ctaButton) { + ctaButton.style.display = 'none'; + } + + if (addAdPlayingTextOverlay) { + addAdPlayingTextOverlay.style.display = 'none'; + } + + if (skipBtn) { + skipBtn.style.display = 'none'; + } + } + }; + + playerInstance.domRef.player.pause(); + + // Remove the streaming objects to prevent errors on the VAST content + playerInstance.detachStreamers(); + + // Try to load multiple + const selectedMediaFile = playerInstance.getSupportedMediaFileObject(playerInstance.vastOptions.mediaFileList); + + // if player in cardboard mode then, linear ads media type should be a '360' video + if (playerInstance.displayOptions.layoutControls.showCardBoardView && ad.mediaType !== '360') { + ad.error = true; + playerInstance.playMainVideoWhenVastFails(403); + return false; + } + + const isVpaid = playerInstance.vastOptions.vpaid; + + if (!isVpaid && selectedMediaFile.isUnsuportedHls) { + import(/* webpackChunkName: "hlsjs" */ 'hls.js').then((it) => { + window.Hls = it.default; + const hls = new Hls({ + debug: typeof FP_DEBUG !== 'undefined' && FP_DEBUG === true, + startPosition: 0, + p2pConfig: { + logLevel: false, + }, + enableWebVTT: false, + enableCEA708Captions: false, + }); + + hls.attachMedia(playerInstance.domRef.player); + hls.loadSource(selectedMediaFile.src); + playerInstance.isCurrentlyPlayingAd = true; + + playerInstance.hlsPlayer = hls; + + playerInstance.domRef.player.addEventListener('loadedmetadata', playerInstance.switchPlayerToVastMode); + playerInstance.domRef.player.addEventListener('ended', () => { + hls.detachMedia(); + hls.destroy(); + playerInstance.hlsPlayer = false; + playerInstance.onVastAdEnded(); + }); + + playerInstance.domRef.player.play(); + }); + } else if (!isVpaid) { + if (selectedMediaFile.src === false) { + // Couldn’t find MediaFile that is supported by this video player, based on the attributes of the MediaFile element. + ad.error = true; + playerInstance.playMainVideoWhenVastFails(403); + return false; + } + + playerInstance.domRef.player.addEventListener('loadedmetadata', playerInstance.switchPlayerToVastMode); + + playerInstance.domRef.player.src = selectedMediaFile.src; + playerInstance.isCurrentlyPlayingAd = true; + + if (playerInstance.displayOptions.vastOptions.showProgressbarMarkers) { + playerInstance.hideAdMarkers(); + } + + playerInstance.domRef.player.load(); + + //Handle the ending of the Pre-Roll ad + playerInstance.domRef.player.addEventListener('ended', playerInstance.onVastAdEnded); + + } else { + playerInstance.loadVpaid(ad, selectedMediaFile.src); + + if (playerInstance.displayOptions.vastOptions.showProgressbarMarkers) { + playerInstance.hideAdMarkers(); + } + } + }; + + /** + * Sends requests to the tracking URIs + */ + const videoPlayerTimeUpdate = () => { + if (playerInstance.adFinished) { + playerInstance.domRef.player.removeEventListener('timeupdate', videoPlayerTimeUpdate); + return; + } + + const currentTime = Math.floor(playerInstance.domRef.player.currentTime); + if (playerInstance.vastOptions.duration !== 0) { + playerInstance.scheduleTrackingEvent(currentTime, playerInstance.vastOptions.duration); + } + + if (currentTime >= (playerInstance.vastOptions.duration - 1) && playerInstance.vastOptions.duration !== 0) { + playerInstance.domRef.player.removeEventListener('timeupdate', videoPlayerTimeUpdate); + playerInstance.adFinished = true; + } + + }; + + playVideoPlayer(ad); + + playerInstance.domRef.player.addEventListener('timeupdate', videoPlayerTimeUpdate); + + }; + + playerInstance.playRoll = (adList) => { + // register all the ad pods + const newPods = []; + for (let i = 0; i < adList.length; i++) { + newPods.push(adList[i]); + } + playerInstance.temporaryAdPods = newPods; + + if (playerInstance.vastOptions !== null && playerInstance.vastOptions.adType.toLowerCase() === 'linear') { + return; + } + + const adToPlay = playerInstance.getNextAdPod(); + + if (adToPlay !== null) { + playerInstance.renderLinearAd(adToPlay, true); + } + + const roll = playerInstance.rollsById[adToPlay.rollListId].roll; + playerInstance.currentMediaSourceType = roll; + }; + + playerInstance.backupMainVideoContentTime = (rollListId) => { + const roll = playerInstance.rollsById[rollListId].roll; + + //spec configs by roll + switch (roll) { + case 'midRoll': + playerInstance.domRef.player.mainVideoCurrentTime = playerInstance.domRef.player.currentTime - 1; + break; + + case 'postRoll': + playerInstance.domRef.player.mainVideoCurrentTime = playerInstance.mainVideoDuration; + playerInstance.autoplayAfterAd = false; + playerInstance.domRef.player.currentTime = playerInstance.mainVideoDuration; + break; + + case 'preRoll': + if (playerInstance.domRef.player.currentTime > 0) { + playerInstance.domRef.player.mainVideoCurrentTime = playerInstance.domRef.player.currentTime - 1; + } + break; + } + }; + + playerInstance.getSupportedMediaFileObject = (mediaFiles) => { + let selectedMediaFile = null; + let adSupportedType = false; + if (mediaFiles.length) { + for (let i = 0; i < mediaFiles.length; i++) { + + if (mediaFiles[i].apiFramework !== 'VPAID') { + const supportLevel = playerInstance.getMediaFileTypeSupportLevel(mediaFiles[i]['type']); + + if (supportLevel === 'maybe' || supportLevel === 'probably') { + selectedMediaFile = mediaFiles[i]; + adSupportedType = true; + } + + //one of the best(s) option, no need to seek more + if (supportLevel === 'probably') { + break; + } + + if ( + supportLevel === 'no' && mediaFiles[i].delivery === 'streaming' && + (mediaFiles[i].type === 'application/vnd.apple.mpegurl' || mediaFiles[i].type === 'application/x-mpegURL') + ) { + selectedMediaFile = mediaFiles[i]; + selectedMediaFile.isUnsuportedHls = true; + adSupportedType = true; + } + + } else { + selectedMediaFile = mediaFiles[i]; + adSupportedType = true; + break; + } + } + } + + if (adSupportedType === false) { + return false; + } + + return selectedMediaFile; + }; + + /** + * Reports how likely it is that the current browser will be able to play media of a given MIME type. + * @return string|null "probably", "maybe", "no" or null + */ + playerInstance.getMediaFileTypeSupportLevel = (mediaType) => { + if (null === mediaType) { + return null; + } + + const tmpVideo = document.createElement('video'); + let response = tmpVideo.canPlayType(mediaType); + + return !response ? "no" : response; + }; + + playerInstance.scheduleTrackingEvent = (currentTime, duration) => { + if (currentTime === 0) { + playerInstance.trackSingleEvent('start'); + playerInstance.observe(); + playerInstance.domRef.player.timeInView = 0; + } + + // View Impression is defined by IAB as: Watching at least 2 seconds of the video where at least 50% of the ad’s pixels are visible on the screen + if (playerInstance.domRef.player.inView) { + if (playerInstance.domRef.player.timeInView > 2) { + playerInstance.trackSingleEvent('viewImpression'); + } else { + playerInstance.domRef.player.timeInView += currentTime; + } + } + + if ((typeof playerInstance.vastOptions.tracking['progress'] !== 'undefined') && + (playerInstance.vastOptions.tracking['progress'].length) && + (typeof playerInstance.vastOptions.tracking['progress'][currentTime] !== 'undefined')) { + + playerInstance.trackSingleEvent('progress', currentTime); + } + + if (currentTime === (Math.floor(duration / 4))) { + playerInstance.trackSingleEvent('firstQuartile'); + } + + if (currentTime === (Math.floor(duration / 2))) { + playerInstance.trackSingleEvent('midpoint'); + } + + if (currentTime === (Math.floor(duration * 3 / 4))) { + playerInstance.trackSingleEvent('thirdQuartile'); + } + + if (currentTime >= (duration - 1)) { + playerInstance.trackSingleEvent('complete'); + } + }; + + + // ADS + playerInstance.trackSingleEvent = (eventType, eventSubType) => { + if (typeof playerInstance.vastOptions === 'undefined' || playerInstance.vastOptions === null) { + return; + } + + let trackingUris = []; + trackingUris.length = 0; + + switch (eventType) { + case 'start': + case 'firstQuartile': + case 'midpoint': + case 'thirdQuartile': + case 'complete': + if (playerInstance.vastOptions.stopTracking[eventType] === false) { + if (playerInstance.vastOptions.tracking[eventType] !== null) { + trackingUris = playerInstance.vastOptions.tracking[eventType]; + } + + playerInstance.vastOptions.stopTracking[eventType] = true; + } + break; + + case 'progress': + playerInstance.vastOptions.tracking['progress'][eventSubType].elements.forEach(function (currentValue, index) { + if ( + (playerInstance.vastOptions.tracking['progress'][eventSubType].stopTracking === false) && + (playerInstance.vastOptions.tracking['progress'][eventSubType].elements.length) + ) { + trackingUris = playerInstance.vastOptions.tracking['progress'][eventSubType].elements; + } + + playerInstance.vastOptions.tracking['progress'][eventSubType].stopTracking = true; + }); + break; + + case 'impression': + if ( + (typeof playerInstance.vastOptions.impression !== 'undefined') && + (playerInstance.vastOptions.impression !== null) && + (typeof playerInstance.vastOptions.impression.length !== 'undefined') + ) { + trackingUris = playerInstance.vastOptions.impression; + } + break; + + case 'viewImpression': + if (playerInstance.vastOptions.stopTracking['viewImpression'] === true) { + break; + } + + if ( + (typeof playerInstance.vastOptions.viewImpression !== 'undefined') && + (playerInstance.vastOptions.viewImpression !== null) && + (typeof playerInstance.vastOptions.viewImpression.length !== 'undefined') + ) { + trackingUris = playerInstance.vastOptions.viewImpression; + playerInstance.vastOptions.stopTracking['viewImpression'] = true; + } + break; + + default: + break; + } + + playerInstance.callUris(trackingUris); + }; + + // ADS + playerInstance.completeNonLinearStatic = (ad) => { + playerInstance.closeNonLinear(ad.id); + if (playerInstance.adFinished === false) { + playerInstance.adFinished = true; + playerInstance.trackSingleEvent('complete'); + } + clearInterval(playerInstance.nonLinearTracking); + }; + + // ADS + /** + * Show up a nonLinear static creative + */ + playerInstance.createNonLinearStatic = (ad) => { + //get the proper ad + playerInstance.vastOptions = ad; + playerInstance.createBoard(ad); + if (playerInstance.rollsById[ad.rollListId].error === true || ad.error === true) { + playerInstance.announceLocalError(101); + return; + } + playerInstance.adFinished = false; + let duration = (playerInstance.rollsById[ad.rollListId].nonLinearDuration) ? playerInstance.rollsById[ad.rollListId].nonLinearDuration : false; + if (!playerInstance.vastOptions.vpaid) { + playerInstance.trackSingleEvent('start'); + duration = duration || playerInstance.vastOptions.duration; + + playerInstance.nonLinearTracking = setInterval(function () { + if (playerInstance.adFinished === true) { + return; + } + + const currentTime = Math.floor(playerInstance.domRef.player.currentTime); + playerInstance.scheduleTrackingEvent(currentTime, duration); + if (currentTime >= (duration - 1)) { + playerInstance.adFinished = true; + } + }, 400); + playerInstance.destructors.push(() => clearInterval(playerInstance.nonLinearTracking)); + } + + const time = parseInt(playerInstance.getCurrentTime()) + parseInt(duration); + playerInstance.scheduleTask({ time: time, closeStaticAd: ad, rollListId: ad.rollListId }); + }; + + // ADS + playerInstance.createVpaidNonLinearBoard = (ad) => { + // create iframe + // pass the js + + playerInstance.loadVpaidNonlinearAssets = function (ad) { + playerInstance.vastOptions = ad; + playerInstance.debugMessage('starting function switchPlayerToVpaidMode'); + + const vAlign = (ad.vAlign) ? ad.vAlign : playerInstance.nonLinearVerticalAlign; + const showCloseButton = (ad.vpaidNonLinearCloseButton) ? ad.vpaidNonLinearCloseButton : playerInstance.vpaidNonLinearCloseButton; + const vpaidIframe = "fp_" + ad.id + "_fluid_vpaid_iframe"; + const creativeData = {}; + creativeData.AdParameters = ad.adParameters; + const slotWrapper = document.createElement('div'); + slotWrapper.id = 'fluid_vpaidNonLinear_' + ad.id; + slotWrapper.className = 'fluid_vpaidNonLinear_' + vAlign; + slotWrapper.className += ' fluid_vpaidNonLinear_ad'; + slotWrapper.setAttribute('adListId', ad.id); + + // Default values in case nothing defined in VAST data or ad settings + let adWidth = Math.min(468, playerInstance.domRef.player.offsetWidth); + let adHeight = Math.min(60, Math.floor(playerInstance.domRef.player.offsetHeight / 4)); + + if (typeof ad.size !== 'undefined') { + const dimensions = ad.size.split('x'); + adWidth = dimensions[0]; + adHeight = dimensions[1]; + } else if (ad.dimension.width && ad.dimension.height) { + adWidth = ad.dimension.width; + adHeight = ad.dimension.height; + } + + slotWrapper.style.width = '100%'; + slotWrapper.style.height = adHeight + 'px'; + + let slotFrame; + if (showCloseButton) { + const slotFrame = document.createElement('div'); + slotFrame.className = 'fluid_vpaidNonLinear_frame'; + slotFrame.style.width = adWidth + 'px'; + slotFrame.style.height = adHeight + 'px'; + slotWrapper.appendChild(slotFrame); + + const closeBtn = document.createElement('div'); + closeBtn.className = 'close_button'; + closeBtn.innerHTML = ''; + closeBtn.title = playerInstance.displayOptions.layoutControls.closeButtonCaption; + const [tempadListId] = ad.id.split('_'); + closeBtn.onclick = function (event) { + + playerInstance.hardStopVpaidAd(''); + + if (typeof event.stopImmediatePropagation !== 'undefined') { + event.stopImmediatePropagation(); + } + playerInstance.adFinished = true; + + //if any other onPauseRoll then render it + if (playerInstance.rollsById[tempadListId].roll === 'onPauseRoll' && playerInstance.onPauseRollAdPods[0]) { + const getNextOnPauseRollAd = playerInstance.onPauseRollAdPods[0]; + playerInstance.createBoard(getNextOnPauseRollAd); + playerInstance.currentOnPauseRollAd = playerInstance.onPauseRollAdPods[0]; + delete playerInstance.onPauseRollAdPods[0]; + } + + return false; + }; + + slotFrame.appendChild(closeBtn); + + } + + const slotIframe = document.createElement('iframe'); + slotIframe.id = playerInstance.videoPlayerId + 'non_linear_vapid_slot_iframe'; + slotIframe.className = 'fluid_vpaid_nonlinear_slot_iframe'; + slotIframe.setAttribute('width', adWidth + 'px'); + slotIframe.setAttribute('height', adHeight + 'px'); + slotIframe.setAttribute('sandbox', 'allow-forms allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts'); + slotIframe.setAttribute('frameborder', '0'); + slotIframe.setAttribute('scrolling', 'no'); + slotIframe.setAttribute('marginwidth', '0'); + slotIframe.setAttribute('marginheight', '0'); + slotWrapper.appendChild(slotIframe); + + playerInstance.domRef.player.parentNode.insertBefore(slotWrapper, vpaidIframe.nextSibling); + + const slotElement = slotIframe.contentWindow.document.createElement('div'); + + slotIframe.contentWindow.document.body.appendChild(slotElement); + + playerInstance.vastOptions.slotIframe = slotIframe; + playerInstance.vastOptions.slotFrame = slotFrame; + + const environmentVars = { + slot: slotElement, + videoSlot: playerInstance.domRef.player, + videoSlotCanAutoPlay: true + }; + + playerInstance.debugMessage(ad); + + // calls this functions after ad unit is loaded in iframe + const ver = playerInstance.vpaidAdUnit.handshakeVersion(VPAID_VERSION); + const compare = playerInstance.compareVersion(VPAID_VERSION, ver); + if (compare === 1) { + //VPAID version of ad is lower than we need + ad.error = true; + playerInstance.playMainVideoWhenVpaidFails(403); + return false; + } + + playerInstance.domRef.player.loop = false; + playerInstance.domRef.player.removeAttribute('controls'); //Remove the default Controls + + playerInstance.vpaidCallbackListenersAttach(); + const mode = (playerInstance.fullscreenMode ? 'fullscreen' : 'normal'); + playerInstance.vpaidAdUnit.initAd(adWidth, adHeight, mode, 3000, creativeData, environmentVars); + + playerInstance.toggleLoader(false); + ad.played = true; + playerInstance.adFinished = false; + }; + + playerInstance.loadVpaid(ad, ad.staticResource); + + playerInstance.debugMessage('create non linear vpaid'); + }; + + // ADS + playerInstance.createNonLinearBoard = (ad) => { + ad.played = true; + const board = document.createElement('div'); + const vAlign = (playerInstance.rollsById[ad.rollListId].vAlign) ? playerInstance.rollsById[ad.rollListId].vAlign : playerInstance.nonLinearVerticalAlign; + + const creative = new Image(); + creative.src = ad.staticResource; + creative.id = 'fluid_nonLinear_imgCreative_' + ad.id + '_' + playerInstance.videoPlayerId; + + creative.onerror = function () { + playerInstance.rollsById[ad.rollListId].error = true; + playerInstance.announceError(500); + }; + + creative.onload = function () { + const playerWidth = playerInstance.domRef.player.clientWidth; + let origWidth; + let origHeight; + let newBannerWidth; + let newBannerHeight; + + //Set banner size based on the below priority + // 1. adList -> roll -> size + // 2. VAST XML width/height attriubute (VAST 3.) + // 3. VAST XML static resource dimension + if (typeof playerInstance.rollsById[ad.rollListId].size !== 'undefined') { + origWidth = playerInstance.rollsById[ad.rollListId].size.split('x')[0]; + origHeight = playerInstance.rollsById[ad.rollListId].size.split('x')[1]; + } else if (ad.dimension.width && ad.dimension.height) { + origWidth = ad.dimension.width; + origHeight = ad.dimension.height; + } else { + origWidth = creative.width; + origHeight = creative.height; + } + + if (origWidth > playerWidth) { + newBannerWidth = playerWidth - 5; + newBannerHeight = origHeight * newBannerWidth / origWidth; + } else { + newBannerWidth = origWidth; + newBannerHeight = origHeight; + } + + if (playerInstance.rollsById[ad.rollListId].roll !== 'onPauseRoll') { + //Show the board only if media loaded + const nonLinear = playerInstance.domRef.wrapper.querySelector('#fluid_nonLinear_' + ad.id); + + if (nonLinear) { + nonLinear.style.display = '' + } + } + + const img = playerInstance.domRef.wrapper.querySelector('#' + creative.id); + img.width = newBannerWidth; + img.height = newBannerHeight; + + playerInstance.trackSingleEvent('impression'); + }; + + board.id = 'fluid_nonLinear_' + ad.id; + board.className = 'fluid_nonLinear_' + vAlign; + board.className += ' fluid_nonLinear_ad'; + board.innerHTML = creative.outerHTML; + board.style.display = 'none'; + + //Bind the Onclick event + board.onclick = function () { + if (typeof ad.clickthroughUrl !== 'undefined') { + window.open(ad.clickthroughUrl); + } + + //Tracking the NonLinearClickTracking events + if (typeof ad.clicktracking !== 'undefined') { + playerInstance.callUris([ad.clicktracking]); + } + }; + + if (typeof ad.clickthroughUrl !== 'undefined') { + board.style.cursor = 'pointer'; + } + + const closeBtn = document.createElement('div'); + closeBtn.className = 'close_button'; + closeBtn.innerHTML = ''; + closeBtn.title = playerInstance.displayOptions.layoutControls.closeButtonCaption; + const tempRollListId = ad.rollListId; + closeBtn.onclick = function (event) { + this.parentElement.remove(); + if (typeof event.stopImmediatePropagation !== 'undefined') { + event.stopImmediatePropagation(); + } + playerInstance.adFinished = true; + clearInterval(playerInstance.nonLinearTracking); + + //if any other onPauseRoll then render it + if (playerInstance.rollsById[tempRollListId].roll === 'onPauseRoll' && playerInstance.onPauseRollAdPods[0]) { + const getNextOnPauseRollAd = playerInstance.onPauseRollAdPods[0]; + playerInstance.createBoard(getNextOnPauseRollAd); + playerInstance.currentOnPauseRollAd = playerInstance.onPauseRollAdPods[0]; + delete playerInstance.onPauseRollAdPods[0]; + } + + return false; + }; + + board.appendChild(closeBtn); + playerInstance.domRef.player.parentNode.insertBefore(board, playerInstance.domRef.player.nextSibling); + }; + + // ADS + /** + * Adds a nonLinear static Image banner + * + * currently only image/gif, image/jpeg, image/png supported + */ + playerInstance.createBoard = (ad) => { + // create nonLinear Vpaid + // create nonLinear regular + if (ad.vpaid) { + playerInstance.hardStopVpaidAd(''); + playerInstance.createVpaidNonLinearBoard(ad); + } else { + if ( + typeof ad.staticResource === 'undefined' || + playerInstance.supportedStaticTypes.indexOf(ad.creativeType) === -1 + ) { + // Couldn’t find NonLinear resource with supported type. + ad.error = true; + + if (!playerInstance.vastOptions || typeof playerInstance.vastOptions.errorUrl === 'undefined') { + playerInstance.announceLocalError(503); + } else { + playerInstance.announceError(503); + } + + return; + } + playerInstance.createNonLinearBoard(ad); + } + }; + + playerInstance.closeNonLinear = (adId) => { + const element = playerInstance.domRef.wrapper.querySelector('#fluid_nonLinear_' + adId + ', #fluid_vpaidNonLinear_' + adId); + if (element) { + element.remove(); + } + }; + + playerInstance.rollGroupContainsLinear = (groupedRolls) => { + let found = false; + for (let i = 0; i < groupedRolls.length; i++) { + if (playerInstance.rollsById[groupedRolls[i].id].adType && playerInstance.rollsById[groupedRolls[i].id].adType === 'linear') { + found = true; + break; + } + } + return found; + }; + playerInstance.rollGroupContainsNonlinear = (groupedRolls) => { + let found = false; + for (let i = 0; i < groupedRolls.length; i++) { + if (playerInstance.rollsById[groupedRolls[i].id].adType.toLowerCase() === 'nonlinear') { + found = true; + break; + } + } + return found; + }; + + playerInstance.preRollFail = () => { + const preRollsLength = playerInstance.preRollAdPodsLength; + + playerInstance.preRollVastResolved++; + + if (playerInstance.preRollVastResolved === preRollsLength) { + playerInstance.preRollAdsPlay(); + } + }; + + playerInstance.preRollSuccess = () => { + const preRollsLength = playerInstance.preRollAdPodsLength; + + playerInstance.preRollVastResolved++; + + if (playerInstance.preRollVastResolved === preRollsLength) { + playerInstance.preRollAdsPlay(); + } + }; + + playerInstance.preRollAdsPlay = () => { + const time = 0; + const rollListIds = playerInstance.preRollAdPods; + const adsByType = { + linear: [], + nonLinear: [] + }; + + playerInstance.firstPlayLaunched = true; + + for (let index = 0; index < rollListIds.length; index++) { + playerInstance.rollsById[rollListIds[index]].ads.forEach(ad => { + if (ad.played === true) { + return; + } + + if (ad.adType === 'linear') { + adsByType.linear.push(ad); + } + + if (ad.adType === 'nonLinear') { + adsByType.nonLinear.push(ad); + playerInstance.scheduleTask({time: time, playRoll: 'midRoll', rollListId: ad.rollListId }); + } + }); + + } + + if (adsByType.linear.length > 0) { + playerInstance.toggleLoader(false); + playerInstance.playRoll(adsByType.linear); + } else { + playerInstance.playMainVideoWhenVastFails(900); + } + + }; + + playerInstance.preRoll = (event) => { + const vastObj = event.vastObj; + playerInstance.domRef.player.removeEventListener(event.type, playerInstance.preRoll); + + const rollListIds = []; + rollListIds[0] = event.type.replace('adId_', ''); + const time = 0; + + if (playerInstance.rollsById[rollListIds[0]].played === true) { + return; + } + + playerInstance.preRollAdPods.push(rollListIds[0]); + + playerInstance.preRollSuccess(vastObj); + }; + + playerInstance.createAdMarker = (adListId, time) => { + const markersHolder = playerInstance.domRef.wrapper.querySelector('.fluid_controls_ad_markers_holder'); + const adMarker = document.createElement('div'); + adMarker.className = 'fluid_controls_ad_marker fluid_controls_ad_marker_' + adListId; + adMarker.dataset.adListId = adListId; + adMarker.style.left = (time / playerInstance.mainVideoDuration * 100) + '%'; + if (playerInstance.isCurrentlyPlayingAd) { + adMarker.style.display = 'none'; + } + markersHolder.appendChild(adMarker); + }; + + playerInstance.hideAdMarker = (adListId) => { + const element = playerInstance.domRef.wrapper.querySelector('fluid_controls_ad_marker_' + adListId); + if (element) { + element.style.display = 'none'; + } + }; + + playerInstance.showAdMarkers = () => { + const markersHolder = playerInstance.domRef.wrapper.querySelector('.fluid_controls_ad_markers_holder'); + const adMarkers = markersHolder.getElementsByClassName('fluid_controls_ad_marker'); + for (let i = 0; i < adMarkers.length; ++i) { + const item = adMarkers[i]; + const rollListId = item.dataset.adListId; + if (playerInstance.rollsById[rollListId].played === false) { + item.style.display = ''; + } + } + }; + + playerInstance.hideAdMarkers = () => { + const markersHolder = playerInstance.domRef.wrapper.querySelector('.fluid_controls_ad_markers_holder'); + const adMarkers = markersHolder.getElementsByClassName('fluid_controls_ad_marker'); + for (let i = 0; i < adMarkers.length; ++i) { + const item = adMarkers[i]; + item.style.display = 'none'; + } + }; + + playerInstance.midRoll = (event) => { + playerInstance.domRef.player.removeEventListener(event.type, playerInstance.midRoll); + + const rollListId = event.type.replace('adId_', ''); + if (playerInstance.rollsById[rollListId].played === true) { + return; + } + + let time = playerInstance.rollsById[rollListId].timer; + + if (typeof time == 'string' && time.indexOf("%") !== -1) { + time = time.replace('%', ''); + time = Math.floor(playerInstance.mainVideoDuration / 100 * time); + } + + if (playerInstance.displayOptions.vastOptions.showProgressbarMarkers && + playerInstance.rollsById[rollListId].adType === "nonLinear") { + playerInstance.createAdMarker(rollListId, time); + } + + playerInstance.scheduleTask({ + time: time, + playRoll: 'midRoll', + rollListId + }); + }; + + playerInstance.postRoll = (event) => { + playerInstance.domRef.player.removeEventListener(event.type, playerInstance.postRoll); + const rollListId = event.type.replace('adId_', ''); + + playerInstance.scheduleTask({ + time: Math.floor(playerInstance.mainVideoDuration), + playRoll: 'postRoll', + rollListId + }); + }; + + playerInstance.onPauseRoll = (event) => { + playerInstance.domRef.player.removeEventListener(event.type, playerInstance.onPauseRoll); + const rollListId = event.type.replace('adId_', ''); + + playerInstance.rollsById[rollListId].ads.forEach(ad => { + if (ad.adType === 'nonLinear') { + if (playerInstance.rollsById[ad.rollListId].error === true || ad.error === true) { + playerInstance.announceLocalError(101); + return; + } + + const nonLinearAdExists = playerInstance.domRef.wrapper.getElementsByClassName('fluid_nonLinear_ad')[0]; + if (!nonLinearAdExists) { + playerInstance.createBoard(ad); + playerInstance.currentOnPauseRollAd = rollListId; + let onPauseAd = ''; + for (const child of playerInstance.domRef.wrapper.children) { + if (child.id === 'fluid_nonLinear_' + rollListId) { + onPauseAd = child; + } + } + if (onPauseAd) { + onPauseAd.style.display = 'none'; + } + } else { + playerInstance.onPauseRollAdPods.push(rollListId); + } + + } + }); + }; + + /** + * Check if player has a valid nonLinear onPause Ad + */ + playerInstance.hasValidOnPauseAd = () => { + // TODO should be only one. Add validator to allow only one onPause roll + const onPauseAd = playerInstance.findRoll('onPauseRoll'); + + return ( + onPauseAd.length !== 0 && + playerInstance.rollsById[onPauseAd[0]] && + playerInstance.rollsById[onPauseAd[0]].error === false && + playerInstance.rollsById[onPauseAd[0]].ads.length && + playerInstance.rollsById[onPauseAd[0]].ads[0].error !== true + ); + }; + + /** + * Hide/show nonLinear onPause Ad + */ + playerInstance.toggleOnPauseAd = () => { + playerInstance.toggleLoader(false); + if (playerInstance.hasValidOnPauseAd() && !playerInstance.isCurrentlyPlayingAd) { + const onPauseRoll = playerInstance.findRoll('onPauseRoll'); + const ad = playerInstance.rollsById[onPauseRoll].ads[0]; + + playerInstance.vastOptions = ad; + let onPauseAd = ''; + for (const child of playerInstance.domRef.wrapper.children) { + if (child.id === 'fluid_nonLinear_' + ad.id) { + onPauseAd = child; + } + } + + if (onPauseAd && playerInstance.domRef.player.paused) { + setTimeout(function () { + onPauseAd.style.display = 'flex'; + ad.played = false; + playerInstance.trackingOnPauseNonLinearAd(ad, 'start'); + }, 500); + } else if (onPauseAd && !playerInstance.domRef.player.paused) { + onPauseAd.style.display = 'none'; + playerInstance.adFinished = true; + playerInstance.trackingOnPauseNonLinearAd(ad, 'complete'); + } + } + }; + + /** + * Helper function for tracking onPause Ads + */ + playerInstance.trackingOnPauseNonLinearAd = (ad, status) => { + if (playerInstance.rollsById[ad.rollListId].error === true || ad.error === true) { + playerInstance.announceLocalError(101); + return; + } + + playerInstance.vastOptions = ad; + playerInstance.trackSingleEvent(status); + }; + + playerInstance.getLinearAdsFromKeyTime = (keyTimeLinearObj) => { + const adListIds = []; + + for (let i = 0; i < keyTimeLinearObj.length; i++) { + if (playerInstance.rollsById[keyTimeLinearObj[i].adListId].played === false) { + adListIds.push(keyTimeLinearObj[i].adListId); + } + } + + return adListIds; + }; + + /** + * Handle scheduled tasks for a given key time + * + * @param keyTime key time in seconds + */ + playerInstance.adKeytimePlay = (keyTime) => { + if (!playerInstance.timerPool[keyTime] || playerInstance.isCurrentlyPlayingAd) { + return; + } + + const timerPoolKeytimeCloseStaticAdsLength = playerInstance.timerPool[keyTime]['closeStaticAd'].length; + const timerPoolKeytimeLinearAdsLength = playerInstance.timerPool[keyTime]['linear'].length; + const timerPoolKeytimeNonlinearAdsLength = playerInstance.timerPool[keyTime]['nonLinear'].length; + const timerPoolKeytimeLoadVastLength = playerInstance.timerPool[keyTime]['loadVast'].length; + + // remove the item from keytime if no ads to play + if ([ + timerPoolKeytimeCloseStaticAdsLength, + timerPoolKeytimeLinearAdsLength, + timerPoolKeytimeNonlinearAdsLength, + timerPoolKeytimeLoadVastLength + ].every(timerPoolLength => timerPoolLength === 0)) { + delete playerInstance.timerPool[keyTime]; + return; + } + + // Task: close nonLinear ads + if (timerPoolKeytimeCloseStaticAdsLength > 0) { + for (let index = 0; index < timerPoolKeytimeCloseStaticAdsLength; index++) { + const adToClose = playerInstance.timerPool[keyTime]['closeStaticAd'][index]; + if (adToClose.played === true) { + playerInstance.completeNonLinearStatic(adToClose); + } + } + + // empty closeStaticAd from the timerpool after closing + playerInstance.timerPool[keyTime]['closeStaticAd'] = []; + } + + // Task: play linear ads + if (timerPoolKeytimeLinearAdsLength > 0) { + if (playerInstance.timerPool[keyTime]['linear'].length > 0) { + playerInstance.playRoll(playerInstance.timerPool[keyTime]['linear']); + + // empty the linear ads from the timerpool after played + playerInstance.timerPool[keyTime]['linear'] = []; + + // return after starting video ad, so non-linear will not overlap + return; + } + } + + // Task: play nonLinear ads + if (timerPoolKeytimeNonlinearAdsLength > 0) { + for (let index = 0; index < timerPoolKeytimeNonlinearAdsLength; index++) { + const ad = playerInstance.timerPool[keyTime]['nonLinear'][index]; + const rollListId = ad.rollListId; + const vastOptions = playerInstance.adPool[rollListId]; + + // we are not supporting nonLinear ads in cardBoard mode + if (ad.played === false && !playerInstance.displayOptions.layoutControls.showCardBoardView) { + playerInstance.createNonLinearStatic(ad); + if (playerInstance.displayOptions.vastOptions.showProgressbarMarkers) { + playerInstance.hideAdMarker(rollListId); + } + + // delete nonLinear after playing + playerInstance.timerPool[keyTime]['nonLinear'].splice(index, 1); + + // return after starting non-linear ad, so multiple non-linear will not overlap + // unplayed non-linear will appear if user seeks back to the time :) + return; + } + } + } + + // Task: Load VAST on demand + if (timerPoolKeytimeLoadVastLength > 0) { + playerInstance.timerPool[keyTime]['loadVast'].forEach((roll) => { + if (roll.roll === `postRoll` && roll.voidPostRollTasks) { + // As postRoll schedules more than one task to cover the last few seconds of the video, we need to + // prevent any other loadVast task from running for that postRoll + return; + } else if (roll.roll === `postRoll`) { + roll.voidPostRollTasks = true; + } + + playerInstance.debugMessage(`Handling on-demand VAST load for roll ${roll.id}`) + playerInstance.processVastWithRetries(roll); + }); + + playerInstance.timerPool[keyTime]['loadVast'] = []; + } + }; + + playerInstance.adTimer = () => { + if (!!playerInstance.isTimer) { + return; + } + + playerInstance.isTimer = !playerInstance.isTimer; + + playerInstance.timer = setInterval( + function () { + const keyTime = Math.floor(playerInstance.getCurrentTime()); + playerInstance.adKeytimePlay(keyTime) + }, 800); + playerInstance.destructors.push(() => clearInterval(playerInstance.timer)); + }; + + /** + * Schedule tasks that need to be run with the main video timer + * + * @param {{ time: number, rollListId: any, loadVast: any }} task + */ + playerInstance.scheduleTask = (task) => { + if (task.time > playerInstance.mainVideoDuration || task.time < 0 || Number.isNaN(task.time)) { + console.warn(`Scheduled task has invalid time`, task.time, '. Check your configuration.'); + return; + } + + playerInstance.debugMessage(`Scheduling task`, task); + + if (!playerInstance.timerPool.hasOwnProperty(task.time)) { + playerInstance.timerPool[task.time] = {linear: [], nonLinear: [], closeStaticAd: [], loadVast: []}; + } + + // Handle AD rendering + if (task.rollListId) { + const roll = playerInstance.rollsById[task.rollListId]; + + roll.ads + .filter(({ adType }) => { + if (task.time === 0) { // Only non-linear should be scheduled on "preRoll" + return adType !== 'linear'; + } + + return true; + }) + .forEach(ad => { + if (task.hasOwnProperty('playRoll') && ad.adType === 'linear') { + playerInstance.timerPool[task.time]['linear'].push(ad); + } else if (task.hasOwnProperty('playRoll') && ad.adType === 'nonLinear') { + playerInstance.timerPool[task.time]['nonLinear'].push(ad); + } else if (task.hasOwnProperty('closeStaticAd')) { + playerInstance.timerPool[task.time]['closeStaticAd'].push(ad); + } + }); + } + + // Handle Loading VAST on demand + if (task.loadVast) { + playerInstance.timerPool[task.time]['loadVast'].push(task.roll) + } + }; + + /** + * Adds on demand rolls (midRoll, postRoll) to schedule + */ + playerInstance.scheduleOnDemandRolls = () => { + const midRollListIds = playerInstance.findRoll(`midRoll`) || []; + const postRollListIds = playerInstance.findRoll(`postRoll`) || []; + + [...midRollListIds, ...postRollListIds] + .map(rollListId => playerInstance.rollsById[rollListId]) + .filter(rollAd => rollAd.vastLoaded !== true && rollAd.error !== true) + .forEach(rollAd => { + // Request will have the vastTimeout time to load + if (rollAd.roll === `midRoll`) { + if (typeof rollAd.timer === 'string') { + // This can result in NaN, in that case the midRoll will simply not happen (user configuration error) + rollAd.timer = Math.floor(playerInstance.mainVideoDuration / 100 * rollAd.timer.replace('%', '')); + playerInstance.debugMessage(`Replaced midRoll from percentage to timer value ${rollAd.timer} seconds`); + } + + const time = rollAd.timer - (playerInstance.displayOptions.vastOptions.vastTimeout / 1000); + + // Handles cases where the midRoll should be loaded now, skipping the task scheduler + if (time <= Number(playerInstance.getCurrentTime())) { + playerInstance.debugMessage(`Loading Mid Roll VAST immediately as it needs to be played soon`); + playerInstance.processVastWithRetries(rollAd); + } else { + playerInstance.scheduleTask({ loadVast: true, time, roll: rollAd }) + } + } else { + const backwardScheduleTime = parseInt(playerInstance.mainVideoDuration); + const scheduleTimeAmount = (playerInstance.displayOptions.vastOptions.vastTimeout / 1000); + + // Used to prevent loading more than one of the tasks bellow + rollAd.voidPostRollTasks = false; + + for (let i = 1; i <= scheduleTimeAmount; i++) { + // Sets tasks for the last N seconds based on vastTimeout + playerInstance.scheduleTask({ loadVast: true, time: backwardScheduleTime - i, roll: rollAd }); + } + + } + }); + } + + // ADS + playerInstance.switchToMainVideo = () => { + playerInstance.debugMessage('starting main video'); + + playerInstance.domRef.player.src = playerInstance.originalSrc; + + playerInstance.currentMediaSourceType = 'source'; + + playerInstance.initialiseStreamers(); + + const newCurrentTime = (typeof playerInstance.domRef.player.mainVideoCurrentTime !== 'undefined') + ? Math.floor(playerInstance.domRef.player.mainVideoCurrentTime) : 0; + + if (playerInstance.domRef.player.hasOwnProperty('currentTime')) { + playerInstance.domRef.player.currentTime = newCurrentTime; + } + + if (playerInstance.displayOptions.layoutControls.loop) { + playerInstance.domRef.player.loop = true; + } + + playerInstance.setCurrentTimeAndPlay(newCurrentTime, playerInstance.autoplayAfterAd); + + playerInstance.isCurrentlyPlayingAd = false; + + playerInstance.deleteVastAdElements(); + + playerInstance.adFinished = true; + playerInstance.displayOptions.vastOptions.vastAdvanced.vastVideoEndedCallback(); + playerInstance.vastOptions = null; + + playerInstance.setBuffering(); + const progressbarContainer = playerInstance.domRef.wrapper.querySelector('.fluid_controls_progress_container'); + + if (progressbarContainer !== null) { + const backgroundColor = (playerInstance.displayOptions.layoutControls.primaryColor) ? playerInstance.displayOptions.layoutControls.primaryColor : "white"; + + const currentProgressBar = playerInstance.domRef.player.parentNode.getElementsByClassName('fluid_controls_currentprogress'); + + for (let i = 0; i < currentProgressBar.length; i++) { + currentProgressBar[i].style.backgroundColor = backgroundColor; + } + } + + playerInstance.domRef.player.removeEventListener('ended', playerInstance.onVastAdEnded); + + if (playerInstance.displayOptions.vastOptions.showProgressbarMarkers) { + playerInstance.showAdMarkers(); + } + + if (playerInstance.hasTitle()) { + const title = playerInstance.domRef.wrapper.querySelector('.fp_title'); + title.style.display = 'inline'; + } + }; + + // ADS + playerInstance.getNextAdPod = () => { + if (playerInstance.temporaryAdPods.length > 0) { + return playerInstance.temporaryAdPods.shift(); + } + + return null; + }; + + // ADS + playerInstance.checkForNextAd = () => { + const availableNextAdID = playerInstance.getNextAdPod(); + if (availableNextAdID === null) { + playerInstance.switchToMainVideo(); + playerInstance.vastOptions = null; + playerInstance.adFinished = true; + } else { + playerInstance.domRef.player.removeEventListener('ended', playerInstance.onVastAdEnded); + playerInstance.isCurrentlyPlayingAd = false; + playerInstance.vastOptions = null; + playerInstance.adFinished = true; + playerInstance.renderLinearAd(availableNextAdID, false); // passing false so it doesn't backup the Ad playbacktime as video playback time + } + }; + + + /** + * Adds a Skip Button + */ + playerInstance.addSkipButton = () => { + // TODO: ahh yes, the DIVbutton... + const divSkipButton = document.createElement('div'); + divSkipButton.className = 'skip_button skip_button_disabled'; + if (playerInstance.vastOptions.skipoffset > 0) { + divSkipButton.innerHTML = playerInstance.displayOptions.vastOptions.skipButtonCaption.replace('[seconds]', playerInstance.vastOptions.skipoffset); + } + + playerInstance.domRef.wrapper.appendChild(divSkipButton); + + if (playerInstance.vastOptions.skipoffset === 0) { + playerInstance.decreaseSkipOffset(); + } + + playerInstance.domRef.player.addEventListener('timeupdate', playerInstance.decreaseSkipOffset, false); + }; + + /** + * Ad Countdown + */ + playerInstance.addAdCountdown = () => { + if ((playerInstance.isCurrentlyPlayingAd && playerInstance.hlsPlayer) || playerInstance.currentVideoDuration === Infinity) { + return; // Shouldn't show countdown if ad is a video live stream + } + + const videoWrapper = playerInstance.domRef.wrapper; + const divAdCountdown = document.createElement('div'); + + // Create element + const adCountdown = playerInstance.pad(parseInt(playerInstance.currentVideoDuration / 60)) + ':' + playerInstance.pad(parseInt(playerInstance.currentVideoDuration % 60)); + const durationText = parseInt(adCountdown); + divAdCountdown.className = 'ad_countdown'; + divAdCountdown.innerHTML = "Ad - " + durationText; + + videoWrapper.appendChild(divAdCountdown); + + playerInstance.domRef.player.addEventListener('timeupdate', playerInstance.decreaseAdCountdown, false); + videoWrapper.addEventListener('mouseover', function () { + divAdCountdown.style.display = 'none'; + }, false); + }; + + playerInstance.decreaseAdCountdown = function decreaseAdCountdown() { + const sec = parseInt(playerInstance.currentVideoDuration) - parseInt(playerInstance.domRef.player.currentTime); + const btn = playerInstance.domRef.wrapper.querySelector('.ad_countdown'); + + if (btn && isNaN(sec)) { + btn.parentNode.removeChild(btn); + return; + } + + if (btn) { + btn.innerHTML = "Ad - " + playerInstance.pad(parseInt(sec / 60)) + ':' + playerInstance.pad(parseInt(sec % 60)); + } else { + playerInstance.domRef.player.removeEventListener('timeupdate', playerInstance.decreaseAdCountdown); + } + }; + + playerInstance.removeAdCountdown = () => { + const btn = playerInstance.domRef.wrapper.querySelector('.ad_countdown'); + if (btn) { + btn.parentElement.removeChild(btn); + } + }; + + playerInstance.toggleAdCountdown = (showing) => { + const btn = playerInstance.domRef.wrapper.querySelector('.ad_countdown'); + if (btn) { + if (showing) { + btn.style.display = 'inline-block'; + } else { + btn.style.display = 'none'; + } + } + }; + + playerInstance.addAdPlayingText = (textToShow) => { + const adPlayingDiv = document.createElement('div'); + + if (playerInstance.displayOptions.layoutControls.primaryColor) { + adPlayingDiv.style.backgroundColor = playerInstance.displayOptions.layoutControls.primaryColor; + adPlayingDiv.style.opacity = 1; + } + + adPlayingDiv.className = 'fluid_ad_playing'; + adPlayingDiv.innerText = textToShow; + + playerInstance.domRef.wrapper.appendChild(adPlayingDiv); + }; + + playerInstance.positionTextElements = (adListData) => { + const allowedPosition = ['top left', 'top right', 'bottom left', 'bottom right']; + + const skipButton = playerInstance.domRef.wrapper.querySelector('.skip_button'); + const adPlayingDiv = playerInstance.domRef.wrapper.querySelector('.fluid_ad_playing'); + const ctaButton = playerInstance.domRef.wrapper.querySelector('.fluid_ad_cta'); + + let ctaButtonHeightWithSpacing = 0; + let adPlayingDivHeightWithSpacing = 0; + const pixelSpacing = 8; + let isBottom = false; + let skipButtonHeightWithSpacing = 0; + let positionsCTA = []; + + const defaultPositions = { + top: { + left: { h: 34, v: 34 }, + right: { h: 0, v: 34 }, + }, + bottom: { + left: { h: 34, v: 50 }, + right: { h: 0, v: 50 }, + } + }; + + if (skipButton !== null) { + skipButtonHeightWithSpacing = skipButton.offsetHeight + pixelSpacing; + + const wrapperElement = playerInstance.domRef.wrapper; + + if (wrapperElement.classList.contains('mobile')) { + defaultPositions.top = { + left: { h: 0, v: 8 }, + right: { h: 0, v: 8 }, + } + defaultPositions.bottom = { + left: { h: 0, v: 50 }, + right: { h: 0, v: 50 }, + } + } + } + + let CTATextPosition; + if (ctaButton !== null) { + CTATextPosition = playerInstance.rollsById[adListData.rollListId].adCTATextPosition ? + playerInstance.rollsById[adListData.rollListId].adCTATextPosition.toLowerCase() : + playerInstance.displayOptions.vastOptions.adCTATextPosition; + + if (allowedPosition.indexOf(CTATextPosition) === -1) { + console.log('[FP Error] Invalid position for CTAText. Reverting to "bottom right"'); + CTATextPosition = 'bottom right'; + } + + ctaButton.classList.add.apply(ctaButton.classList, CTATextPosition.split(' ')); + + positionsCTA = CTATextPosition.split(' '); + + isBottom = positionsCTA[0] === 'bottom'; + + ctaButton.style[positionsCTA[0]] = defaultPositions[positionsCTA[0]][positionsCTA[1]].v + 'px'; + ctaButton.style[positionsCTA[1]] = defaultPositions[positionsCTA[0]][positionsCTA[1]].h + 'px'; + + if (isBottom && positionsCTA[1] === 'right') { + ctaButton.style[positionsCTA[0]] = defaultPositions[positionsCTA[0]][positionsCTA[1]].v + skipButtonHeightWithSpacing + 'px'; + } + + ctaButtonHeightWithSpacing = ctaButton.offsetHeight + pixelSpacing + 'px'; + } + + let adPlayingDivPosition; + let positionsAdText; + if (adPlayingDiv !== null) { + adPlayingDivPosition = playerInstance.rollsById[adListData.rollListId].adTextPosition ? + playerInstance.rollsById[adListData.rollListId].adTextPosition.toLowerCase() : + playerInstance.displayOptions.vastOptions.adTextPosition; + + if (allowedPosition.indexOf(adPlayingDivPosition) === -1) { + console.log('[FP Error] Invalid position for adText. Reverting to "top left"'); + adPlayingDivPosition = 'top left'; + } + + positionsAdText = adPlayingDivPosition.split(' '); + adPlayingDiv.style[positionsAdText[0]] = defaultPositions[positionsAdText[0]][positionsAdText[1]].v + 'px'; + adPlayingDiv.style[positionsAdText[1]] = defaultPositions[positionsAdText[0]][positionsAdText[1]].h + 'px'; + adPlayingDivHeightWithSpacing = adPlayingDiv.offsetHeight + pixelSpacing + 'px'; + } + + if (ctaButtonHeightWithSpacing > 0 && adPlayingDivHeightWithSpacing > 0 && CTATextPosition === adPlayingDivPosition) { + if (isBottom) { + if (positionsCTA[1] === 'right') { + adPlayingDiv.style.bottom = defaultPositions[positionsAdText[0]][positionsAdText[1]].v + skipButtonHeightWithSpacing + ctaButtonHeightWithSpacing + 'px'; + } else { + adPlayingDiv.style.bottom = defaultPositions[positionsAdText[0]][positionsAdText[1]].v + ctaButtonHeightWithSpacing + 'px'; + } + } else { + ctaButton.style.top = defaultPositions[positionsCTA[0]][positionsCTA[1]].v + adPlayingDivHeightWithSpacing + 'px'; + } + } + }; + + playerInstance.removeAdPlayingText = () => { + const div = playerInstance.domRef.wrapper.querySelector('.fluid_ad_playing'); + if (!div) { + return; + } + div.parentElement.removeChild(div); + }; + + /** + * Adds CTA button from VAST, with fallback to IconClickTrough + * + * @param {string} landingPage + */ + playerInstance.addCTAButton = (landingPage) => { + if (playerInstance.vastOptions.titleCTA) { + const { text, link, tracking } = playerInstance.vastOptions.titleCTA; + return playerInstance.createAndAppendCTAButton(text, link, tracking); + } + + if (landingPage && typeof playerInstance.displayOptions.vastOptions.adCTAText === 'string') { + return playerInstance.createAndAppendCTAButton( + playerInstance.displayOptions.vastOptions.adCTAText, + landingPage, + playerInstance.vastOptions.clickthroughUrl + ); + } + }; + + /** + * Creates and append CTA button given the input parameters + * + * @param {string} adCTAText + * + * @param {string} displayUrl + * + * @param {string} trackingUrl + */ + playerInstance.createAndAppendCTAButton = (adCTAText, displayUrl, trackingUrl) => { + const ctaButton = document.createElement('div'); + ctaButton.className = 'fluid_ad_cta'; + + const link = document.createElement('span'); + let innerHTML = adCTAText; + + if (displayUrl) { + innerHTML += "
" + displayUrl + "" + } + + link.innerHTML = innerHTML; + + ctaButton.addEventListener('click', () => { + if (!playerInstance.domRef.player.paused) { + playerInstance.domRef.player.pause(); + } + + const win = window.open(trackingUrl, '_blank'); + win.focus(); + return true; + }, false); + + ctaButton.appendChild(link); + + playerInstance.domRef.wrapper.appendChild(ctaButton); + }; + + playerInstance.removeCTAButton = () => { + const btn = playerInstance.domRef.wrapper.querySelector('.fluid_ad_cta'); + if (!btn) { + return; + } + + btn.parentElement.removeChild(btn); + }; + + playerInstance.decreaseSkipOffset = () => { + if (typeof playerInstance.vastOptions === 'undefined' || playerInstance.vastOptions === null) { + return; + } + let sec = playerInstance.vastOptions.skipoffset - Math.floor(playerInstance.domRef.player.currentTime); + const btn = playerInstance.domRef.wrapper.querySelector('.skip_button'); + + if (!btn) { + playerInstance.domRef.player.removeEventListener('timeupdate', playerInstance.decreaseSkipOffset); + return; + } + + if (sec >= 1) { + //set the button label with the remaining seconds + btn.innerHTML = playerInstance.displayOptions.vastOptions.skipButtonCaption.replace('[seconds]', sec); + return; + } + + // TODO: refactored, but this is still terrible - remove all this and just make the button clickable... + const skipLink = document.createElement('a'); + skipLink.href = '#'; + skipLink.className = 'js-skipHref'; + skipLink.innerHTML = playerInstance.displayOptions.vastOptions.skipButtonClickCaption; + skipLink.onclick = (e) => { + e.preventDefault(); + e.stopPropagation(); + playerInstance.pressSkipButton(); + }; + + btn.innerHTML = ''; + btn.appendChild(skipLink); + + //removes the CSS class for a disabled button + btn.className = btn.className.replace(/\bskip_button_disabled\b/, ''); + + playerInstance.domRef.player.removeEventListener('timeupdate', playerInstance.decreaseSkipOffset); + }; + + playerInstance.pressSkipButton = () => { + playerInstance.removeSkipButton(); + playerInstance.removeAdPlayingText(); + playerInstance.removeCTAButton(); + + if (playerInstance.vastOptions.vpaid) { + // skip the linear vpaid ad + playerInstance.skipVpaidAd(); + return; + } + + // skip the regular linear vast + playerInstance.displayOptions.vastOptions.vastAdvanced.vastVideoSkippedCallback(); + const event = document.createEvent('Event'); + event.initEvent('ended', false, true); + playerInstance.domRef.player.dispatchEvent(event); + }; + + playerInstance.removeSkipButton = () => { + const btn = playerInstance.domRef.wrapper.querySelector('.skip_button'); + if (btn) { + btn.parentElement.removeChild(btn); + } + }; + + /** + * Makes the player open the ad URL on clicking + */ + playerInstance.addClickthroughLayer = () => { + const divWrapper = playerInstance.domRef.wrapper; + + const divClickThrough = document.createElement('div'); + divClickThrough.className = 'vast_clickthrough_layer'; + divClickThrough.setAttribute( + 'style', + 'position: absolute; cursor: pointer; top: 0; left: 0; width: ' + + playerInstance.domRef.player.offsetWidth + 'px; height: ' + + (playerInstance.domRef.player.offsetHeight) + 'px;' + ); + + divWrapper.appendChild(divClickThrough); + + //Bind the Onclick event + const openClickthrough = function () { + window.open(playerInstance.vastOptions.clickthroughUrl); + + //Tracking the Clickthorugh events + if (typeof playerInstance.vastOptions.clicktracking !== 'undefined') { + playerInstance.callUris(playerInstance.vastOptions.clicktracking); + } + }; + + const clickthroughLayer = playerInstance.domRef.wrapper.querySelector('.vast_clickthrough_layer'); + const isIos9orLower = (playerInstance.mobileInfo.device === 'iPhone') && (playerInstance.mobileInfo.userOsMajor !== false) && (playerInstance.mobileInfo.userOsMajor <= 9); + + clickthroughLayer.onclick = () => { + if (playerInstance.domRef.player.paused) { + //On Mobile Safari on iPhones with iOS 9 or lower open the clickthrough only once + if (isIos9orLower && !playerInstance.suppressClickthrough) { + openClickthrough(); + playerInstance.suppressClickthrough = true; + + } else { + playerInstance.domRef.player.play(); + } + + } else { + openClickthrough(); + playerInstance.domRef.player.pause(); + } + }; + }; + + /** + * Remove the Clickthrough layer + */ + playerInstance.removeClickthrough = () => { + const clickthroughLayer = playerInstance.domRef.wrapper.querySelector('.vast_clickthrough_layer'); + + if (clickthroughLayer) { + clickthroughLayer.parentNode.removeChild(clickthroughLayer); + } + }; +} + +export default adSupport diff --git a/client/fluid-player/src/modules/cardboard.js b/client/fluid-player/src/modules/cardboard.js new file mode 100644 index 0000000..a528c4e --- /dev/null +++ b/client/fluid-player/src/modules/cardboard.js @@ -0,0 +1,343 @@ +export default function (playerInstance, options) { + playerInstance.createCardboardJoystickButton = (identity) => { + const vrJoystickPanel = playerInstance.domRef.wrapper.querySelector('.fluid_vr_joystick_panel'); + const joystickButton = document.createElement('div'); + + joystickButton.className = 'fluid_vr_button fluid_vr_joystick_' + identity; + vrJoystickPanel.appendChild(joystickButton); + + return joystickButton; + }; + + playerInstance.cardboardRotateLeftRight = (param /* 0 - right, 1 - left */) => { + const go = playerInstance.vrROTATION_POSITION; + const back = -playerInstance.vrROTATION_POSITION; + const pos = param < 1 ? go : back; + const easing = {val: pos}; + const tween = new TWEEN.Tween(easing) + .to({val: 0}, playerInstance.vrROTATION_SPEED) + .easing(TWEEN.Easing.Quadratic.InOut) + .onUpdate(function () { + playerInstance.vrViewer.OrbitControls.rotateLeft(easing.val) + }).start(); + }; + + playerInstance.cardboardRotateUpDown = (param /* 0 - down, 1- up */) => { + const go = playerInstance.vrROTATION_POSITION; + const back = -playerInstance.vrROTATION_POSITION; + const pos = param < 1 ? go : back; + const easing = {val: pos}; + const tween = new TWEEN.Tween(easing) + .to({val: 0}, playerInstance.vrROTATION_SPEED) + .easing(TWEEN.Easing.Quadratic.InOut) + .onUpdate(function () { + playerInstance.vrViewer.OrbitControls.rotateUp(easing.val) + }).start(); + }; + + playerInstance.createCardboardJoystick = () => { + const vrContainer = playerInstance.domRef.wrapper.querySelector('.fluid_vr_container'); + + // Create a JoyStick and append to VR container + const vrJoystickPanel = document.createElement('div'); + vrJoystickPanel.className = 'fluid_vr_joystick_panel'; + vrContainer.appendChild(vrJoystickPanel); + + // Create Joystick buttons + const upButton = playerInstance.createCardboardJoystickButton('up'); + const leftButton = playerInstance.createCardboardJoystickButton('left'); + const rightButton = playerInstance.createCardboardJoystickButton('right'); + const downButton = playerInstance.createCardboardJoystickButton('down'); + const zoomDefaultButton = playerInstance.createCardboardJoystickButton('zoomdefault'); + const zoomInButton = playerInstance.createCardboardJoystickButton('zoomin'); + const zoomOutButton = playerInstance.createCardboardJoystickButton('zoomout'); + + // Camera movement buttons + upButton.addEventListener('click', function () { + //player.vrViewer.OrbitControls.rotateUp(-0.1); + playerInstance.cardboardRotateUpDown(1); + }); + + downButton.addEventListener('click', function () { + //player.vrViewer.OrbitControls.rotateUp(0.1); + playerInstance.cardboardRotateUpDown(0); + }); + + rightButton.addEventListener('click', function () { + //player.vrViewer.OrbitControls.rotateLeft(0.1); + playerInstance.cardboardRotateLeftRight(0); + }); + + leftButton.addEventListener('click', function () { + //player.vrViewer.OrbitControls.rotateLeft(-0.1); + playerInstance.cardboardRotateLeftRight(1); + }); + + zoomDefaultButton.addEventListener('click', function () { + playerInstance.vrViewer.camera.fov = 60; + playerInstance.vrViewer.camera.updateProjectionMatrix(); + }); + + // Camera Zoom buttons + zoomOutButton.addEventListener('click', function () { + playerInstance.vrViewer.camera.fov *= 1.1; + playerInstance.vrViewer.camera.updateProjectionMatrix(); + }); + + zoomInButton.addEventListener('click', function () { + playerInstance.vrViewer.camera.fov *= 0.9; + playerInstance.vrViewer.camera.updateProjectionMatrix(); + }); + + }; + + playerInstance.cardBoardResize = () => { + playerInstance.domRef.player.removeEventListener('theatreModeOn', handleWindowResize); + playerInstance.domRef.player.addEventListener('theatreModeOn', handleWindowResize); + + playerInstance.domRef.player.removeEventListener('theatreModeOff', handleWindowResize); + playerInstance.domRef.player.addEventListener('theatreModeOff', handleWindowResize); + }; + + function handleWindowResize() { + playerInstance.vrViewer.onWindowResize(); + } + + playerInstance.cardBoardSwitchToNormal = () => { + const vrJoystickPanel = playerInstance.domRef.wrapper.querySelector('.fluid_vr_joystick_panel'); + const controlBar = playerInstance.domRef.wrapper.querySelector('.fluid_controls_container') + const videoPlayerTag = playerInstance.domRef.player; + + playerInstance.vrViewer.enableEffect(PANOLENS.MODES.NORMAL); + playerInstance.vrViewer.onWindowResize(); + playerInstance.vrMode = false; + + // remove dual control bar + const newControlBar = videoPlayerTag.parentNode.getElementsByClassName('fluid_vr2_controls_container')[0]; + videoPlayerTag.parentNode.removeChild(newControlBar); + + if (playerInstance.displayOptions.layoutControls.showCardBoardJoystick && vrJoystickPanel) { + vrJoystickPanel.style.display = "block"; + } + controlBar.classList.remove("fluid_vr_controls_container"); + + // show volume control bar + const volumeContainer = playerInstance.domRef.wrapper.getElementById('.fluid_control_volume_container'); + volumeContainer.style.display = "block"; + + // show all ads overlays if any + const adCountDownTimerText = playerInstance.domRef.wrapper.querySelector('.ad_countdown'); + const ctaButton = playerInstance.domRef.wrapper.querySelector('.fluid_ad_cta'); + const addAdPlayingTextOverlay = playerInstance.domRef.wrapper.querySelector('.fluid_ad_playing'); + const skipBtn = playerInstance.domRef.wrapper.querySelector('.skip_button'); + + if (adCountDownTimerText) { + adCountDownTimerText.style.display = 'block'; + } + + if (ctaButton) { + ctaButton.style.display = 'block'; + } + + if (addAdPlayingTextOverlay) { + addAdPlayingTextOverlay.style.display = 'block'; + } + + if (skipBtn) { + skipBtn.style.display = 'block'; + } + }; + + playerInstance.cardBoardHideDefaultControls = () => { + const vrJoystickPanel = playerInstance.domRef.wrapper.querySelector('.fluid_vr_joystick_panel'); + const initialPlay = playerInstance.domRef.wrapper.querySelector('.fluid_initial_play'); + const volumeContainer = playerInstance.domRef.wrapper.querySelector('.fluid_control_volume_container'); + + // hide the joystick in VR mode + if (playerInstance.displayOptions.layoutControls.showCardBoardJoystick && vrJoystickPanel) { + vrJoystickPanel.style.display = "none"; + } + + // hide big play icon + if (initialPlay) { + playerInstance.domRef.wrapper.querySelector('.fluid_initial_play').style.display = "none"; + playerInstance.domRef.wrapper.querySelector('.fluid_initial_play_button_container').style.opacity = "1"; + } + + // hide volume control bar + volumeContainer.style.display = "none"; + + }; + + playerInstance.cardBoardCreateVRControls = () => { + const controlBar = playerInstance.domRef.wrapper.querySelector('.fluid_controls_container') + + // create and append dual control bar + const newControlBar = controlBar.cloneNode(true); + newControlBar.removeAttribute('id'); + newControlBar.querySelectorAll('*').forEach(function (node) { + node.removeAttribute('id'); + }); + + newControlBar.classList.add("fluid_vr2_controls_container"); + playerInstance.domRef.player.parentNode.insertBefore(newControlBar, playerInstance.domRef.player.nextSibling); + playerInstance.copyEvents(newControlBar); + }; + + playerInstance.cardBoardSwitchToVR = () => { + const controlBar = playerInstance.domRef.wrapper.querySelector('.fluid_controls_container') + + playerInstance.vrViewer.enableEffect(PANOLENS.MODES.CARDBOARD); + + playerInstance.vrViewer.onWindowResize(); + playerInstance.vrViewer.disableReticleControl(); + + playerInstance.vrMode = true; + + controlBar.classList.add("fluid_vr_controls_container"); + + playerInstance.cardBoardHideDefaultControls(); + playerInstance.cardBoardCreateVRControls(); + + // hide all ads overlays + const adCountDownTimerText = playerInstance.domRef.wrapper.querySelector('.ad_countdown'); + const ctaButton = playerInstance.domRef.wrapper.querySelector('.fluid_ad_cta'); + const addAdPlayingTextOverlay = playerInstance.domRef.wrapper.querySelector('.fluid_ad_playing'); + const skipBtn = playerInstance.domRef.wrapper.querySelector('.skip_button'); + + if (adCountDownTimerText) { + adCountDownTimerText.style.display = 'none'; + } + + if (ctaButton) { + ctaButton.style.display = 'none'; + } + + if (addAdPlayingTextOverlay) { + addAdPlayingTextOverlay.style.display = 'none'; + } + + if (skipBtn) { + skipBtn.style.display = 'none'; + } + + }; + + playerInstance.cardBoardMoveTimeInfo = () => { + const timePlaceholder = playerInstance.domRef.wrapper.querySelector('.fluid_control_duration'); + const controlBar = playerInstance.domRef.wrapper.querySelector('.fluid_controls_container') + + timePlaceholder.classList.add("cardboard_time"); + controlBar.appendChild(timePlaceholder); + + // override the time display function for this instance + playerInstance.controlDurationUpdate = function () { + + const currentPlayTime = playerInstance.formatTime(playerInstance.domRef.player.currentTime); + const totalTime = playerInstance.formatTime(playerInstance.currentVideoDuration); + const timePlaceholder = playerInstance.domRef.player.parentNode.getElementsByClassName('fluid_control_duration'); + + let durationText = ''; + + if (playerInstance.isCurrentlyPlayingAd) { + durationText = "AD : " + currentPlayTime + ' / ' + totalTime; + + for (let i = 0; i < timePlaceholder.length; i++) { + timePlaceholder[i].classList.add("ad_timer_prefix"); + } + + } else { + durationText = currentPlayTime + ' / ' + totalTime; + + for (let i = 0; i < timePlaceholder.length; i++) { + timePlaceholder[i].classList.remove("ad_timer_prefix"); + } + } + + for (let i = 0; i < timePlaceholder.length; i++) { + timePlaceholder[i].innerHTML = durationText; + } + } + }; + + playerInstance.cardBoardAlterDefaultControls = () => { + playerInstance.cardBoardMoveTimeInfo(); + }; + + playerInstance.createCardboardView = () => { + // Create a container for 360degree + const vrContainer = document.createElement('div'); + vrContainer.className = 'fluid_vr_container'; + playerInstance.domRef.player.parentNode.insertBefore(vrContainer, playerInstance.domRef.player.nextSibling); + + // OverRide some conflicting functions from panolens + PANOLENS.VideoPanorama.prototype.pauseVideo = function () { + }; + PANOLENS.VideoPanorama.prototype.playVideo = function () { + }; + + playerInstance.vrPanorama = new PANOLENS.VideoPanorama('', { + videoElement: playerInstance.domRef.player, + autoplay: playerInstance.displayOptions.layoutControls.autoPlay, + loop: !!playerInstance.displayOptions.layoutControls.loop + }); + + playerInstance.vrViewer = new PANOLENS.Viewer({ + container: vrContainer, + controlBar: true, + controlButtons: [], + enableReticle: false + }); + playerInstance.vrViewer.add(playerInstance.vrPanorama); + + playerInstance.vrViewer.enableEffect(PANOLENS.MODES.NORMAL); + playerInstance.vrViewer.onWindowResize(); + + // if Mobile device then enable controls using gyroscope + if (playerInstance.getMobileOs().userOs === 'Android' || playerInstance.getMobileOs().userOs === 'iOS') { + playerInstance.vrViewer.enableControl(1); + } + + // Make Changes for default skin + playerInstance.cardBoardAlterDefaultControls(); + + // resize on toggle theater mode + playerInstance.cardBoardResize(); + + // Store initial camera position + playerInstance.vrViewer.initialCameraPosition = JSON.parse(JSON.stringify(playerInstance.vrViewer.camera.position)); + + if (playerInstance.displayOptions.layoutControls.showCardBoardJoystick) { + if (!(playerInstance.getMobileOs().userOs === 'Android' || playerInstance.getMobileOs().userOs === 'iOS')) { + playerInstance.createCardboardJoystick(); + } + // Disable zoom if showing joystick + playerInstance.vrViewer.OrbitControls.noZoom = true; + } + + playerInstance.trackEvent(playerInstance.domRef.player.parentNode, 'click', '.fluid_control_cardboard', function () { + if (playerInstance.vrMode) { + playerInstance.cardBoardSwitchToNormal(); + } else { + playerInstance.cardBoardSwitchToVR(); + } + }); + }; + + playerInstance.createCardboard = () => { + if (!playerInstance.displayOptions.layoutControls.showCardBoardView) { + return; + } + + playerInstance.domRef.wrapper.querySelector('.fluid_control_cardboard').style.display = 'inline-block'; + + if (!window.PANOLENS) { + import(/* webpackChunkName: "panolens" */ 'panolens').then((it) => { + window.PANOLENS = it; + playerInstance.createCardboardView(); + }); + } else { + playerInstance.createCardboardView(); + } + }; +} diff --git a/client/fluid-player/src/modules/miniplayer.js b/client/fluid-player/src/modules/miniplayer.js new file mode 100644 index 0000000..8c99c6f --- /dev/null +++ b/client/fluid-player/src/modules/miniplayer.js @@ -0,0 +1,385 @@ +export default function (playerInstance) { + // Module constants + const MINIMUM_WIDTH = 400; // Pixels + const MINIMUM_HEIGHT = 225; // Pixels + const MINIMUM_WIDTH_MOBILE = 40; // Percentage + const TOGGLE_BY_VISIBILITY_DETECTION_RATE = 1000 / 60; // ms + + const DISABLE_MINI_PLAYER_MOBILE_ANIMATION_CLAMP = 50; + const DISABLE_MINI_PLAYER_MOBILE_ANIMATION_DEADZONE = 5; + + const DESKTOP_ONLY_MEDIA_QUERY = '(max-width: 768px)'; + + const FLUID_PLAYER_WRAPPER_CLASS = 'fluid_mini_player_mode'; + const CLOSE_BUTTON_WRAPPER_CLASS = 'mini-player-close-button-wrapper'; + const CLOSE_BUTTON_CLASS = 'mini-player-close-button'; + const PLACEHOLDER_CLASS = 'fluidplayer-miniplayer-player-placeholder' + const DISABLE_MINI_PLAYER_MOBILE_CLASS = 'disable-mini-player-mobile'; + + const LINEAR_CLICKTHROUGH_SELECTOR = '.vast_clickthrough_layer'; + const NON_LINEAR_SELECTOR = '.fluid_nonLinear_ad img, .fluid_vpaid_nonlinear_slot_iframe'; + const VPAID_FRAME_SELECTOR = '.fluid_vpaidNonLinear_frame'; + + const MINI_PLAYER_TOGGLE_EVENT = 'miniPlayerToggle'; + + // Module variables + let originalWidth = null; + let originalHeight = null; + let originalNonLinearWidth = null + let originalNonLinearHeight = null; + let isSetup = false; + /** @type null | Element */ + let placeholderElement = null; + let isMobile = false; + /** @type boolean */ + let toggleByVisibilityControl = false; + + /** + * Toggles the MiniPlayer given that it's enabled. Resets all other display modes. + * + * @param {'on'|'off'} [forceToggle] + * @param {boolean} manualToggle + */ + function toggleMiniPlayer(forceToggle, manualToggle = false) { + playerInstance.debugMessage(`[MiniPlayer] Toggling MiniPlayer, forceToggle: ${forceToggle}`); + + const miniPlayerOptions = playerInstance.displayOptions.layoutControls.miniPlayer; + + if (!miniPlayerOptions.enabled) { + playerInstance.debugMessage(`[MiniPlayer] Prevent toggle MiniPlayer, it's currently disabled`); + return; + } + + if ((forceToggle === 'on' && playerInstance.miniPlayerToggledOn) || (forceToggle === 'off' && !playerInstance.miniPlayerToggledOn)) { + playerInstance.debugMessage(`[MiniPlayer] Can't force toggle Mini Player to it's same state`); + return; + } + + if (manualToggle) { + toggleScreenDetection(); + } + + if (window.matchMedia(DESKTOP_ONLY_MEDIA_QUERY).matches) { + isMobile = true; + } + + // Important as the player can be in full screen or theater mode + playerInstance.resetDisplayMode('miniPlayer'); + + if (!isSetup) { + // Setups JIT to avoid extra processing + setupMiniPlayer(); + } + + if (forceToggle === 'off' || playerInstance.miniPlayerToggledOn) { + toggleMiniPlayerOff(); + } else if (forceToggle === 'on' || !playerInstance.miniPlayerToggledOn) { + toggleMiniPlayerOn(miniPlayerOptions.width, miniPlayerOptions.height, miniPlayerOptions.widthMobile, miniPlayerOptions.position); + } + } + + /** + * Setups custom Mini Player DOM + */ + function setupMiniPlayer() { + const hasCloseButton = Boolean(playerInstance.domRef.player.parentNode.querySelector(`.${CLOSE_BUTTON_CLASS}`)); + + if (!hasCloseButton) { + const closeButtonWrapper = document.createElement('div'); + closeButtonWrapper.classList.add(CLOSE_BUTTON_WRAPPER_CLASS); + + const closeButton = document.createElement('span'); + closeButton.classList.add(CLOSE_BUTTON_CLASS); + closeButton.addEventListener('click', () => { + toggleMiniPlayer('off', true); + + if (!playerInstance.domRef.player.paused) { + playerInstance.playPauseToggle(); + } + }); + + closeButtonWrapper.appendChild(closeButton); + playerInstance.domRef.player.parentNode.append(closeButtonWrapper); + } + + if (isMobile) { + setupMobile(); + } + + isSetup = true; + } + + /** + * Toggles the MiniPlayer off and restores previous functionality to player + */ + function toggleMiniPlayerOff() { + const videoWrapper = playerInstance.domRef.wrapper; + + removePlayerPlaceholder(); + + videoWrapper.classList.remove(FLUID_PLAYER_WRAPPER_CLASS); + videoWrapper.style.width = `${originalWidth}px`; + videoWrapper.style.height = `${originalHeight}px`; + + originalWidth = null; + originalHeight = null; + + adaptNonLinearSize(); + adaptLinearSize(); + playerInstance.miniPlayerToggledOn = false; + emitToggleEvent(); + } + + /** + * Toggles the MiniPlayer on, stores the original size of the player. + * + * @param {number} width + * @param {number} height + * @param {number} mobileWidth + * @param {'top left'|'top right'|'bottom left'|'bottom right'} position + */ + function toggleMiniPlayerOn(width, height, mobileWidth, position) { + const videoWrapper = playerInstance.domRef.wrapper; + const targetWidth = width > MINIMUM_WIDTH ? width : MINIMUM_WIDTH; + const targetHeight = height > MINIMUM_HEIGHT ? height : MINIMUM_HEIGHT; + const targetMobileWidth = mobileWidth > MINIMUM_WIDTH_MOBILE ? mobileWidth : MINIMUM_WIDTH_MOBILE; + + originalWidth = extractSizeFromElement(videoWrapper, 'width', 'clientWidth'); + originalHeight = extractSizeFromElement(videoWrapper, 'height', 'clientHeight'); + + videoWrapper.classList.add( + FLUID_PLAYER_WRAPPER_CLASS, + `${FLUID_PLAYER_WRAPPER_CLASS}--${position.trim().replace(/\s/, '-')}` + ); + + if (!isMobile) { + videoWrapper.style.width = `${targetWidth}px`; + videoWrapper.style.height = `${targetHeight}px`; + } else { + videoWrapper.style.width = `${targetMobileWidth}vw`; + videoWrapper.style.height = `auto`; + videoWrapper.style.aspectRatio = `16 / 9`; + } + + createPlayerPlaceholder(originalWidth, originalHeight); + adaptNonLinearSize(targetWidth, targetHeight, targetMobileWidth); + adaptLinearSize(); + playerInstance.miniPlayerToggledOn = true; + emitToggleEvent(); + } + + /** + * Emits event to Fluid Player Event API + */ + function emitToggleEvent() { + playerInstance.domRef.player.dispatchEvent( + new CustomEvent(MINI_PLAYER_TOGGLE_EVENT, { detail: { isToggledOn: playerInstance.miniPlayerToggledOn } }) + ); + } + + /** + * Extracts size from an element checking multiple element properties + * + * @param {HTMLElement} element + * @param {'width'|'height'|null} styleProperty + * @param {'clientWidth'|'clientHeight'|'width'|'height'} htmlProperty + * @returns {number} + */ + function extractSizeFromElement(element, styleProperty, htmlProperty) { + if (styleProperty && element.style[styleProperty] && element.style[styleProperty].match('px')) { + return parseInt(element.style[styleProperty]); + } else { + return String(element[htmlProperty]).match('px') ? parseInt(element[htmlProperty]) : element[htmlProperty]; + } + } + + /** + * Adapts NonLinear size (if present) to fit MiniPlayer view + * + * @param {number} [width] + * @param {number} [height] + * @param {number} [mobileWidth] + */ + function adaptNonLinearSize(width, height, mobileWidth) { + /** @type HTMLImageElement|HTMLIFrameElement */ + const nonLinear = playerInstance.domRef.wrapper.querySelector(NON_LINEAR_SELECTOR); + /** @type HTMLElement */ + const vpaidFrame = playerInstance.domRef.wrapper.querySelector(VPAID_FRAME_SELECTOR); + + if (!nonLinear) return; + + if (isMobile) { + width = window.innerWidth * mobileWidth / 100; // Transforms vw to px + } + + const nonLinearWidth = extractSizeFromElement(nonLinear, null, 'width'); + const nonLinearHeight = extractSizeFromElement(nonLinear, null, 'height'); + + if (originalNonLinearWidth && originalNonLinearHeight) { + nonLinear.width = originalNonLinearWidth; + nonLinear.height = originalNonLinearHeight; + + if (vpaidFrame) { + vpaidFrame.style.width = `${originalNonLinearWidth}px`; + vpaidFrame.style.height = `${originalNonLinearHeight}px`; + } + + originalNonLinearWidth = originalNonLinearHeight = null; + } else if (nonLinearWidth > width || nonLinearHeight > height) { + const targetRatio = (width - (isMobile ? 4 : 32)) / nonLinearWidth; + + originalNonLinearWidth = nonLinearWidth; + originalNonLinearHeight = nonLinearHeight; + + nonLinear.width = Math.round(nonLinearWidth * targetRatio); + nonLinear.height = Math.round(nonLinearHeight * targetRatio); + + if (vpaidFrame) { + vpaidFrame.style.width = `${Math.round(nonLinearWidth * targetRatio)}px`; + vpaidFrame.style.height = `${Math.round(nonLinearHeight * targetRatio)}px`; + } + } + } + + /** + * Adapts Linear size (if present) to fit MiniPlayer view + */ + function adaptLinearSize() { + const clickTroughLayer = playerInstance.domRef.wrapper.querySelector(LINEAR_CLICKTHROUGH_SELECTOR); + + if (clickTroughLayer) { + clickTroughLayer.style.width = `${playerInstance.domRef.player.offsetWidth}px`; + clickTroughLayer.style.height = `${playerInstance.domRef.player.offsetHeight}px`; + } + } + + /** + * Setups mobile disable element + */ + function setupMobile() { + const disableMiniPlayerMobile = document.createElement('div'); + let animationAmount = 0; + let startTimestamp = 0; + let startScreenX = 0; + let hasTriggeredAnimation; + disableMiniPlayerMobile.classList.add(DISABLE_MINI_PLAYER_MOBILE_CLASS); + const closeButton = document.createElement('span'); + closeButton.classList.add(CLOSE_BUTTON_CLASS); + disableMiniPlayerMobile.appendChild(closeButton); + + disableMiniPlayerMobile.ontouchstart = event => { + hasTriggeredAnimation = false; + startTimestamp = event.timeStamp; + startScreenX = event.changedTouches[0].screenX; + event.preventDefault(); + } + + disableMiniPlayerMobile.ontouchmove = event => { + animationAmount = Math.min( + Math.max( + startScreenX - event.changedTouches[0].screenX, + DISABLE_MINI_PLAYER_MOBILE_ANIMATION_CLAMP * -1), + DISABLE_MINI_PLAYER_MOBILE_ANIMATION_CLAMP + ); + + if (Math.abs(animationAmount) > DISABLE_MINI_PLAYER_MOBILE_ANIMATION_DEADZONE) { + // Moves the element the same amount as the touch event moved + playerInstance.domRef.wrapper.style.transform = `translateX(${animationAmount * -1}px)`; + hasTriggeredAnimation = true; + } else { + playerInstance.domRef.wrapper.style.transform = `translateX(0px)` + } + } + + disableMiniPlayerMobile.ontouchend = event => { + if (Math.abs(animationAmount) > DISABLE_MINI_PLAYER_MOBILE_ANIMATION_DEADZONE) { + // Scroll X behaviour - Disable mini player and pauses video + toggleMiniPlayer('off', true); + + if (!playerInstance.domRef.player.paused) { + playerInstance.playPauseToggle(); + } + event.preventDefault(); + } else if (!hasTriggeredAnimation) { + // Tap behaviour - Disable mini player and moves screen to video + toggleMiniPlayer('off', true); + setTimeout(() => { + playerInstance.domRef.wrapper.scrollIntoView({ + behavior: 'smooth', + block: 'center', + }); + }) + } + + animationAmount = 0; + playerInstance.domRef.wrapper.style.transform = ``; + } + + // Fallback for when there is no touch event + disableMiniPlayerMobile.onmouseup = () => toggleMiniPlayer('off', true) + + playerInstance.domRef.wrapper.insertBefore(disableMiniPlayerMobile, playerInstance.domRef.player.nextSibling); + } + + /** + * Creates a placeholder element in place where the video player was + * + * @param {number} placeholderWidth + * @param {number} placeholderHeight + */ + function createPlayerPlaceholder(placeholderWidth, placeholderHeight) { + placeholderElement = document.createElement('div'); + placeholderElement.classList.add(PLACEHOLDER_CLASS); + placeholderElement.style.height = `${placeholderHeight}px`; + placeholderElement.style.width = `${placeholderWidth}px`; + placeholderElement.innerText = playerInstance.displayOptions.layoutControls.miniPlayer.placeholderText || ''; + placeholderElement.onclick = () => toggleMiniPlayer('off', true); + + playerInstance.domRef.wrapper.parentElement.insertBefore(placeholderElement, playerInstance.domRef.wrapper); + } + + /** + * Removes the placeholder that was in place where video player was + */ + function removePlayerPlaceholder() { + playerInstance.domRef.wrapper.parentElement.removeChild(placeholderElement); + placeholderElement = null; + } + + /** + * Toggles auto toggle for mini player + */ + function toggleScreenDetection() { + const autoToggle = playerInstance.displayOptions.layoutControls.miniPlayer.autoToggle; + + if (toggleByVisibilityControl || !autoToggle) { + document.removeEventListener('scroll', toggleMiniPlayerByVisibility); + return; + } + + toggleByVisibilityControl = true; + document.addEventListener('scroll', toggleMiniPlayerByVisibility, { passive: true }); + } + + /** + * Checks for player visibility and toggles mini player based on it + */ + const toggleMiniPlayerByVisibility = playerInstance.throttle(function toggleMiniPlayerByVisibility() { + if (playerInstance.domRef.player.paused) { + return; + } + + const isPlayerVisible = playerInstance.isElementVisible(playerInstance.domRef.player); + const isPlaceholderVisible = playerInstance.isElementVisible(playerInstance.domRef.wrapper.querySelector(`.${PLACEHOLDER_CLASS}`)); + + if (!isPlayerVisible && !playerInstance.miniPlayerToggledOn) { + toggleMiniPlayer('on'); + } else if (isPlaceholderVisible && playerInstance.miniPlayerToggledOn) { + toggleMiniPlayer('off'); + } + }, TOGGLE_BY_VISIBILITY_DETECTION_RATE); + + // Exposes public module functions + playerInstance.toggleMiniPlayer = toggleMiniPlayer; + playerInstance.toggleMiniPlayerScreenDetection = toggleScreenDetection; +} diff --git a/client/fluid-player/src/modules/streaming.js b/client/fluid-player/src/modules/streaming.js new file mode 100644 index 0000000..cdaa1cf --- /dev/null +++ b/client/fluid-player/src/modules/streaming.js @@ -0,0 +1,299 @@ + +// Prevent DASH.js from automatically attaching to video sources by default. +// Whoever thought this is a good idea?! +if (typeof window !== 'undefined' && !window.dashjs) { + window.dashjs = { + skipAutoCreate: true, + isDefaultSubject: true + }; +} + +export default function (playerInstance, options) { + playerInstance.initialiseStreamers = () => { + playerInstance.detachStreamers(); + switch (playerInstance.displayOptions.layoutControls.mediaType) { + case 'application/dash+xml': // MPEG-DASH + if (!playerInstance.dashScriptLoaded && (!window.dashjs || window.dashjs.isDefaultSubject)) { + playerInstance.dashScriptLoaded = true; + import(/* webpackChunkName: "dashjs" */ 'dashjs').then((it) => { + window.dashjs = it.default; + playerInstance.initialiseDash(); + }); + } else { + playerInstance.initialiseDash(); + } + break; + case 'application/x-mpegurl': // HLS + const { displayOptions, domRef } = playerInstance; + const { player } = domRef; + const { hls } = displayOptions; + + // Doesn't load hls.js if player can play it natively + if (player.canPlayType('application/x-mpegurl') && !hls.overrideNative) { + playerInstance.debugMessage('Native HLS support found, skipping hls.js'); + break; + } + + if (!playerInstance.hlsScriptLoaded && !window.Hls) { + playerInstance.hlsScriptLoaded = true; + import(/* webpackChunkName: "hlsjs" */ 'hls.js').then((it) => { + window.Hls = it.default; + playerInstance.initialiseHls(); + }); + } else { + playerInstance.initialiseHls(); + } + break; + } + }; + + playerInstance.initialiseDash = () => { + if (typeof (window.MediaSource || window.WebKitMediaSource) === 'function') { + // If false we want to override the autoPlay, as it comes from postRoll + const playVideo = !playerInstance.autoplayAfterAd + ? playerInstance.autoplayAfterAd + : playerInstance.displayOptions.layoutControls.autoPlay; + + const defaultOptions = { + 'debug': { + 'logLevel': typeof FP_DEBUG !== 'undefined' && FP_DEBUG === true + ? dashjs.Debug.LOG_LEVEL_DEBUG + : dashjs.Debug.LOG_LEVEL_FATAL + } + }; + + const dashPlayer = dashjs.MediaPlayer().create(); + const options = playerInstance.displayOptions.modules.configureDash(defaultOptions); + + dashPlayer.updateSettings(options); + + playerInstance.displayOptions.modules.onBeforeInitDash(dashPlayer); + + dashPlayer.initialize(playerInstance.domRef.player, playerInstance.originalSrc, playVideo); + + dashPlayer.on('streamInitializing', () => { + playerInstance.toggleLoader(true); + }); + + dashPlayer.on('canPlay', () => { + playerInstance.toggleLoader(false); + }); + + dashPlayer.on('playbackPlaying', () => { + playerInstance.toggleLoader(false); + }); + + playerInstance.displayOptions.modules.onAfterInitDash(dashPlayer); + + playerInstance.dashPlayer = dashPlayer; + } else { + playerInstance.nextSource(); + console.log('[FP_WARNING] Media type not supported by this browser using DASH.js. (application/dash+xml)'); + } + }; + + playerInstance.initialiseHls = () => { + if (typeof Hls !== 'undefined' && Hls.isSupported()) { + playerInstance.debugMessage('Initializing hls.js'); + + const defaultOptions = { + debug: typeof FP_DEBUG !== 'undefined' && FP_DEBUG === true, + startPosition: 0, + p2pConfig: { + logLevel: false, + }, + enableWebVTT: false, + enableCEA708Captions: false, + }; + + const options = playerInstance.displayOptions.modules.configureHls(defaultOptions); + const hls = new Hls(options); + playerInstance.displayOptions.modules.onBeforeInitHls(hls); + + hls.attachMedia(playerInstance.domRef.player); + hls.loadSource(playerInstance.originalSrc); + + playerInstance.displayOptions.modules.onAfterInitHls(hls); + + playerInstance.hlsPlayer = hls; + + if (!playerInstance.firstPlayLaunched && playerInstance.displayOptions.layoutControls.autoPlay) { + playerInstance.domRef.player.play(); + } + + playerInstance.createHLSVideoSourceSwitch(); + } else { + playerInstance.nextSource(); + console.log('[FP_WARNING] Media type not supported by this browser using HLS.js. (application/x-mpegURL)'); + } + }; + + playerInstance.createHLSVideoSourceSwitch = () => { + playerInstance.hlsPlayer.on(Hls.Events.MANIFEST_PARSED, function () { + try { + const levels = createHLSLevels(); + const sortedLevels = sortLevels(levels); + playerInstance.videoSources = sortedLevels; + + // <=2 because of the added auto function + if (sortedLevels.length <= 2) return; + + const sourceChangeButton = playerInstance.domRef.wrapper.querySelector('.fluid_control_video_source'); + + toggleSourceChangeButtonVisibility(sortedLevels, sourceChangeButton); + + const sourceChangeList = createSourceChangeList(sortedLevels); + attachSourceChangeList(sourceChangeButton, sourceChangeList); + + // Set initial level based on persisted quality or default to auto + setInitialLevel(sortedLevels); + } catch (err) { + console.error(err); + } + }); + }; + + function createHLSLevels() { + const HLSLevels = playerInstance.hlsPlayer.levels + .map((level, index) => ({ + id: index, + title: String(level.width), + isHD: level.videoRange === 'HDR', + bitrate: level.bitrate + })); + + const autoLevel = { + id: -1, + title: 'auto', + isHD: false, + bitrate: 0 + }; + + return [...HLSLevels, autoLevel]; + } + + function toggleSourceChangeButtonVisibility(levels, sourceChangeButton) { + if (levels.length > 1) { + sourceChangeButton.style.display = 'inline-block'; + } else { + sourceChangeButton.style.display = 'none'; + } + } + + function createSourceChangeList(levels) { + const sourceChangeList = document.createElement('div'); + sourceChangeList.className = 'fluid_video_sources_list'; + sourceChangeList.style.display = 'none'; + + levels.forEach(level => { + const sourceChangeDiv = createSourceChangeItem(level); + sourceChangeList.appendChild(sourceChangeDiv); + }); + + return sourceChangeList; + } + + function createSourceChangeItem(level) { + const sourceSelectedClass = getSourceSelectedClass(level); + const hdIndicator = level.isHD ? `` : ''; + + const sourceChangeDiv = document.createElement('div'); + sourceChangeDiv.className = `fluid_video_source_list_item js-source_${level.title}`; + sourceChangeDiv.innerHTML = `${level.title}${hdIndicator}`; + + sourceChangeDiv.addEventListener('click', event => onSourceChangeClick(event, level)); + + return sourceChangeDiv; + } + + function getSourceSelectedClass(level) { + const matchingLevels = playerInstance.videoSources.filter(source => source.title === playerInstance.fluidStorage.fluidQuality); + + // If there are multiple matching levels, use the first one + if (matchingLevels.length > 1) { + if (matchingLevels[0].id === level.id) { + return "source_selected"; + } + } else if (matchingLevels.length === 1) { + return matchingLevels[0].id === level.id ? "source_selected" : ""; + } + + // Fallback to auto selection if no persistent level exists + if (!matchingLevels.length && level.title === 'auto') { + return "source_selected"; + } + + return ""; + } + + function onSourceChangeClick(event, selectedLevel) { + event.stopPropagation(); + + setPlayerDimensions(); + + const videoChangedTo = event.currentTarget; + clearSourceSelectedIcons(); + + videoChangedTo.firstChild.classList.add('source_selected'); + + playerInstance.videoSources.forEach(source => { + if (source.title === videoChangedTo.innerText.replace(/(\r\n\t|\n|\r\t)/gm, '')) { + playerInstance.hlsPlayer.currentLevel = selectedLevel.id; + playerInstance.fluidStorage.fluidQuality = selectedLevel.title; + } + }); + + playerInstance.openCloseVideoSourceSwitch(); + } + + // While changing source the player size can flash, we want to set the pixel dimensions then back to 100% afterwards + function setPlayerDimensions() { + playerInstance.domRef.player.style.width = `${playerInstance.domRef.player.clientWidth}px`; + playerInstance.domRef.player.style.height = `${playerInstance.domRef.player.clientHeight}px`; + } + + function clearSourceSelectedIcons() { + const sourceIcons = playerInstance.domRef.wrapper.getElementsByClassName('source_button_icon'); + Array.from(sourceIcons).forEach(icon => icon.classList.remove('source_selected')); + } + + function attachSourceChangeList(sourceChangeButton, sourceChangeList) { + sourceChangeButton.appendChild(sourceChangeList); + sourceChangeButton.removeEventListener('click', playerInstance.openCloseVideoSourceSwitch); + sourceChangeButton.addEventListener('click', playerInstance.openCloseVideoSourceSwitch); + } + + function setInitialLevel(levels) { + // Check if a persistency level exists and set the current level accordingly + const persistedLevel = levels.find(level => level.title === playerInstance.fluidStorage.fluidQuality); + + if (persistedLevel) { + playerInstance.hlsPlayer.currentLevel = persistedLevel.id; + } else { + // Default to 'auto' if no persisted level is found + const autoLevel = levels.find(level => level.title === 'auto'); + playerInstance.hlsPlayer.currentLevel = autoLevel.id; + } + } + + function sortLevels(levels) { + return [...levels].sort((a, b) => { + // First sort by width in descending order + if (b.width !== a.width) { + return b.width - a.width; + } + // If width is the same, sort by bitrate in descending order + return b.bitrate - a.bitrate; + }); + } + + playerInstance.detachStreamers = () => { + if (playerInstance.dashPlayer) { + playerInstance.dashPlayer.reset(); + playerInstance.dashPlayer = false; + } else if (playerInstance.hlsPlayer) { + playerInstance.hlsPlayer.detachMedia(); + playerInstance.hlsPlayer = false; + } + }; +} diff --git a/client/fluid-player/src/modules/subtitles.js b/client/fluid-player/src/modules/subtitles.js new file mode 100644 index 0000000..5232aeb --- /dev/null +++ b/client/fluid-player/src/modules/subtitles.js @@ -0,0 +1,225 @@ +export default function (playerInstance, options) { + playerInstance.subtitleFetchParse = (subtitleItem) => { + playerInstance.sendRequest( + subtitleItem.url, + true, + playerInstance.displayOptions.vastOptions.vastTimeout, + function () { + const convertVttRawData = function (vttRawData) { + if (!( + (typeof vttRawData.cues !== 'undefined') && + (vttRawData.cues.length) + )) { + return []; + } + + const result = []; + + for (let i = 0; i < vttRawData.cues.length; i++) { + let tempThumbnailData = vttRawData.cues[i].text.split('#'); + + result.push({ + startTime: vttRawData.cues[i].startTime, + endTime: vttRawData.cues[i].endTime, + text: vttRawData.cues[i].text, + cue: vttRawData.cues[i] + }) + } + + return result; + }; + + const xmlHttpReq = this; + + if ((xmlHttpReq.readyState === 4) && (xmlHttpReq.status !== 200)) { + //The response returned an error. + return; + } + + if (!((xmlHttpReq.readyState === 4) && (xmlHttpReq.status === 200))) { + return; + } + + const textResponse = xmlHttpReq.responseText; + + const parser = new WebVTT.Parser(window, WebVTT.StringDecoder()); + const cues = []; + const regions = []; // TODO: unused? + parser.oncue = function (cue) { + cues.push(cue); + }; + parser.onregion = function (region) { + regions.push(region); + }; + parser.parse(textResponse); + parser.flush(); + playerInstance.subtitlesData = cues; + + } + ); + }; + + playerInstance.createSubtitlesSwitch = () => { + const subtitlesOff = 'OFF'; + playerInstance.subtitlesData = []; + + if (!playerInstance.displayOptions.layoutControls.subtitlesEnabled) { + // No other video subtitles + playerInstance.domRef.wrapper.querySelector('.fluid_control_subtitles').style.display = 'none'; + return; + } + + const tracks = []; + tracks.push({'label': subtitlesOff, 'url': 'na', 'lang': subtitlesOff}); + + const tracksList = playerInstance.domRef.player.querySelectorAll('track'); + + [].forEach.call(tracksList, function (track) { + if (track.kind === 'metadata' && track.src) { + tracks.push({'label': track.label, 'url': track.src, 'lang': track.srclang, 'default': track.default}); + } + }); + + playerInstance.subtitlesTracks = tracks; + const subtitlesChangeButton = playerInstance.domRef.wrapper.querySelector('.fluid_control_subtitles'); + subtitlesChangeButton.style.display = 'inline-block'; + let appendSubtitleChange = false; + + const subtitlesChangeList = document.createElement('div'); + subtitlesChangeList.className = 'fluid_subtitles_list'; + subtitlesChangeList.style.display = 'none'; + + let hasSelectedSubtitle = false; + const hasDefault = !!playerInstance.subtitlesTracks.find(track => track.default); + playerInstance.subtitlesTracks.forEach(function (subtitle) { + let subtitleSelected = '' + + const subtitlesOnByDefault = playerInstance.displayOptions.layoutControls.subtitlesOnByDefault; + + if (!hasSelectedSubtitle && (subtitlesOnByDefault && subtitle.default || + (!hasDefault && subtitle.label !== subtitlesOff) || + playerInstance.subtitlesTracks.length === 1) || + !subtitlesOnByDefault && subtitle.label === subtitlesOff + ) { + subtitleSelected = 'subtitle_selected'; + playerInstance.subtitleFetchParse(subtitle); + hasSelectedSubtitle = true; + } + + const subtitlesChangeDiv = document.createElement('div'); + subtitlesChangeDiv.className = 'fluid_subtitle_list_item'; + subtitlesChangeDiv.innerHTML = '' + subtitle.label; + + subtitlesChangeDiv.addEventListener('click', function (event) { + event.stopPropagation(); + const subtitleChangedTo = this; + const subtitleIcons = playerInstance.domRef.wrapper.getElementsByClassName('subtitle_button_icon'); + + for (let i = 0; i < subtitleIcons.length; i++) { + subtitleIcons[i].className = subtitleIcons[i].className.replace("subtitle_selected", ""); + } + + subtitleChangedTo.firstChild.className += ' subtitle_selected'; + + playerInstance.subtitlesTracks.forEach(function (subtitle) { + if (subtitle.label === subtitleChangedTo.innerText.replace(/(\r\n\t|\n|\r\t)/gm, "")) { + if (subtitle.label === subtitlesOff) { + playerInstance.subtitlesData = []; + } else { + playerInstance.subtitleFetchParse(subtitle); + } + } + }); + playerInstance.openCloseSubtitlesSwitch(); + + }); + + subtitlesChangeList.appendChild(subtitlesChangeDiv); + appendSubtitleChange = true; + + }); + + if (appendSubtitleChange) { + subtitlesChangeButton.appendChild(subtitlesChangeList); + subtitlesChangeButton.removeEventListener('click', handleSubtitlesChange); + subtitlesChangeButton.addEventListener('click', handleSubtitlesChange); + } else { + // Didn't give any subtitle options + playerInstance.domRef.wrapper.querySelector('.fluid_control_subtitles').style.display = 'none'; + } + + playerInstance.domRef.player.removeEventListener('timeupdate', videoPlayerSubtitlesUpdate); + playerInstance.domRef.player.addEventListener('timeupdate', videoPlayerSubtitlesUpdate); + }; + + function handleSubtitlesChange() { + playerInstance.openCloseSubtitlesSwitch(); + } + + //attach subtitles to show based on time + //this function is for rendering of subtitles when content is playing + function videoPlayerSubtitlesUpdate() { + playerInstance.renderSubtitles(); + } + + playerInstance.renderSubtitles = () => { + const videoPlayer = playerInstance.domRef.player; + + //if content is playing then no subtitles + let currentTime = Math.floor(videoPlayer.currentTime); + let subtitlesAvailable = false; + let subtitlesContainer = playerInstance.domRef.wrapper.querySelector('.fluid_subtitles_container'); + + if (playerInstance.isCurrentlyPlayingAd) { + subtitlesContainer.innerHTML = ''; + return; + } + + for (let i = 0; i < playerInstance.subtitlesData.length; i++) { + if (currentTime >= (playerInstance.subtitlesData[i].startTime) && currentTime <= (playerInstance.subtitlesData[i].endTime)) { + subtitlesContainer.innerHTML = ''; + subtitlesContainer.appendChild(WebVTT.convertCueToDOMTree(window, playerInstance.subtitlesData[i].text)); + subtitlesAvailable = true; + } + } + + if (!subtitlesAvailable) { + subtitlesContainer.innerHTML = ''; + } + }; + + playerInstance.openCloseSubtitlesSwitch = () => { + const subtitleChangeList = playerInstance.domRef.wrapper.querySelector('.fluid_subtitles_list'); + + if (playerInstance.isCurrentlyPlayingAd) { + subtitleChangeList.style.display = 'none'; + return; + } + + if (subtitleChangeList.style.display === 'none') { + subtitleChangeList.style.display = 'block'; + const mouseOut = function (event) { + subtitleChangeList.removeEventListener('mouseleave', mouseOut); + subtitleChangeList.style.display = 'none'; + }; + subtitleChangeList.addEventListener('mouseleave', mouseOut); + } else { + subtitleChangeList.style.display = 'none'; + } + }; + + playerInstance.createSubtitles = () => { + const divSubtitlesContainer = document.createElement('div'); + divSubtitlesContainer.className = 'fluid_subtitles_container'; + playerInstance.domRef.player.parentNode.insertBefore(divSubtitlesContainer, playerInstance.domRef.player.nextSibling); + + if (!playerInstance.displayOptions.layoutControls.subtitlesEnabled) { + return; + } + + import(/* webpackChunkName: "vttjs" */ 'videojs-vtt.js').then((it) => { + window.WebVTT = it.WebVTT || it.default.WebVTT; + playerInstance.createSubtitlesSwitch(); + }); + }; +} diff --git a/client/fluid-player/src/modules/suggestedVideos.js b/client/fluid-player/src/modules/suggestedVideos.js new file mode 100644 index 0000000..7f3ab8a --- /dev/null +++ b/client/fluid-player/src/modules/suggestedVideos.js @@ -0,0 +1,197 @@ +export default function (playerInstance, options) { + playerInstance.suggestedVideosGrid = null; + + playerInstance.generateSuggestedVideoList = () => { + const configUrl = playerInstance.displayOptions.suggestedVideos.configUrl; + + if (!configUrl) { + return; + } + + playerInstance.sendRequestAsync(configUrl, false, 5000).then(({response}) => { + const config = JSON.parse(response); + const suggestedVideosGrid = playerInstance.generateSuggestedVideoGrid(config); + + playerInstance.suggestedVideosGrid = suggestedVideosGrid; + + }).catch(err => { + console.error('[FP_ERROR] given suggested videos config url is invalid or not found.', err); + }) + }; + + playerInstance.generateSuggestedVideoGrid = (config) => { + const suggestedVideosGrid = document.createElement('div'); + suggestedVideosGrid.className = 'suggested_tile_grid'; + + for (let i = 0; i < 12; i++) { + const videoTile = playerInstance.createVideoTile(config[i]); + suggestedVideosGrid.appendChild(videoTile); + } + + return suggestedVideosGrid; + }; + + playerInstance.displaySuggestedVideos = () => { + const PlayerDOM = playerInstance.domRef.wrapper; + PlayerDOM.appendChild(playerInstance.suggestedVideosGrid); + }; + + playerInstance.clickSuggestedVideo = (sources, subtitles, configUrl) => { + playerInstance.toggleLoader(true); + playerInstance.hideSuggestedVideos(); + playerInstance.resetPlayer(sources, subtitles, configUrl); + + playerInstance.generateSuggestedVideoList(); + }; + + playerInstance.resetPlayer = (sources, subtitles, configUrl) => { + const videoDOM = playerInstance.domRef.wrapper.querySelector(`#${playerInstance.videoPlayerId}`); + videoDOM.innerHTML = ''; + + let sourcesHTML = ''; + if (sources) { + sources.forEach(source => { + sourcesHTML += ``; + }); + } + if (subtitles) { + subtitles.forEach(subtitle => { + sourcesHTML += ``; + }); + } + + videoDOM.innerHTML = sourcesHTML; + + playerInstance.removeVideoSourcesListFromDOM(); + + const videoSourceList = playerInstance.domRef.wrapper.getElementsByClassName('fluid_control_video_source')[0]; + videoSourceList.innerHTML = ''; + playerInstance.domRef.player.src = ''; + playerInstance.domRef.player.removeAttribute('src'); + playerInstance.setVideoSource(sources[0].url); + playerInstance.createVideoSourceSwitch(false); + playerInstance.resetSubtitles(); + playerInstance.setPersistentSettings(true); + playerInstance.loadInNewVideo(); + playerInstance.resetAds(); + + // set new API config url + if (configUrl) { + playerInstance.displayOptions.suggestedVideos.configUrl = configUrl; + playerInstance.generateSuggestedVideoList(); + } + } + + playerInstance.createVideoTile = (config) => { + const videoTile = document.createElement('div'); + videoTile.addEventListener('click', function () { + playerInstance.clickSuggestedVideo(config.sources, config.subtitles, config.configUrl); + }, false); + videoTile.className = 'suggested_tile'; + videoTile.id = 'suggested_tile_' + config.id; + + playerInstance.getImageTwoMostProminentColours(config.thumbnailUrl).then(mostProminentColors => { + if (mostProminentColors && mostProminentColors.length) { + videoTile.style = `background: ${mostProminentColors[0]};`; + } + }); + + const videoImage = document.createElement('img'); + videoImage.src = config.thumbnailUrl; + videoImage.className = 'suggested_tile_image'; + + const videoTileOverlay = document.createElement('div'); + videoTileOverlay.className='suggested_tile_overlay'; + const title = document.createElement('p'); + title.className = 'suggested_tile_title'; + title.innerText = config.title; + videoTileOverlay.appendChild(title); + + videoTile.appendChild(videoImage); + videoTile.appendChild(videoTileOverlay); + + return videoTile; + } + + playerInstance.resetSubtitles = () => { + playerInstance.removeSubtitlesListFromDOM(); + const videoSubtitlesList = playerInstance.domRef.wrapper.getElementsByClassName('fluid_control_subtitles')[0]; + videoSubtitlesList.innerHTML = ''; + playerInstance.domRef.player.load(); + playerInstance.createSubtitles(false); + } + + playerInstance.loadInNewVideo = () => { + playerInstance.displayOptions.layoutControls.mediaType = playerInstance.getCurrentSrcType(); + playerInstance.initialiseStreamers(); + playerInstance.domRef.player.currentTime = 0; + playerInstance.domRef.player.mainVideoCurrentTime = 0; + playerInstance.setBuffering(); + } + + playerInstance.resetAds = () => { + // Clear midroll and postroll ads + playerInstance.timerPool = {}; + playerInstance.rollsById = {}; + playerInstance.adPool = {}; + playerInstance.adGroupedByRolls = {}; + playerInstance.onPauseRollAdPods = []; + playerInstance.currentOnPauseRollAd = ''; + + // Reset variables and flags, needed for assigning the different rolls correctly + playerInstance.isTimer = false; + playerInstance.timer = null; + playerInstance.firstPlayLaunched = false; + + // Clear preroll ads + playerInstance.preRollAdsResolved = false; + playerInstance.preRollAdPods = []; + playerInstance.preRollAdPodsLength = 0; + playerInstance.preRollVastResolved = 0; + playerInstance.autoplayAfterAd = true; + + // Wait until new selected video is buffered so we can get the video length + // This is needed for mid and post rolls to assign the correct time key to their respective triggers + const checkMainVideoDuration = () => { + if (!isNaN(playerInstance.domRef.player.duration) && playerInstance.domRef.player.duration > 0) { + playerInstance.toggleLoader(true); + playerInstance.mainVideoDuration = playerInstance.domRef.player.duration; + + clearInterval(intervalId); + + // Set up ads + playerInstance.setVastList(); + playerInstance.checkForNextAd(); + playerInstance.playPauseToggle(); + } + }; + + const intervalId = setInterval(checkMainVideoDuration, 100); + } + + playerInstance.removeVideoSourcesListFromDOM = () => { + const sourcesDOM = playerInstance.domRef.wrapper.getElementsByClassName('fluid_video_source_list_item'); + for (let i = 0; i < sourcesDOM.length; i++) { + sourcesDOM[i].remove(); + } + }; + + playerInstance.removeSubtitlesListFromDOM = () => { + const tracksDOM = playerInstance.domRef.wrapper.getElementsByClassName('fluid_subtitle_list_item'); + for (let i = 0; i < tracksDOM.length; i++) { + tracksDOM[i].remove(); + } + }; + + playerInstance.hideSuggestedVideos = () => { + const suggestedVideosDOM = playerInstance.domRef.wrapper.getElementsByClassName('suggested_tile_grid')[0]; + if (suggestedVideosDOM) { + suggestedVideosDOM.remove(); + } + }; + + playerInstance.isShowingSuggestedVideos = () => { + return !!playerInstance.domRef.wrapper.getElementsByClassName('suggested_tile_grid')[0]; + } + +} diff --git a/client/fluid-player/src/modules/timeline.js b/client/fluid-player/src/modules/timeline.js new file mode 100644 index 0000000..24ce806 --- /dev/null +++ b/client/fluid-player/src/modules/timeline.js @@ -0,0 +1,202 @@ +export default function (playerInstance, options) { + playerInstance.setupThumbnailPreviewVtt = () => { + playerInstance.sendRequest( + playerInstance.displayOptions.layoutControls.timelinePreview.file, + true, + playerInstance.displayOptions.vastOptions.vastTimeout, + function () { + const convertVttRawData = function (vttRawData) { + if (!( + (typeof vttRawData.cues !== 'undefined') && + (vttRawData.cues.length) + )) { + return []; + } + + const result = []; + let tempThumbnailData = null; + let tempThumbnailCoordinates = null; + + for (let i = 0; i < vttRawData.cues.length; i++) { + tempThumbnailData = vttRawData.cues[i].text.split('#'); + let xCoords = 0, yCoords = 0, wCoords = 122.5, hCoords = 69; + + // .vtt file contains sprite corrdinates + if ( + (tempThumbnailData.length === 2) && + (tempThumbnailData[1].indexOf('xywh=') === 0) + ) { + tempThumbnailCoordinates = tempThumbnailData[1].substring(5); + tempThumbnailCoordinates = tempThumbnailCoordinates.split(','); + + if (tempThumbnailCoordinates.length === 4) { + playerInstance.displayOptions.layoutControls.timelinePreview.spriteImage = true; + xCoords = parseInt(tempThumbnailCoordinates[0]); + yCoords = parseInt(tempThumbnailCoordinates[1]); + wCoords = parseInt(tempThumbnailCoordinates[2]); + hCoords = parseInt(tempThumbnailCoordinates[3]); + } + } + + let imageUrl; + if (playerInstance.displayOptions.layoutControls.timelinePreview.spriteRelativePath + && playerInstance.displayOptions.layoutControls.timelinePreview.file.indexOf('/') !== -1 + && (typeof playerInstance.displayOptions.layoutControls.timelinePreview.sprite === 'undefined' || playerInstance.displayOptions.layoutControls.timelinePreview.sprite === '') + ) { + imageUrl = playerInstance.displayOptions.layoutControls.timelinePreview.file.substring(0, playerInstance.displayOptions.layoutControls.timelinePreview.file.lastIndexOf('/')); + imageUrl += '/' + tempThumbnailData[0]; + } else { + imageUrl = (playerInstance.displayOptions.layoutControls.timelinePreview.sprite ? playerInstance.displayOptions.layoutControls.timelinePreview.sprite : tempThumbnailData[0]); + } + + result.push({ + startTime: vttRawData.cues[i].startTime, + endTime: vttRawData.cues[i].endTime, + image: imageUrl, + x: xCoords, + y: yCoords, + w: wCoords, + h: hCoords + }); + } + + return result; + }; + + const xmlHttpReq = this; + + if ((xmlHttpReq.readyState === 4) && (xmlHttpReq.status !== 200)) { + //The response returned an error. + return; + } + + if (!((xmlHttpReq.readyState === 4) && (xmlHttpReq.status === 200))) { + return; + } + + const textResponse = xmlHttpReq.responseText; + + const webVttParser = new window.WebVTTParser(); + const vttRawData = webVttParser.parse(textResponse); + + playerInstance.timelinePreviewData = convertVttRawData(vttRawData); + } + ); + }; + + playerInstance.generateTimelinePreviewTags = () => { + const progressContainer = playerInstance.domRef.wrapper.querySelector('.fluid_controls_progress_container'); + const previewContainer = document.createElement('div'); + + previewContainer.className = 'fluid_timeline_preview_container'; + previewContainer.style.display = 'none'; + previewContainer.style.position = 'absolute'; + + progressContainer.appendChild(previewContainer); + + //Shadow is needed to not trigger mouseleave event, that stops showing thumbnails, in case one scrubs a bit too fast and leaves current thumb before new one drawn. + const previewContainerShadow = document.createElement('div'); + previewContainerShadow.className = 'fluid_timeline_preview_container_shadow'; + previewContainerShadow.style.position = 'absolute'; + previewContainerShadow.style.display = 'none'; + previewContainerShadow.style.opacity = 1; + progressContainer.appendChild(previewContainerShadow); + }; + + playerInstance.getThumbnailCoordinates = (second) => { + if (playerInstance.timelinePreviewData.length) { + for (let i = 0; i < playerInstance.timelinePreviewData.length; i++) { + if ((second >= playerInstance.timelinePreviewData[i].startTime) && (second <= playerInstance.timelinePreviewData[i].endTime)) { + return playerInstance.timelinePreviewData[i]; + } + } + } + + return false; + }; + + playerInstance.drawTimelinePreview = (event) => { + const timelinePreviewTag = playerInstance.domRef.wrapper.querySelector('.fluid_timeline_preview_container'); + const timelinePreviewShadow = playerInstance.domRef.wrapper.querySelector('.fluid_timeline_preview_container_shadow'); + const progressContainer = playerInstance.domRef.wrapper.querySelector('.fluid_controls_progress_container'); + const totalWidth = progressContainer.clientWidth; + + if (playerInstance.isCurrentlyPlayingAd) { + if (timelinePreviewTag.style.display !== 'none') { + timelinePreviewTag.style.display = 'none'; + } + + return; + } + + //get the hover position + const hoverX = playerInstance.getEventOffsetX(event, progressContainer); + let hoverSecond = null; + + if (totalWidth) { + hoverSecond = playerInstance.currentVideoDuration * hoverX / totalWidth; + + //get the corresponding thumbnail coordinates + const thumbnailCoordinates = playerInstance.getThumbnailCoordinates(hoverSecond); + timelinePreviewShadow.style.width = totalWidth + 'px'; + timelinePreviewShadow.style.display = 'block'; + + if (thumbnailCoordinates !== false) { + timelinePreviewTag.style.width = thumbnailCoordinates.w + 'px'; + timelinePreviewTag.style.height = thumbnailCoordinates.h + 'px'; + timelinePreviewShadow.style.height = thumbnailCoordinates.h + 'px'; + timelinePreviewTag.style.background = + 'url(' + thumbnailCoordinates.image + ') no-repeat scroll -' + thumbnailCoordinates.x + 'px -' + thumbnailCoordinates.y + 'px'; + timelinePreviewTag.style.left = hoverX - (thumbnailCoordinates.w / 2) + 'px'; + timelinePreviewTag.style.display = 'block'; + if (!playerInstance.displayOptions.layoutControls.timelinePreview.spriteImage) { + timelinePreviewTag.style.backgroundSize = 'contain'; + } + + } else { + timelinePreviewTag.style.display = 'none'; + } + } + }; + + playerInstance.setupThumbnailPreview = () => { + let timelinePreview = playerInstance.displayOptions.layoutControls.timelinePreview; + if (!timelinePreview || !timelinePreview.type) { + return; + } + + let eventOn = 'mousemove'; + let eventOff = 'mouseleave'; + if (playerInstance.mobileInfo.userOs) { + eventOn = 'touchmove'; + eventOff = 'touchend'; + } + playerInstance.domRef.wrapper.querySelector('.fluid_controls_progress_container') + .addEventListener(eventOn, playerInstance.drawTimelinePreview.bind(playerInstance), false); + playerInstance.domRef.wrapper.querySelector('.fluid_controls_progress_container') + .addEventListener(eventOff, function (event) { + const progress = playerInstance.domRef.wrapper.querySelector('.fluid_controls_progress_container'); + if (typeof event.clientX !== 'undefined' && progress.contains(document.elementFromPoint(event.clientX, event.clientY))) { + //False positive (Chrome bug when fast click causes leave event) + return; + } + playerInstance.domRef.wrapper.querySelector('.fluid_timeline_preview_container').style.display = 'none'; + playerInstance.domRef.wrapper.querySelector('.fluid_timeline_preview_container_shadow').style.display = 'none'; + }, false); + playerInstance.generateTimelinePreviewTags(); + + if ('VTT' === timelinePreview.type && typeof timelinePreview.file === 'string') { + import(/* webpackChunkName: "webvtt" */ '../../vendor/webvtt').then((it) => { + window.WebVTTParser = it.default; + playerInstance.setupThumbnailPreviewVtt(); + }); + } else if ('static' === timelinePreview.type && typeof timelinePreview.frames === 'object') { + timelinePreview.spriteImage = true; + playerInstance.timelinePreviewData = timelinePreview.frames; + } else { + throw 'Invalid thumbnail-preview - type must be VTT or static'; + } + + playerInstance.showTimeOnHover = false; + }; +} diff --git a/client/fluid-player/src/modules/utils.js b/client/fluid-player/src/modules/utils.js new file mode 100644 index 0000000..5b63bb3 --- /dev/null +++ b/client/fluid-player/src/modules/utils.js @@ -0,0 +1,326 @@ +export default function (playerInstance, options) { + playerInstance.isTouchDevice = () => { + return !!('ontouchstart' in window // works on most browsers + || navigator.maxTouchPoints); // works on IE10/11 and Surface + }; + + /** + * Distinguishes iOS from Android devices and the OS version. + * + * This should be avoided in favor of capability detection. + * + * @deprecated deprecated as of v3.0 + * @returns object + */ + playerInstance.getMobileOs = () => { + const ua = navigator.userAgent || ''; + const result = {device: false, userOs: false, userOsVer: false, userOsMajor: false}; + + let versionIndex; + // determine OS + if (ua.match(/Android/i)) { + result.userOs = 'Android'; + versionIndex = ua.indexOf('Android '); + } else if (ua.match(/iPhone/i)) { + result.device = 'iPhone'; + result.userOs = 'iOS'; + versionIndex = ua.indexOf('OS '); + } else if (ua.match(/iPad/i)) { + result.device = 'iPad'; + result.userOs = 'iOS'; + versionIndex = ua.indexOf('OS '); + } else { + result.userOs = false; + } + + // determine version + if ('iOS' === result.userOs && versionIndex > -1) { + const userOsTemp = ua.substr(versionIndex + 3); + const indexOfEndOfVersion = userOsTemp.indexOf(' '); + + if (indexOfEndOfVersion !== -1) { + result.userOsVer = userOsTemp.substring(0, userOsTemp.indexOf(' ')).replace(/_/g, '.'); + result.userOsMajor = parseInt(result.userOsVer); + } + } else if ('Android' === result.userOs && versionIndex > -1) { + result.userOsVer = ua.substr(versionIndex + 8, 3); + } else { + result.userOsVer = false; + } + + return result; + }; + + /** + * Browser detection. + * This should be avoided in favor of capability detection. + * + * @deprecated deprecated as of v3.0 + * + * @returns object + */ + playerInstance.getBrowserVersion = () => { + const ua = navigator.userAgent || ''; + const result = {browserName: false, fullVersion: false, majorVersion: false, userOsMajor: false}; + + let idx, uaindex; + + try { + result.browserName = navigator.appName; + + if ((idx = ua.indexOf('OPR/')) !== -1) { + result.browserName = 'Opera'; + result.fullVersion = ua.substring(idx + 4); + } else if ((idx = ua.indexOf('Opera')) !== -1) { + result.browserName = 'Opera'; + result.fullVersion = ua.substring(idx + 6); + if ((idx = ua.indexOf('Version')) !== -1) + result.fullVersion = ua.substring(idx + 8); + } else if ((idx = ua.indexOf('MSIE')) !== -1) { + result.browserName = 'Microsoft Internet Explorer'; + result.fullVersion = ua.substring(idx + 5); + } else if ((idx = ua.indexOf('Chrome')) !== -1) { + result.browserName = 'Google Chrome'; + result.fullVersion = ua.substring(idx + 7); + } else if ((idx = ua.indexOf('Safari')) !== -1) { + result.browserName = 'Safari'; + result.fullVersion = ua.substring(idx + 7); + if ((idx = ua.indexOf('Version')) !== -1) + result.fullVersion = ua.substring(idx + 8); + } else if ((idx = ua.indexOf('Firefox')) !== -1) { + result.browserName = 'Mozilla Firefox'; + result.fullVersion = ua.substring(idx + 8); + } + + // Others "name/version" is at the end of userAgent + else if ((uaindex = ua.lastIndexOf(' ') + 1) < (idx = ua.lastIndexOf('/'))) { + result.browserName = ua.substring(uaindex, idx); + result.fullVersion = ua.substring(idx + 1); + if (result.browserName.toLowerCase() === result.browserName.toUpperCase()) { + result.browserName = navigator.appName; + } + } + + // trim the fullVersion string at semicolon/space if present + if ((uaindex = result.fullVersion.indexOf(';')) !== -1) { + result.fullVersion = result.fullVersion.substring(0, uaindex); + } + if ((uaindex = result.fullVersion.indexOf(' ')) !== -1) { + result.fullVersion = result.fullVersion.substring(0, uaindex); + } + + result.majorVersion = parseInt('' + result.fullVersion, 10); + + if (isNaN(result.majorVersion)) { + result.fullVersion = '' + parseFloat(navigator.appVersion); + result.majorVersion = parseInt(navigator.appVersion, 10); + } + } catch (e) { + //Return default obj. + } + + return result; + }; + + playerInstance.compareVersion = (v1, v2) => { + if (typeof v1 !== 'string') return false; + if (typeof v2 !== 'string') return false; + v1 = v1.split('.'); + v2 = v2.split('.'); + const k = Math.min(v1.length, v2.length); + for (let i = 0; i < k; ++i) { + v1[i] = parseInt(v1[i], 10); + v2[i] = parseInt(v2[i], 10); + if (v1[i] > v2[i]) return 1; + if (v1[i] < v2[i]) return -1; + } + return v1.length === v2.length ? 0 : (v1.length < v2.length ? -1 : 1); + }; + + playerInstance.convertTimeStringToSeconds = (str) => { + if (!(str && str.match(/^(\d){2}(:[0-5][0-9]){2}(.(\d){1,3})?$/))) { + return false; + } + + const timeParts = str.split(':'); + return ((parseInt(timeParts[0], 10)) * 3600) + ((parseInt(timeParts[1], 10)) * 60) + (parseInt(timeParts[2], 10)); + }; + + // Format time to hh:mm:ss + playerInstance.formatTime = (duration) => { + const formatDateObj = new Date(duration * 1000); + const formatHours = playerInstance.pad(formatDateObj.getUTCHours()); + const formatMinutes = playerInstance.pad(formatDateObj.getUTCMinutes()); + const formatSeconds = playerInstance.pad(formatDateObj.getSeconds()); + + return formatHours >= 1 + ? formatHours + ':' + formatMinutes + ':' + formatSeconds + : formatMinutes + ':' + formatSeconds; + }; + + playerInstance.pad = (value) => { + if (value < 10) { + return '0' + value; + } + return value; + }; + + /** + * Checks if element is fully visible in the viewport + * + * @param {Element} element + * @returns {boolean|null} + */ + playerInstance.isElementVisible = (element) => { + if (!element) { return null; } + + const rect = element.getBoundingClientRect(); + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && + rect.right <= (window.innerWidth || document.documentElement.clientWidth) + ); + } + + playerInstance.observe = () => { + var observer = new IntersectionObserver( + function (entries) { + entries.forEach(function (entry) { + if (entry.intersectionRatio >= 0.5) { + playerInstance.domRef.player.inView = true; + } + + if (entry.intersectionRatio == 0 && entry.target.glast) { + playerInstance.domRef.player.inView = false; + } + }); + }, + { + threshold: [0.0, 0.5], + }, + ); + + observer.observe(playerInstance.domRef.wrapper); + } + + /** + * Throttles callback by time + * + * @param callback + * @param time + * @returns {function(): void} + */ + playerInstance.throttle = function throttle(callback, time) { + let throttleControl = false; + + return function () { + if (!throttleControl) { + callback.apply(this, arguments); + throttleControl = true; + setTimeout(function () { + throttleControl = false; + }, time); + } + } + } + + playerInstance.getImageTwoMostProminentColours = (imageUrl) => { + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = 'Anonymous'; + img.src = imageUrl; + + img.onload = () => { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + canvas.width = img.width; + canvas.height = img.height; + ctx.drawImage(img, 0, 0, img.width, img.height); + const imageData = ctx.getImageData(0, 0, img.width, img.height).data; + + const colorCount = {}; + for (let i = 0; i < imageData.length; i += 4) { + const r = imageData[i]; + const g = imageData[i + 1]; + const b = imageData[i + 2]; + const color = `rgb(${r},${g},${b})`; + + if (colorCount[color]) { + colorCount[color]++; + } else { + colorCount[color] = 1; + } + } + + const rgbToHsl = (r, g, b) => { + r /= 255, g /= 255, b /= 255; + const max = Math.max(r, g, b), min = Math.min(r, g, b); + let h, s, l = (max + min) / 2; + + if (max === min) { + h = s = 0; + } else { + const d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + + return [h, s, l]; + }; + + const sortedColors = Object.keys(colorCount).map(color => { + const [r, g, b] = color.match(/\d+/g).map(Number); + const [h, s, l] = rgbToHsl(r, g, b); + return { color, h, s, l, score: s + (1 - Math.abs(2 * l - 1)) }; + }).sort((a, b) => b.score - a.score); + + const isCloseToBlack = (color) => { + const rgb = color.match(/\d+/g).map(Number); + const blackThreshold = 40; + return rgb[0] < blackThreshold && rgb[1] < blackThreshold && rgb[2] < blackThreshold; + }; + + const minHueDifference = 0.1; + const minSaturationDifference = 0.1; + const minLightnessDifference = 0.1; + + let mostVibrantColors = []; + + for (const colorObj of sortedColors) { + if (mostVibrantColors.length === 2) break; + if (!isCloseToBlack(colorObj.color)) { + const enoughDifference = mostVibrantColors.every(existingColor => { + const hueDifference = Math.abs(colorObj.h - existingColor.h); + const saturationDifference = Math.abs(colorObj.s - existingColor.s); + const lightnessDifference = Math.abs(colorObj.l - existingColor.l); + return ( + hueDifference >= minHueDifference && + saturationDifference >= minSaturationDifference && + lightnessDifference >= minLightnessDifference + ); + }); + if (enoughDifference) { + mostVibrantColors.push(colorObj); + } + } + } + + if (mostVibrantColors.length < 2) { + mostVibrantColors = sortedColors.slice(0, 2); + } + + resolve(mostVibrantColors.map(colorObj => colorObj.color)); + }; + + img.onerror = () => { + reject(new Error('Failed to load image')); + }; + }); + } +} diff --git a/client/fluid-player/src/modules/vast.js b/client/fluid-player/src/modules/vast.js new file mode 100644 index 0000000..b69735c --- /dev/null +++ b/client/fluid-player/src/modules/vast.js @@ -0,0 +1,1122 @@ +// @ts-check + +// VAST support module + +/* Type declarations */ + +/** + * @typedef {Object} RawAdTree + * @property {Array} children + * @property {XMLDocument} data + * @property {'inLine'|'wrapper'} tagType + * @property {boolean|undefined} fallbackOnNoAd + * @property {Array | undefined} wrappers +*/ + +/** + * @typedef {Object} RawAd + * @property {XMLDocument} data + * @property {Array} wrappers + * @property {'inLine' | 'wrapper'} tagType + */ + +/** + * @typedef {Object & RawAd} Ad + * @property {Array} clicktracking + * @property {string} errorUrl + * @property {Array} impressions + * @property {Array} viewImpression + * @property {Array} stopTracking + * @property {Array} tracking + * @property {number|null} sequence + * @property {number} duration + * @property {boolean} played + */ + +/** + * + * @param {import("../fluidplayer.js").FluidPlayer} playerInstance + * @param {unknown} options + */ +function vast(playerInstance, options) { + /** + * Gets CTA parameters from VAST and sets them on tempOptions + * + * Fallbacks to any value that is filled on the TitleCTA extension, but needs at least an url and a text + * + * @param {HTMLElement} titleCtaElement + * + * @param {any} tmpOptions + */ + playerInstance.setCTAFromVast = (titleCtaElement, tmpOptions) => { + if (playerInstance.displayOptions.vastOptions.adCTATextVast && titleCtaElement) { + const mobileText = playerInstance.extractNodeDataByTagName(titleCtaElement, 'MobileText'); + const desktopText = playerInstance.extractNodeDataByTagName(titleCtaElement, 'PCText'); + const link = + playerInstance.extractNodeDataByTagName(titleCtaElement, 'DisplayUrl') || + playerInstance.extractNodeDataByTagName(titleCtaElement, 'Link'); + const tracking = playerInstance.extractNodeDataByTagName(titleCtaElement, 'Tracking'); + const isMobile = window.matchMedia('(max-width: 768px)').matches; + + if ((desktopText || mobileText) && tracking) { + tmpOptions.titleCTA = { + text: isMobile ? + mobileText || desktopText : + desktopText || mobileText, + link: link || null, + tracking, + } + } + } + }; + + playerInstance.getClickThroughUrlFromLinear = (linear) => { + const videoClicks = linear.getElementsByTagName('VideoClicks'); + + if (videoClicks.length) { //There should be exactly 1 node + const clickThroughs = videoClicks[0].getElementsByTagName('ClickThrough'); + + if (clickThroughs.length) { + return playerInstance.extractNodeData(clickThroughs[0]); + } + } + + return false; + }; + + playerInstance.getVastAdTagUriFromWrapper = (xmlResponse) => { + const wrapper = xmlResponse.getElementsByTagName('Wrapper'); + + if (typeof wrapper !== 'undefined' && wrapper.length) { + const vastAdTagURI = wrapper[0].getElementsByTagName('VASTAdTagURI'); + + if (vastAdTagURI.length) { + return playerInstance.extractNodeData(vastAdTagURI[0]); + } + } + + return false; + }; + + playerInstance.hasInLine = (xmlResponse) => { + const inLine = xmlResponse.getElementsByTagName('InLine'); + return ((typeof inLine !== 'undefined') && inLine.length); + }; + + playerInstance.hasVastAdTagUri = (xmlResponse) => { + const vastAdTagURI = xmlResponse.getElementsByTagName('VASTAdTagURI'); + return ((typeof vastAdTagURI !== 'undefined') && vastAdTagURI.length); + }; + + playerInstance.getClickThroughUrlFromNonLinear = (nonLinear) => { + let result = ''; + const nonLinears = nonLinear.getElementsByTagName('NonLinear'); + + if (nonLinears.length) {//There should be exactly 1 node + const nonLinearClickThrough = nonLinear.getElementsByTagName('NonLinearClickThrough'); + if (nonLinearClickThrough.length) { + result = playerInstance.extractNodeData(nonLinearClickThrough[0]); + } + } + + return result; + }; + + playerInstance.getTrackingFromLinear = (linear) => { + const trackingEvents = linear.getElementsByTagName('TrackingEvents'); + + if (trackingEvents.length) {//There should be no more than one node + return trackingEvents[0].getElementsByTagName('Tracking'); + } + + return []; + }; + + playerInstance.getDurationFromLinear = (linear) => { + const duration = linear.getElementsByTagName('Duration'); + + if (duration.length && (typeof duration[0].childNodes[0] !== 'undefined')) { + const nodeDuration = playerInstance.extractNodeData(duration[0]); + return playerInstance.convertTimeStringToSeconds(nodeDuration); + } + + return false; + }; + + playerInstance.getDurationFromNonLinear = (tag) => { + let result = 0; + const nonLinear = tag.getElementsByTagName('NonLinear'); + if (nonLinear.length && (typeof nonLinear[0].getAttribute('minSuggestedDuration') !== 'undefined')) { + result = playerInstance.convertTimeStringToSeconds(nonLinear[0].getAttribute('minSuggestedDuration')); + } + return result; + }; + + playerInstance.getDimensionFromNonLinear = (tag) => { + const result = { 'width': null, 'height': null }; + const nonLinear = tag.getElementsByTagName('NonLinear'); + + if (nonLinear.length) { + if (typeof nonLinear[0].getAttribute('width') !== 'undefined') { + result.width = nonLinear[0].getAttribute('width'); + } + if (typeof nonLinear[0].getAttribute('height') !== 'undefined') { + result.height = nonLinear[0].getAttribute('height'); + } + } + + return result; + }; + + playerInstance.getCreativeTypeFromStaticResources = (tag) => { + let result = ''; + const nonLinears = tag.getElementsByTagName('NonLinear'); + + if (nonLinears.length && (typeof nonLinears[0].childNodes[0] !== 'undefined')) {//There should be exactly 1 StaticResource node + result = nonLinears[0].getElementsByTagName('StaticResource')[0].getAttribute('creativeType'); + } + + return result.toLowerCase(); + }; + + playerInstance.getMediaFilesFromLinear = (linear) => { + const mediaFiles = linear.getElementsByTagName('MediaFiles'); + + if (mediaFiles.length) {//There should be exactly 1 MediaFiles node + return mediaFiles[0].getElementsByTagName('MediaFile'); + } + + return []; + }; + + playerInstance.getStaticResourcesFromNonLinear = (linear) => { + let result = []; + const nonLinears = linear.getElementsByTagName('NonLinear'); + + if (nonLinears.length) {//There should be exactly 1 StaticResource node + result = nonLinears[0].getElementsByTagName('StaticResource'); + } + + return result; + }; + + /** + * Gets the first element found by tag name, and returns the element data + * + * @param {HTMLElement} parentNode + * + * @param {string} tagName + * + * @returns {string|null} + */ + playerInstance.extractNodeDataByTagName = (parentNode, tagName) => { + const element = parentNode.getElementsByTagName(tagName); + + if (element && element.length) { + return playerInstance.extractNodeData(element[0]); + } else { + return null; + } + }; + + playerInstance.extractNodeData = (parentNode) => { + let contentAsString = ""; + for (let n = 0; n < parentNode.childNodes.length; n++) { + const child = parentNode.childNodes[n]; + if (child.nodeType === 8 || (child.nodeType === 3 && /^\s*$/.test(child.nodeValue))) { + // Comments or text with no content + } else { + contentAsString += child.nodeValue; + } + } + return contentAsString.replace(/(^\s+|\s+$)/g, ''); + }; + + playerInstance.getAdParametersFromLinear = (linear) => { + const adParameters = linear.getElementsByTagName('AdParameters'); + let adParametersData = null; + + if (adParameters.length) { + adParametersData = playerInstance.extractNodeData(adParameters[0]); + } + + return adParametersData; + }; + + playerInstance.getMediaFileListFromLinear = (linear) => { + const mediaFileList = []; + const mediaFiles = playerInstance.getMediaFilesFromLinear(linear); + + if (!mediaFiles.length) { + return mediaFileList; + } + + for (let n = 0; n < mediaFiles.length; n++) { + let mediaType = mediaFiles[n].getAttribute('mediaType'); + + if (!mediaType) { + // if there is no mediaType attribute then the video is 2D + mediaType = '2D'; + } + + // get all the attributes of media file + mediaFileList.push({ + 'src': playerInstance.extractNodeData(mediaFiles[n]), + 'type': mediaFiles[n].getAttribute('type'), + 'apiFramework': mediaFiles[n].getAttribute('apiFramework'), + 'codec': mediaFiles[n].getAttribute('codec'), + 'id': mediaFiles[n].getAttribute('codec'), + 'fileSize': mediaFiles[n].getAttribute('fileSize'), + 'delivery': mediaFiles[n].getAttribute('delivery'), + 'width': mediaFiles[n].getAttribute('width'), + 'height': mediaFiles[n].getAttribute('height'), + 'mediaType': mediaType.toLowerCase() + }); + + } + + return mediaFileList; + }; + + playerInstance.getIconClickThroughFromLinear = (linear) => { + const iconClickThrough = linear.getElementsByTagName('IconClickThrough'); + + if (iconClickThrough.length) { + return playerInstance.extractNodeData(iconClickThrough[0]); + } + + return ''; + }; + + playerInstance.getStaticResourceFromNonLinear = (linear) => { + let fallbackStaticResource; + const staticResources = playerInstance.getStaticResourcesFromNonLinear(linear); + + for (let i = 0; i < staticResources.length; i++) { + if (!staticResources[i].getAttribute('type')) { + fallbackStaticResource = playerInstance.extractNodeData(staticResources[i]); + } + + if (staticResources[i].getAttribute('type') === playerInstance.displayOptions.staticResource) { + return playerInstance.extractNodeData(staticResources[i]); + } + } + + return fallbackStaticResource; + }; + + playerInstance.registerTrackingEvents = (creativeLinear, tmpOptions) => { + const trackingEvents = playerInstance.getTrackingFromLinear(creativeLinear); + let eventType = ''; + let oneEventOffset = 0; + + for (let i = 0; i < trackingEvents.length; i++) { + eventType = trackingEvents[i].getAttribute('event'); + + switch (eventType) { + case 'start': + case 'firstQuartile': + case 'midpoint': + case 'thirdQuartile': + case 'complete': + if (typeof tmpOptions.tracking[eventType] === 'undefined') { + tmpOptions.tracking[eventType] = []; + } + + if (typeof tmpOptions.stopTracking[eventType] === 'undefined') { + tmpOptions.stopTracking[eventType] = []; + } + tmpOptions.tracking[eventType].push(trackingEvents[i].textContent.trim()); + tmpOptions.stopTracking[eventType] = false; + + break; + + case 'progress': + if (typeof tmpOptions.tracking[eventType] === 'undefined') { + tmpOptions.tracking[eventType] = []; + } + + oneEventOffset = playerInstance.convertTimeStringToSeconds(trackingEvents[i].getAttribute('offset')); + + if (typeof tmpOptions.tracking[eventType][oneEventOffset] === 'undefined') { + tmpOptions.tracking[eventType][oneEventOffset] = { + elements: [], + stopTracking: false + }; + } + + tmpOptions.tracking[eventType][oneEventOffset].elements.push(trackingEvents[i].textContent.trim()); + + break; + + default: + break; + } + } + }; + + playerInstance.registerClickTracking = (clickTrackingTag, tmpOptions) => { + if (!clickTrackingTag || !clickTrackingTag.length) { + return; + } + + for (let i = 0; i < clickTrackingTag.length; i++) { + if (clickTrackingTag[i] === '') { + continue; + } + + tmpOptions.clicktracking.push(clickTrackingTag[i]); + } + + }; + + playerInstance.registerViewableImpressionEvents = (viewableImpressionTags, tmpOptions) => { + if (!viewableImpressionTags.length) { + return; + } + + for (let i = 0; i < viewableImpressionTags.length; i++) { + const viewableImpressionEvent = playerInstance.extractNodeData(viewableImpressionTags[i]); + tmpOptions.viewImpression.push(viewableImpressionEvent); + } + }; + + playerInstance.registerImpressionEvents = (impressionTags, tmpOptions) => { + if (!impressionTags.length) { + return; + } + + for (let i = 0; i < impressionTags.length; i++) { + const impressionEvent = playerInstance.extractNodeData(impressionTags[i]); + tmpOptions.impression.push(impressionEvent); + } + }; + + playerInstance.registerErrorEvents = (errorTags, tmpOptions) => { + if ((typeof errorTags !== 'undefined') && + (errorTags !== null) && + (errorTags.length === 1) && //Only 1 Error tag is expected + (errorTags[0].childNodes.length === 1)) { + tmpOptions.errorUrl = errorTags[0].childNodes[0].nodeValue; + } + }; + + playerInstance.announceError = (code) => { + if (typeof playerInstance.vastOptions.errorUrl === 'undefined' || !playerInstance.vastOptions.errorUrl) { + return; + } + + const parsedCode = typeof code !== 'undefined' ? parseInt(code) : 900; + const errorUrl = playerInstance.vastOptions.errorUrl.replace('[ERRORCODE]', parsedCode); + + //Send the error request + playerInstance.callUris([errorUrl]); + }; + + playerInstance.getClickTrackingEvents = (linear) => { + const result = []; + + const videoClicks = linear.getElementsByTagName('VideoClicks'); + + //There should be exactly 1 node + if (!videoClicks.length) { + return; + } + + const clickTracking = videoClicks[0].getElementsByTagName('ClickTracking'); + + if (!clickTracking.length) { + return; + } + + for (let i = 0; i < clickTracking.length; i++) { + const clickTrackingEvent = playerInstance.extractNodeData(clickTracking[i]); + result.push(clickTrackingEvent); + } + + return result; + }; + + playerInstance.getNonLinearClickTrackingEvents = (nonLinear) => { + const result = []; + const nonLinears = nonLinear.getElementsByTagName('NonLinear'); + + if (!nonLinears.length) { + return; + } + + const clickTracking = nonLinear.getElementsByTagName('NonLinearClickTracking'); + + if (!clickTracking.length) { + return; + } + + for (let i = 0; i < clickTracking.length; i++) { + const NonLinearClickTracking = playerInstance.extractNodeData(clickTracking[i]); + result.push(NonLinearClickTracking); + } + + return result; + }; + + // TODO: ??? + playerInstance.callUris = (uris) => { + for (let i = 0; i < uris.length; i++) { + new Image().src = uris[i]; + } + }; + + playerInstance.recalculateAdDimensions = () => { + const videoPlayer = playerInstance.domRef.player; + const divClickThrough = playerInstance.domRef.wrapper.querySelector('.vast_clickthrough_layer'); + + if (divClickThrough) { + divClickThrough.style.width = videoPlayer.offsetWidth + 'px'; + divClickThrough.style.height = videoPlayer.offsetHeight + 'px'; + } + + const requestFullscreenFunctionNames = playerInstance.checkFullscreenSupport(); + const fullscreenButton = playerInstance.domRef.wrapper.querySelector('.fluid_control_fullscreen'); + const menuOptionFullscreen = playerInstance.domRef.wrapper.querySelector('.context_option_fullscreen'); + + if (requestFullscreenFunctionNames) { + // this will go other way around because we already exited full screen + if (document[requestFullscreenFunctionNames.isFullscreen] === null) { + // Exit fullscreen + playerInstance.fullscreenOff(fullscreenButton, menuOptionFullscreen); + } else { + // Go fullscreen + playerInstance.fullscreenOn(fullscreenButton, menuOptionFullscreen); + } + } else { + // TODO: I am fairly certain this fallback does not work... + //The browser does not support the Fullscreen API, so a pseudo-fullscreen implementation is used + const fullscreenTag = playerInstance.domRef.wrapper; + + if (fullscreenTag.className.search(/\bpseudo_fullscreen\b/g) !== -1) { + fullscreenTag.className += ' pseudo_fullscreen'; + playerInstance.fullscreenOn(fullscreenButton, menuOptionFullscreen); + } else { + fullscreenTag.className = fullscreenTag.className.replace(/\bpseudo_fullscreen\b/g, ''); + playerInstance.fullscreenOff(fullscreenButton, menuOptionFullscreen); + } + } + }; + + /** + * Prepares VAST for instant ads + * + * @param roll + */ + playerInstance.prepareVast = (roll) => { + let list = playerInstance.findRoll(roll); + + for (let i = 0; i < list.length; i++) { + const rollListId = list[i]; + + if (!(playerInstance.rollsById[rollListId].vastLoaded !== true && playerInstance.rollsById[rollListId].error !== true)) { + continue; + } + + playerInstance.processVastWithRetries(playerInstance.rollsById[rollListId]); + } + }; + + playerInstance.playMainVideoWhenVastFails = (errorCode) => { + playerInstance.debugMessage('playMainVideoWhenVastFails called'); + playerInstance.domRef.player.removeEventListener('loadedmetadata', playerInstance.switchPlayerToVastMode); + playerInstance.domRef.player.pause(); + playerInstance.toggleLoader(false); + playerInstance.displayOptions.vastOptions.vastAdvanced.noVastVideoCallback(); + + if (!playerInstance.vastOptions || typeof playerInstance.vastOptions.errorUrl === 'undefined') { + playerInstance.announceLocalError(errorCode); + } else { + playerInstance.announceError(errorCode); + } + + playerInstance.switchToMainVideo(); + }; + + // TODO: ??? + playerInstance.switchPlayerToVastMode = () => { + }; + + /** + * Process the XML response + * + * @param ad + */ + function processAdCreatives(ad) { + const adElement = ad.data; + + if (!adElement) { + return; + } + + const creativeElements = Array.from(adElement.getElementsByTagName('Creative')); + + if (creativeElements.length) { + for (let i = 0; i < creativeElements.length; i++) { + const creativeElement = creativeElements[i]; + + try { + if (ad.adType === 'linear') { + const linearCreatives = creativeElement.getElementsByTagName('Linear'); + const creativeLinear = linearCreatives[0]; + + //Extract the Ad data if it is actually the Ad (!wrapper) + if (!playerInstance.hasVastAdTagUri(adElement) && playerInstance.hasInLine(adElement)) { + //Set initial values + ad.adFinished = false; + ad.vpaid = false; + + //Extract the necessary data from the Linear node + ad.skipoffset = playerInstance.convertTimeStringToSeconds(creativeLinear.getAttribute('skipoffset')); + ad.clickthroughUrl = playerInstance.getClickThroughUrlFromLinear(creativeLinear); + ad.duration = playerInstance.getDurationFromLinear(creativeLinear); + ad.mediaFileList = playerInstance.getMediaFileListFromLinear(creativeLinear); + ad.adParameters = playerInstance.getAdParametersFromLinear(creativeLinear); + ad.iconClick = ad.iconClick || playerInstance.getIconClickThroughFromLinear(creativeLinear); + + if (ad.adParameters) { + ad.vpaid = true; + } + } + } + + if (ad.adType === 'nonLinear') { + const nonLinearCreatives = creativeElement.getElementsByTagName('NonLinearAds'); + const creativeNonLinear = nonLinearCreatives[0]; + + //Extract the Ad data if it is actually the Ad (!wrapper) + if (!playerInstance.hasVastAdTagUri(adElement) && playerInstance.hasInLine(adElement)) { + //Set initial values + ad.vpaid = false; + + //Extract the necessary data from the NonLinear node + ad.clickthroughUrl = playerInstance.getClickThroughUrlFromNonLinear(creativeNonLinear); + ad.duration = playerInstance.getDurationFromNonLinear(creativeNonLinear); // VAST version < 4.0 + ad.dimension = playerInstance.getDimensionFromNonLinear(creativeNonLinear); // VAST version < 4.0 + ad.staticResource = playerInstance.getStaticResourceFromNonLinear(creativeNonLinear); + ad.creativeType = playerInstance.getCreativeTypeFromStaticResources(creativeNonLinear); + ad.adParameters = playerInstance.getAdParametersFromLinear(creativeNonLinear); + + if (ad.adParameters) { + ad.vpaid = true; + } + } + } + + // Current support is for only one creative element + // break the loop if creative was successful + break; + } catch (err) { + if (creativeElement.firstElementChild && + !(creativeElement.firstElementChild.tagName === 'Linear' || + creativeElement.firstElementChild.tagName === 'NonLinearAds')) { + console.warn('Skipping ' + creativeElement.firstElementChild.tagName + ', this might not be supported yet.') + } + console.error(err); + } + }; + } + + return ad; + } + + /** + * Parse the VAST Tag + * + * @param vastObj + */ + playerInstance.processVastWithRetries = (vastObj) => { + let vastTag = vastObj.vastTag; + const rollListId = vastObj.id; + + playerInstance.domRef.player.addEventListener('adId_' + rollListId, playerInstance[vastObj.roll]); + + const handleVastResult = function (pass, adOptionsList) { + if (pass && Array.isArray(adOptionsList) && !playerInstance.displayOptions.vastOptions.allowVPAID && adOptionsList.some(adOptions => adOptions.vpaid)) { + adOptionsList = adOptionsList.filter(adOptions => adOptions.vpaid !== true); + playerInstance.announceLocalError('103', 'VPAID not allowed, so skipping this VAST tag.') + } + + if (pass && Array.isArray(adOptionsList) && adOptionsList.length) { + + playerInstance.adPool[rollListId] = []; + + adOptionsList.forEach((tmpOptions, index) => { + tmpOptions.id = rollListId + '_AD' + index; + tmpOptions.rollListId = rollListId; + + if (tmpOptions.adType === 'linear') { + + if ((typeof tmpOptions.iconClick !== 'undefined') && (tmpOptions.iconClick !== null) && tmpOptions.iconClick.length) { + tmpOptions.landingPage = tmpOptions.iconClick; + } + + const selectedMediaFile = playerInstance.getSupportedMediaFileObject(tmpOptions.mediaFileList); + if (selectedMediaFile) { + tmpOptions.mediaType = selectedMediaFile.mediaType; + } + + } + + tmpOptions.adType = tmpOptions.adType ? tmpOptions.adType : 'unknown'; + playerInstance.adPool[rollListId].push(Object.assign({}, tmpOptions)); + + if (playerInstance.hasTitle()) { + const title = playerInstance.domRef.wrapper.querySelector('.fp_title'); + title.style.display = 'none'; + } + + playerInstance.rollsById[rollListId].ads.push(tmpOptions); + }); + + playerInstance.rollsById[rollListId].vastLoaded = true; + + const event = document.createEvent('Event'); + + event.initEvent('adId_' + rollListId, false, true); + playerInstance.domRef.player.dispatchEvent(event); + playerInstance.displayOptions.vastOptions.vastAdvanced.vastLoadedCallback(); + } else { + // when vast failed + playerInstance.announceLocalError('101'); + + if (vastObj.hasOwnProperty('fallbackVastTags') && vastObj.fallbackVastTags.length > 0) { + vastTag = vastObj.fallbackVastTags.shift(); + playerInstance.processUrl(vastTag, handleVastResult, rollListId); + } else { + if (vastObj.roll === 'preRoll') { + playerInstance.preRollFail(vastObj); + } + playerInstance.rollsById[rollListId].error = true; + } + } + }; + + playerInstance.processUrl(vastTag, handleVastResult, rollListId); + }; + + playerInstance.processUrl = (vastTag, callBack, rollListId) => { + const numberOfRedirects = 0; + + const tmpOptions = { + tracking: [], + stopTracking: [], + impression: [], + viewImpression: [], + clicktracking: [], + vastLoaded: false + }; + + playerInstance.resolveVastTag( + vastTag, + numberOfRedirects, + tmpOptions, + callBack, + rollListId + ); + }; + + /** + * Gets first stand-alone ad + * + * @param {Array} ads + * @returns {Array} + */ + function getFirstStandAloneAd(ads) { + for (const ad of ads) { + const isAdPod = ad.data.attributes.sequence !== undefined; + + if (!isAdPod) { + return [ad]; + } + } + + return []; + } + + /** + * Resolves ad requests recursively and returns a tree of "Ad" and "Wrapper" elements + * + * @param {string} url vast resource url + * @param {number} maxDepth depth of recursive calls (wrapper depth) + * @param {Partial} baseNode used for recursive calls as base node + * @param {number} currentDepth used internally to track depth + * @param {boolean} followAdditionalWrappers used internally to track nested wrapper calls + * @returns {Promise} + */ + async function resolveAdTreeRequests(url, maxDepth, baseNode = {}, currentDepth = 0, followAdditionalWrappers = true) { + const adTree = { ...baseNode, children: [] }; + const { responseXML } = await playerInstance.sendRequestAsync(url, true, playerInstance.displayOptions.vastOptions.vastTimeout); + const adElements = Array.from(responseXML.getElementsByTagName('Ad')); + + for (const adElement of adElements) { + const vastAdTagUri = playerInstance.getVastAdTagUriFromWrapper(adElement); + const isAdPod = adElement.attributes.sequence !== undefined; + const adNode = { data: adElement }; + + if (vastAdTagUri && currentDepth <= maxDepth && followAdditionalWrappers) { + const [wrapperElement] = adElement.getElementsByTagName('Wrapper'); + const disableAdditionalWrappers = wrapperElement.attributes.followAdditionalWrappers && ["false", "0"].includes(wrapperElement.attributes.followAdditionalWrappers.value); // See VAST Wrapper spec + const allowMultipleAds = wrapperElement.attributes.allowMultipleAds && ["true", "1"].includes(wrapperElement.attributes.allowMultipleAds.value); // See VAST Wrapper spec + const fallbackOnNoAd = wrapperElement.attributes.fallbackOnNoAd && ["true", "1"].includes(wrapperElement.attributes.fallbackOnNoAd.value); + + try { + const wrapperResponse = await resolveAdTreeRequests(vastAdTagUri, maxDepth, { tagType: 'wrapper', ...adNode, fallbackOnNoAd }, currentDepth+1, !disableAdditionalWrappers); + wrapperResponse.fallbackOnNoAd = fallbackOnNoAd; + + if (!allowMultipleAds || isAdPod) { + wrapperResponse.children = getFirstStandAloneAd(wrapperResponse.children); + } + + adTree.children.push(wrapperResponse); + } catch (e) { + adTree.children.push({ tagType: `wrapper`, fallbackOnNoAd, httpError: true }) + playerInstance.debugMessage(`Error when loading Wrapper, will trigger fallback if available`, e); + } + } else if (!vastAdTagUri) { + let mediaFileIsValid = true; + let mediaFileUrl = ''; + if (Array.from(adElement.getElementsByTagName('AdParameters')).length) { + const mediaFiles = Array.from(adElement.getElementsByTagName('AdParameters')); + mediaFileIsValid = false; + for (const mediaFile of mediaFiles) { + mediaFileUrl = mediaFile.textContent.trim(); + try { + const mediaFileObj = JSON.parse(mediaFileUrl); + mediaFileUrl = mediaFileObj.videos[0].url; + } catch (error) { + console.error("Error parsing media file URL:", error); + } + } + } else if (Array.from(adElement.getElementsByTagName('MediaFiles')).length) { + const mediaFiles = Array.from(adElement.getElementsByTagName('MediaFiles')); + const mediaFile = mediaFiles[0].getElementsByTagName('MediaFile'); + mediaFileIsValid = false; + for (const mediaFileTemp of mediaFile) { + mediaFileUrl = mediaFileTemp.textContent.trim(); + } + }; + mediaFileIsValid = await validateMediaFile(mediaFileUrl); + if (mediaFileIsValid) { + adTree.children.push({ tagType: 'inLine', mediaFileUrl, ...adNode }); + break; + } else { + adTree.children.push({ tagType: 'inLine', mediaError: true, ...adNode }); + playerInstance.debugMessage(`No valid media file found in Inline ad.`); + } + } + } + + return adTree; + } + + + /** + * Validate Media File to check if videos play + * + * @param {mediaFileUrl} + */ + async function validateMediaFile(mediaFileUrl) { + try { + const response = await fetch(mediaFileUrl); + if (!response.ok || response.headers.get('content-type').indexOf('video') === -1) { + return false; + } + const videoElement = document.createElement('video'); + videoElement.src = mediaFileUrl; + const canPlay = await videoElement.canPlayType(response.headers.get('content-type')); + return canPlay !== ""; + } catch (error) { + console.error('Failed to load media file:', error); + return false; + } + } + + /** + * Transforms an Ad Tree to a 1-dimensional array of Ads with wrapper data attached to each ad + * + * @param {RawAdTree} root + * @param {Array} ads + * @param {Array} wrappers + * @returns {Array} + */ + function flattenAdTree(root, ads = [], wrappers = []) { + const currentWrappers = [...wrappers, root.data]; + + if (Array.isArray(root.children) && root.children.length) { + root.children.forEach(child => flattenAdTree(child, ads, currentWrappers)); + } + + if (root.tagType === 'inLine') { + ads.push({ ...root, wrappers: currentWrappers.filter(Boolean) }); + } + + return ads; + } + + /** + * Register Ad element properties to an Ad based on its data and its wrapper data if available + * + * @param {RawAd} rawAd + * @param {{ tracking: Array, stopTracking: Array, impression: Array, viewImpression: Array, clicktracking: Array }} options + * @returns {Ad} + */ + function registerAdProperties(rawAd, options) { + const ad = { ...rawAd, ...JSON.parse(JSON.stringify(options)) }; + + ad.adType = (ad.data.getElementsByTagName('Linear').length && 'linear') || + (ad.data.getElementsByTagName('NonLinearAds').length && 'nonLinear') || 'unknown'; + + [...(ad.wrappers || []), ad.data].filter(Boolean).forEach(dataSource => { + // Register impressions + const impression = dataSource.getElementsByTagName('Impression'); + if (impression !== null) { + playerInstance.registerImpressionEvents(impression, ad); + } + + // Register viewable impressions + const viewableImpression = dataSource.getElementsByTagName('Viewable'); + if (viewableImpression !== null) { + playerInstance.registerViewableImpressionEvents(viewableImpression, ad); + } + + // Get the error tag, if any + const errorTags = dataSource.getElementsByTagName('Error'); + if (errorTags !== null) { + playerInstance.registerErrorEvents(errorTags, ad); + } + + // Sets CTA from vast + const [titleCta] = dataSource.getElementsByTagName('TitleCTA'); + if (titleCta) { + playerInstance.setCTAFromVast(titleCta, ad); + } + + // Register tracking events + playerInstance.registerTrackingEvents(dataSource, ad); + const clickTracks = ad.adType === 'linear' ? + playerInstance.getClickTrackingEvents(dataSource) : + playerInstance.getNonLinearClickTrackingEvents(dataSource); + playerInstance.registerClickTracking(clickTracks, ad); + }); + + ad.sequence = ad.data.attributes.sequence ? Number(ad.data.attributes.sequence.value) : null; + ad.played = false; + + return ad; + } + + /** + * Handles selection of ad pod or standalone ad to be played + * + * @param {Array} ads + * @param {number} maxDuration + * @param {number} maxQuantity + * @param {boolean} forceStandAloneAd + */ + function getPlayableAds(ads, maxDuration, maxQuantity, forceStandAloneAd) { + const { adPod } = ads + .filter(ad => Boolean(ad.sequence)) + .sort((adX, adY) => adX.sequence - adY.sequence) + .reduce((playableAds, ad) => { + if (playableAds.adPod.length < maxQuantity && (playableAds.totalDuration + ad.duration) <= maxDuration) { + playableAds.adPod.push(ad); + } + + return playableAds; + }, { adPod: [], totalDuration: 0 }); + const adBuffet = ads.filter(ad => !Boolean(ad.sequence) && ad.duration < maxDuration); + + const isValidAdPodFormats = adPod.map(ad => ad.adType).slice(0, -1).every(adType => adType === 'linear'); + + if (adPod.length > 0 && !forceStandAloneAd && isValidAdPodFormats) { + playerInstance.debugMessage('Playing valid adPod', adPod); + return adPod; + } else { + playerInstance.debugMessage('Trying to play single ad, adBuffet:', adBuffet); + return adBuffet.length > 0 ? [adBuffet[0]] : []; + } + } + + /** + * @param vastTag + * @param numberOfRedirects + * @param tmpOptions + * @param callback + * @param rollListId + */ + playerInstance.resolveVastTag = (vastTag, numberOfRedirects, tmpOptions, callback, rollListId) => { + if (!vastTag || vastTag === '') { + return callback(false); + } + + resolveAdTreeRequests(vastTag, playerInstance.displayOptions.vastOptions.maxAllowedVastTagRedirects) + .then(result => { + try { + /** @see VAST 4.0 Wrapper.fallbackOnNoAd */ + const triggerFallbackOnNoAd = result.children.some(ad => + ad.tagType === 'wrapper' && ad.fallbackOnNoAd && (!/"tagType":"ad"/.test(JSON.stringify(ad)) || ad.httpError) + ); + + if (triggerFallbackOnNoAd) { + playerInstance.debugMessage('Error on VAST Wrapper, triggering fallbackOnNoAd. Ad tree:', result); + } + + result = flattenAdTree(result).map(ad => processAdCreatives(registerAdProperties(ad, tmpOptions))); + + const playableAds = getPlayableAds( + result, + playerInstance.rollsById[rollListId].maxTotalDuration || Number.MAX_SAFE_INTEGER, + playerInstance.rollsById[rollListId].maxTotalQuantity || Number.MAX_SAFE_INTEGER, + triggerFallbackOnNoAd, + ); + + (playableAds && playableAds.length) ? callback(true, playableAds) : callback(false); + } catch (error) { + callback(false); + } + }) + .catch(() => { + return callback(false); + }); + }; + + playerInstance.setVastList = () => { + const rolls = {}; + const rollsGroupedByType = { preRoll: [], postRoll: [], midRoll: [], onPauseRoll: [] }; + const def = { + id: null, + roll: null, + vastLoaded: false, + error: false, + adText: null, + adTextPosition: null, + }; + let idPart = 0; + + const validateVastList = function (item) { + let hasError = false; + + if (item.roll === 'midRoll') { + if (typeof item.timer === 'undefined') { + hasError = true; + } + } + + return hasError; + }; + + const validateRequiredParams = function (item) { + let hasError = false; + + if (!item.vastTag) { + playerInstance.announceLocalError(102, '"vastTag" property is missing from adList.'); + hasError = true; + } + + if (!item.roll) { + playerInstance.announceLocalError(102, '"roll" is missing from adList.'); + hasError = true; + } + + if (playerInstance.availableRolls.indexOf(item.roll) === -1) { + playerInstance.announceLocalError(102, 'Only ' + playerInstance.availableRolls.join(',') + ' rolls are supported.'); + hasError = true; + } + + if (item.size && playerInstance.supportedNonLinearAd.indexOf(item.size) === -1) { + playerInstance.announceLocalError(102, 'Only ' + playerInstance.supportedNonLinearAd.join(',') + ' size are supported.'); + hasError = true; + } + + return hasError; + }; + + if (playerInstance.displayOptions.vastOptions.hasOwnProperty('adList')) { + + for (let key in playerInstance.displayOptions.vastOptions.adList) { + + let rollItem = playerInstance.displayOptions.vastOptions.adList[key]; + + if (validateRequiredParams(rollItem)) { + playerInstance.announceLocalError(102, 'Wrong adList parameters.'); + continue; + } + const id = 'ID' + idPart; + + rolls[id] = Object.assign({}, def); + rolls[id] = Object.assign(rolls[id], playerInstance.displayOptions.vastOptions.adList[key]); + if (rollItem.roll === 'midRoll') { + rolls[id].error = validateVastList('midRoll', rollItem); + } + rolls[id].id = id; + rolls[id].ads = []; + idPart++; + + } + } + + // group the ads by roll + // pushing object references and forming json + Object.keys(rolls).map(function (e) { + switch (rolls[e].roll.toLowerCase()) { + case 'preRoll'.toLowerCase(): + rollsGroupedByType.preRoll.push(rolls[e]); + break; + case 'midRoll'.toLowerCase(): + rollsGroupedByType.midRoll.push(rolls[e]); + break; + case 'postRoll'.toLowerCase(): + rollsGroupedByType.postRoll.push(rolls[e]); + break; + case 'onPauseRoll'.toLowerCase(): + rollsGroupedByType.onPauseRoll.push(rolls[e]); + break; + default: + console.error(`${rolls[e].roll.toLowerCase()} is not a recognized roll`); + break; + } + }); + + playerInstance.adGroupedByRolls = rollsGroupedByType; + playerInstance.rollsById = rolls; + }; + + playerInstance.onVastAdEnded = (event) => { + if (event) { + event.stopImmediatePropagation(); + } + playerInstance.vastOptions.adFinished = true; + //"this" is the HTML5 video tag, because it dispatches the "ended" event + playerInstance.deleteVastAdElements(); + playerInstance.checkForNextAd(); + }; + + playerInstance.vastLogoBehaviour = (vastPlaying) => { + if (!playerInstance.displayOptions.layoutControls.logo.showOverAds) { + const logoHolder = playerInstance.domRef.wrapper.querySelector('.logo_holder'); + + if (!logoHolder) { + return; + } + + logoHolder.style.display = vastPlaying ? 'none' : 'inline'; + } + }; + + playerInstance.deleteVastAdElements = () => { + playerInstance.removeClickthrough(); + playerInstance.removeSkipButton(); + playerInstance.removeAdCountdown(); + playerInstance.removeAdPlayingText(); + playerInstance.removeCTAButton(); + playerInstance.vastLogoBehaviour(false); + }; +} + +export default vast diff --git a/client/fluid-player/src/modules/vpaid.js b/client/fluid-player/src/modules/vpaid.js new file mode 100644 index 0000000..6bb3f82 --- /dev/null +++ b/client/fluid-player/src/modules/vpaid.js @@ -0,0 +1,543 @@ +// VPAID support module +export default function (playerInstance, options) { + const callbacks = { + AdStarted: () => playerInstance.onStartVpaidAd, + AdStopped: () => playerInstance.onStopVpaidAd, + AdSkipped: () => playerInstance.onSkipVpaidAd, + AdLoaded: () => playerInstance.onVpaidAdLoaded, + AdLinearChange: () => playerInstance.onVpaidAdLinearChange, + AdSizeChange: () => playerInstance.onVpaidAdSizeChange, + AdExpandedChange: () => playerInstance.onVpaidAdExpandedChange, + AdSkippableStateChange: () => playerInstance.onVpaidAdSkippableStateChange, + AdDurationChange: () => playerInstance.onVpaidAdDurationChange, + AdRemainingTimeChange: () => playerInstance.onVpaidAdRemainingTimeChange, + AdVolumeChange: () => playerInstance.onVpaidAdVolumeChange, + AdImpression: () => playerInstance.onVpaidAdImpression, + AdClickThru: () => playerInstance.onVpaidAdClickThru, + AdInteraction: () => playerInstance.onVpaidAdInteraction, + AdVideoStart: () => playerInstance.onVpaidAdVideoStart, + AdVideoFirstQuartile: () => playerInstance.onVpaidAdVideoFirstQuartile, + AdVideoMidpoint: () => playerInstance.onVpaidAdVideoMidpoint, + AdVideoThirdQuartile: () => playerInstance.onVpaidAdVideoThirdQuartile, + AdVideoComplete: () => playerInstance.onVpaidAdVideoComplete, + AdUserAcceptInvitation: () => playerInstance.onVpaidAdUserAcceptInvitation, + AdUserMinimize: () => playerInstance.onVpaidAdUserMinimize, + AdUserClose: () => playerInstance.onVpaidAdUserClose, + AdPaused: () => playerInstance.onVpaidAdPaused, + AdPlaying: () => playerInstance.onVpaidAdPlaying, + AdError: () => playerInstance.onVpaidAdError, + AdLog: () => playerInstance.onVpaidAdLog + }; + + playerInstance.checkVPAIDInterface = (vpaidAdUnit) => { + const VPAIDCreative = vpaidAdUnit; + // checks if all the mandatory params present + return !!(VPAIDCreative.handshakeVersion && typeof VPAIDCreative.handshakeVersion == "function" + && VPAIDCreative.initAd && typeof VPAIDCreative.initAd == "function" + && VPAIDCreative.startAd && typeof VPAIDCreative.startAd == "function" + && VPAIDCreative.stopAd && typeof VPAIDCreative.stopAd == "function" + && VPAIDCreative.skipAd && typeof VPAIDCreative.skipAd == "function" + && VPAIDCreative.resizeAd && typeof VPAIDCreative.resizeAd == "function" + && VPAIDCreative.pauseAd && typeof VPAIDCreative.pauseAd == "function" + && VPAIDCreative.resumeAd && typeof VPAIDCreative.resumeAd == "function" + && VPAIDCreative.expandAd && typeof VPAIDCreative.expandAd == "function" + && VPAIDCreative.collapseAd && typeof VPAIDCreative.collapseAd == "function" + && VPAIDCreative.subscribe && typeof VPAIDCreative.subscribe == "function" + && VPAIDCreative.unsubscribe && typeof VPAIDCreative.unsubscribe == "function"); + }; + + // Callback for AdPaused + playerInstance.onVpaidAdPaused = () => { + playerInstance.vpaidTimeoutTimerClear(); + playerInstance.debugMessage("onAdPaused"); + }; + + // Callback for AdPlaying + playerInstance.onVpaidAdPlaying = () => { + playerInstance.vpaidTimeoutTimerClear(); + playerInstance.debugMessage("onAdPlaying"); + }; + + // Callback for AdError + playerInstance.onVpaidAdError = (message) => { + playerInstance.debugMessage("onAdError: " + message); + playerInstance.vpaidTimeoutTimerClear(); + playerInstance.onVpaidEnded(); + }; + + // Callback for AdLog + playerInstance.onVpaidAdLog = (message) => { + playerInstance.debugMessage("onAdLog: " + message); + }; + + // Callback for AdUserAcceptInvitation + playerInstance.onVpaidAdUserAcceptInvitation = () => { + playerInstance.debugMessage("onAdUserAcceptInvitation"); + }; + + // Callback for AdUserMinimize + playerInstance.onVpaidAdUserMinimize = () => { + playerInstance.debugMessage("onAdUserMinimize"); + }; + + // Callback for AdUserClose + playerInstance.onVpaidAdUserClose = () => { + playerInstance.debugMessage("onAdUserClose"); + }; + + // Callback for AdUserClose + playerInstance.onVpaidAdSkippableStateChange = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.debugMessage("Ad Skippable State Changed to: " + playerInstance.vpaidAdUnit.getAdSkippableState()); + }; + + // Callback for AdUserClose + playerInstance.onVpaidAdExpandedChange = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.debugMessage("Ad Expanded Changed to: " + playerInstance.vpaidAdUnit.getAdExpanded()); + }; + + // Pass through for getAdExpanded + playerInstance.getVpaidAdExpanded = () => { + playerInstance.debugMessage("getAdExpanded"); + + if (!playerInstance.vpaidAdUnit) { + return; + } + + return playerInstance.vpaidAdUnit.getAdExpanded(); + }; + + // Pass through for getAdSkippableState + playerInstance.getVpaidAdSkippableState = () => { + playerInstance.debugMessage("getAdSkippableState"); + + if (!playerInstance.vpaidAdUnit) { + return; + } + return playerInstance.vpaidAdUnit.getAdSkippableState(); + }; + + // Callback for AdSizeChange + playerInstance.onVpaidAdSizeChange = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.debugMessage("Ad size changed to: w=" + playerInstance.vpaidAdUnit.getAdWidth() + " h=" + playerInstance.vpaidAdUnit.getAdHeight()); + }; + + // Callback for AdDurationChange + playerInstance.onVpaidAdDurationChange = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.debugMessage("Ad Duration Changed to: " + playerInstance.vpaidAdUnit.getAdDuration()); + }; + + // Callback for AdRemainingTimeChange + playerInstance.onVpaidAdRemainingTimeChange = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.debugMessage("Ad Remaining Time Changed to: " + playerInstance.vpaidAdUnit.getAdRemainingTime()); + }; + + // Pass through for getAdRemainingTime + playerInstance.getVpaidAdRemainingTime = () => { + playerInstance.debugMessage("getAdRemainingTime"); + if (!playerInstance.vpaidAdUnit) { + return; + } + return playerInstance.vpaidAdUnit.getAdRemainingTime(); + }; + + // Callback for AdImpression + playerInstance.onVpaidAdImpression = () => { + playerInstance.debugMessage("Ad Impression"); + + //Announce the impressions + playerInstance.trackSingleEvent('impression'); + }; + + // Callback for AdClickThru + playerInstance.onVpaidAdClickThru = (url, id, playerHandles) => { + playerInstance.debugMessage("Clickthrough portion of the ad was clicked"); + + // if playerHandles flag is set to true + // then player need to open click thorough url in new window + if (playerHandles) { + window.open(playerInstance.vastOptions.clickthroughUrl); + } + + playerInstance.pauseVpaidAd(); + // fire click tracking + playerInstance.callUris(playerInstance.vastOptions.clicktracking); + }; + + // Callback for AdInteraction + playerInstance.onVpaidAdInteraction = (id) => { + playerInstance.debugMessage("A non-clickthrough event has occured"); + }; + + // Callback for AdVideoStart + playerInstance.onVpaidAdVideoStart = () => { + playerInstance.debugMessage("Video 0% completed"); + playerInstance.trackSingleEvent('start'); + }; + + // Callback for AdUserClose + playerInstance.onVpaidAdVideoFirstQuartile = () => { + playerInstance.debugMessage("Video 25% completed"); + playerInstance.trackSingleEvent('firstQuartile'); + }; + + // Callback for AdUserClose + playerInstance.onVpaidAdVideoMidpoint = () => { + playerInstance.debugMessage("Video 50% completed"); + playerInstance.trackSingleEvent('midpoint'); + }; + + // Callback for AdUserClose + playerInstance.onVpaidAdVideoThirdQuartile = () => { + playerInstance.debugMessage("Video 75% completed"); + playerInstance.trackSingleEvent('thirdQuartile'); + }; + + // Callback for AdVideoComplete + playerInstance.onVpaidAdVideoComplete = () => { + playerInstance.debugMessage("Video 100% completed"); + playerInstance.trackSingleEvent('complete'); + }; + + // Callback for AdLinearChange + playerInstance.onVpaidAdLinearChange = () => { + const vpaidNonLinearSlot = playerInstance.domRef.wrapper.getElementsByClassName("fluid_vpaidNonLinear_ad")[0]; + const closeBtn = playerInstance.domRef.wrapper.querySelector('.close_button'); + const adListId = vpaidNonLinearSlot.getAttribute('adlistid'); + playerInstance.debugMessage("Ad linear has changed: " + playerInstance.vpaidAdUnit.getAdLinear()); + + if (!playerInstance.vpaidAdUnit.getAdLinear()) { + return; + } + + playerInstance.backupMainVideoContentTime(adListId.split('_')[0]); + playerInstance.isCurrentlyPlayingAd = true; + + if (closeBtn) { + closeBtn.remove(); + } + + vpaidNonLinearSlot.className = 'fluid_vpaid_slot'; + playerInstance.domRef.player.loop = false; + playerInstance.domRef.player.removeAttribute('controls'); + + const progressbarContainer = playerInstance.domRef.player.parentNode.getElementsByClassName('fluid_controls_currentprogress'); + + for (let i = 0; i < progressbarContainer.length; i++) { + progressbarContainer[i].style.backgroundColor = playerInstance.displayOptions.layoutControls.adProgressColor; + } + + playerInstance.toggleLoader(false); + }; + + // Pass through for getAdLinear + playerInstance.getVpaidAdLinear = () => { + playerInstance.debugMessage("getAdLinear"); + return playerInstance.vpaidAdUnit.getAdLinear(); + }; + + // Pass through for startAd() + playerInstance.startVpaidAd = () => { + playerInstance.debugMessage("startAd"); + playerInstance.vpaidTimeoutTimerStart(); + playerInstance.vpaidAdUnit.startAd(); + }; + + // Callback for AdLoaded + playerInstance.onVpaidAdLoaded = () => { + playerInstance.debugMessage("ad has been loaded"); + // start the video play as vpaid is loaded successfully + playerInstance.vpaidTimeoutTimerClear(); + playerInstance.startVpaidAd(); + }; + + // Callback for StartAd() + playerInstance.onStartVpaidAd = () => { + playerInstance.debugMessage("Ad has started"); + playerInstance.vpaidTimeoutTimerClear(); + }; + + // Pass through for stopAd() + playerInstance.stopVpaidAd = () => { + playerInstance.vpaidTimeoutTimerStart(); + playerInstance.vpaidAdUnit.stopAd(); + }; + + // Hard Pass through for stopAd() excluding deleteOtherVpaidAdsApart + playerInstance.hardStopVpaidAd = (ad) => { + // this is hard stop of vpaid ads + // we delete all the vpaid assets so the new one can be loaded + // delete all assets apart from the ad from deleteOtherVpaidAdsApart + if (playerInstance.vpaidAdUnit) { + playerInstance.vpaidAdUnit.stopAd(); + playerInstance.vpaidAdUnit = null; + } + + const vpaidIframes = playerInstance.domRef.wrapper.getElementsByClassName("fluid_vpaid_iframe"); + const vpaidSlots = playerInstance.domRef.wrapper.getElementsByClassName("fluid_vpaid_slot"); + const vpaidNonLinearSlots = playerInstance.domRef.wrapper.getElementsByClassName("fluid_vpaidNonLinear_ad"); + + for (let i = 0; i < vpaidIframes.length; i++) { + if (vpaidIframes[i].getAttribute('adListId') !== ad.id) { + vpaidIframes[i].remove(); + } + } + + for (let j = 0; j < vpaidSlots.length; j++) { + if (vpaidSlots[j].getAttribute('adListId') !== ad.id) { + vpaidSlots[j].remove(); + } + } + + for (let k = 0; k < vpaidNonLinearSlots.length; k++) { + if (vpaidNonLinearSlots[k].getAttribute('adListId') !== ad.id) { + vpaidNonLinearSlots[k].remove(); + } + } + }; + + // Callback for AdUserClose + playerInstance.onStopVpaidAd = () => { + playerInstance.debugMessage("Ad has stopped"); + playerInstance.vpaidTimeoutTimerClear(); + playerInstance.onVpaidEnded(); + }; + + // Callback for AdUserClose + playerInstance.onSkipVpaidAd = () => { + playerInstance.debugMessage("Ad was skipped"); + + playerInstance.vpaidTimeoutTimerClear(); + playerInstance.onVpaidEnded(); + }; + + // Passthrough for skipAd + playerInstance.skipVpaidAd = () => { + playerInstance.vpaidTimeoutTimerStart(); + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.vpaidAdUnit.skipAd() + playerInstance.vpaidTimeoutTimerClear(); + playerInstance.onVpaidEnded(); + }; + + // Passthrough for setAdVolume + playerInstance.setVpaidAdVolume = (val) => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.vpaidAdUnit.setAdVolume(val); + }; + + // Passthrough for getAdVolume + playerInstance.getVpaidAdVolume = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + return playerInstance.vpaidAdUnit.getAdVolume(); + }; + + // Callback for AdVolumeChange + playerInstance.onVpaidAdVolumeChange = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.debugMessage("Ad Volume has changed to - " + playerInstance.vpaidAdUnit.getAdVolume()); + }; + + playerInstance.resizeVpaidAuto = () => { + if (playerInstance.vastOptions !== null && playerInstance.vastOptions.vpaid && playerInstance.vastOptions.linear) { + const adWidth = playerInstance.domRef.player.offsetWidth; + const adHeight = playerInstance.domRef.player.offsetHeight; + const mode = (playerInstance.fullscreenMode ? 'fullscreen' : 'normal'); + playerInstance.resizeVpaidAd(adWidth, adHeight, mode); + } + }; + + // Passthrough for resizeAd + playerInstance.resizeVpaidAd = (width, height, viewMode) => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.vpaidAdUnit.resizeAd(width, height, viewMode); + }; + + // Passthrough for pauseAd() + playerInstance.pauseVpaidAd = () => { + playerInstance.vpaidTimeoutTimerStart(); + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.vpaidAdUnit.pauseAd(); + }; + + // Passthrough for resumeAd() + playerInstance.resumeVpaidAd = () => { + playerInstance.vpaidTimeoutTimerStart(); + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.vpaidAdUnit.resumeAd(); + }; + + // Passthrough for expandAd() + playerInstance.expandVpaidAd = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.vpaidAdUnit.expandAd(); + }; + + // Passthrough for collapseAd() + playerInstance.collapseVpaidAd = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + playerInstance.vpaidAdUnit.collapseAd(); + }; + + playerInstance.vpaidTimeoutTimerClear = () => { + if (playerInstance.vpaidTimer) { + clearTimeout(playerInstance.vpaidTimer); + } + }; + + // placeholder for timer function + playerInstance.vpaidTimeoutTimerStart = () => { + // clear previous timer if any + playerInstance.vpaidTimeoutTimerClear(); + playerInstance.vpaidTimer = setTimeout(function () { + playerInstance.announceLocalError('901'); + playerInstance.onVpaidEnded(); + }, playerInstance.displayOptions.vastOptions.vpaidTimeout); + }; + + playerInstance.vpaidCallbackListenersAttach = () => { + // The key of the object is the event name and the value is a reference to the callback function that is registered with the creative + // Looping through the object and registering each of the callbacks with the creative + for (let eventName in callbacks) { + playerInstance.vpaidAdUnit.subscribe(callbacks[eventName](), eventName, playerInstance); + } + }; + + playerInstance.vpaidCallbackListenersDetach = () => { + if (!playerInstance.vpaidAdUnit) { + return; + } + for (let eventName in callbacks) { + playerInstance.vpaidAdUnit.unsubscribe(callbacks[eventName](), eventName, playerInstance); + } + }; + + playerInstance.loadVpaid = (ad, vpaidJsUrl) => { + const vpaidIframe = document.createElement('iframe'); + vpaidIframe.id = "fp_" + ad.id + "_fluid_vpaid_iframe"; + vpaidIframe.className = 'fluid_vpaid_iframe'; + vpaidIframe.setAttribute('adListId', ad.id); + vpaidIframe.setAttribute('frameborder', '0'); + + playerInstance.domRef.player.parentNode.insertBefore(vpaidIframe, playerInstance.domRef.player.nextSibling); + + const vpaidJsScriptElement = document.createElement('script'); + vpaidJsScriptElement.src = vpaidJsUrl; + + vpaidIframe.contentWindow.document.head.append(vpaidJsScriptElement); + + // set interval with timeout + playerInstance.tempVpaidCounter = 0; + playerInstance.getVPAIDAdInterval = setInterval(function () { + if (vpaidIframe && vpaidIframe.contentWindow) { + const fn = vpaidIframe.contentWindow['getVPAIDAd']; + + // check if JS is loaded fully in iframe + if (fn && typeof fn == 'function') { + + if (playerInstance.vpaidAdUnit) { + playerInstance.hardStopVpaidAd(ad); + } + + playerInstance.vpaidAdUnit = fn(); + clearInterval(playerInstance.getVPAIDAdInterval); + if (playerInstance.checkVPAIDInterface(playerInstance.vpaidAdUnit)) { + + if (playerInstance.getVpaidAdLinear()) { + playerInstance.isCurrentlyPlayingAd = true; + playerInstance.switchPlayerToVpaidMode(ad); + } else { + playerInstance.debugMessage('non linear vpaid ad is loaded'); + playerInstance.loadVpaidNonlinearAssets(ad); + } + + } + + } else { + + // video player will wait for 2seconds if vpaid is not loaded, then it will declare vast error and move ahead + playerInstance.tempVpaidCounter++; + if (playerInstance.tempVpaidCounter >= 20) { + clearInterval(playerInstance.getVPAIDAdInterval); + playerInstance.rollsById[ad.rollListId].error = true; + playerInstance.playMainVideoWhenVpaidFails(403); + return false; + } else { + playerInstance.debugMessage(playerInstance.tempVpaidCounter); + } + + } + } + + }, 100); + + playerInstance.destructors.push(() => clearInterval(playerInstance.getVPAIDAdInterval)); + + }; + + playerInstance.onVpaidEnded = (event) => { + if (event) { + event.stopImmediatePropagation(); + } + + if (!playerInstance.vpaidAdUnit) { + return; + } + + const vpaidSlot = playerInstance.domRef.wrapper.querySelector('.fluid_vpaid_slot'); + + playerInstance.vpaidCallbackListenersDetach(); + + playerInstance.vpaidAdUnit = null; + clearInterval(playerInstance.getVPAIDAdInterval); + + if (!!vpaidSlot) { + vpaidSlot.remove(); + } + + playerInstance.checkForNextAd(); + }; + + playerInstance.playMainVideoWhenVpaidFails = (errorCode) => { + const vpaidSlot = playerInstance.domRef.wrapper.querySelector('.fluid_vpaid_slot'); + + if (vpaidSlot) { + vpaidSlot.remove(); + } + + clearInterval(playerInstance.getVPAIDAdInterval); + playerInstance.playMainVideoWhenVastFails(errorCode); + }; +} diff --git a/client/fluid-player/src/polyfills.js b/client/fluid-player/src/polyfills.js new file mode 100644 index 0000000..b30b8eb --- /dev/null +++ b/client/fluid-player/src/polyfills.js @@ -0,0 +1,77 @@ + +import promisePolyfill from 'es6-promise'; + +// Object.assign polyfill +if (typeof Object.assign != 'function') { + // Must be writable: true, enumerable: false, configurable: true + Object.defineProperty(Object, 'assign', { + value: function assign(target, varArgs) { // .length of function is 2 + 'use strict'; + if (target == null) { // TypeError if undefined or null + throw new TypeError('Cannot convert undefined or null to object'); + } + + const to = Object(target); + + for (let index = 1; index < arguments.length; index++) { + const nextSource = arguments[index]; + + if (nextSource != null) { // Skip over if undefined or null + for (let nextKey in nextSource) { + // Avoid bugs when hasOwnProperty is shadowed + if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { + to[nextKey] = nextSource[nextKey]; + } + } + } + } + return to; + }, + writable: true, + configurable: true + }); +} + +// CustomEvent polyfill +(function () { + if (typeof globalThis.CustomEvent === 'function') return false; + + function CustomEvent(event, params) { + params = params || {bubbles: false, cancelable: false, detail: undefined}; + const evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + } + + CustomEvent.prototype = globalThis.Event.prototype; + + globalThis.CustomEvent = CustomEvent; +})(); + +// .remove() polyfill +if ( + typeof globalThis.Element !== 'undefined' && + typeof globalThis.CharacterData !== 'undefined' && + typeof globalThis.DocumentType !== 'undefined' +) { + (function (arr) { + arr.forEach(function (item) { + if (item.hasOwnProperty('remove')) { + return; + } + Object.defineProperty(item, 'remove', { + configurable: true, + enumerable: true, + writable: true, + value: function remove() { + if (this.parentNode === null) { + return; + } + this.parentNode.removeChild(this); + } + }); + }); + })([Element.prototype, CharacterData.prototype, DocumentType.prototype]); +} + +promisePolyfill.polyfill(); diff --git a/client/fluid-player/src/static/close-icon.svg b/client/fluid-player/src/static/close-icon.svg new file mode 100644 index 0000000..71276e9 --- /dev/null +++ b/client/fluid-player/src/static/close-icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/fluid-player/src/static/fluid-icons.svg b/client/fluid-player/src/static/fluid-icons.svg new file mode 100644 index 0000000..c009d6f --- /dev/null +++ b/client/fluid-player/src/static/fluid-icons.svg @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/fluid-player/src/static/fluid-spinner.svg b/client/fluid-player/src/static/fluid-spinner.svg new file mode 100644 index 0000000..a63511f --- /dev/null +++ b/client/fluid-player/src/static/fluid-spinner.svg @@ -0,0 +1,7 @@ + + + + + diff --git a/client/fluid-player/src/static/miniplayer-toggle-off.svg b/client/fluid-player/src/static/miniplayer-toggle-off.svg new file mode 100644 index 0000000..cf84132 --- /dev/null +++ b/client/fluid-player/src/static/miniplayer-toggle-off.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/fluid-player/src/static/miniplayer-toggle-on.svg b/client/fluid-player/src/static/miniplayer-toggle-on.svg new file mode 100644 index 0000000..75855fc --- /dev/null +++ b/client/fluid-player/src/static/miniplayer-toggle-on.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/fluid-player/src/static/skip-backward.svg b/client/fluid-player/src/static/skip-backward.svg new file mode 100644 index 0000000..ab4a557 --- /dev/null +++ b/client/fluid-player/src/static/skip-backward.svg @@ -0,0 +1,5 @@ + + + + diff --git a/client/fluid-player/src/static/skip-forward.svg b/client/fluid-player/src/static/skip-forward.svg new file mode 100644 index 0000000..503c3fc --- /dev/null +++ b/client/fluid-player/src/static/skip-forward.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/client/fluid-player/src/types.ts b/client/fluid-player/src/types.ts new file mode 100644 index 0000000..1dd3435 --- /dev/null +++ b/client/fluid-player/src/types.ts @@ -0,0 +1,546 @@ +export interface IFluidPlayer { + domRef: DomRef; + version: string; + homepage: string; + destructors: ((this: IFluidPlayer) => void)[]; + init: (this: IFluidPlayer, playerTarget: HTMLVideoElement | string, options: unknown) => void; + getCurrentVideoDuration: () => number; + getCurrentTime: () => number; + toggleLoader: (showLoader?: boolean) => void; + sendRequest: ( + url: unknown, + withCredentials: unknown, + timeout: unknown, + functionReadyStateChange: unknown + ) => void; + displayOptions: DisplayOptions; + sendRequestAsync: ( + url: unknown, + withCredentials: unknown, + timeout: unknown + ) => Promise; + announceLocalError: (code: unknown, msg: unknown) => void; + debugMessage: (...msg: unknown[]) => void; + onMainVideoEnded: (event: unknown) => void; + isCurrentlyPlayingAd: unknown; + autoplayAfterAd: boolean; + mainVideoDuration: unknown; + adKeytimePlay: (keyTime: unknown) => void; + timer: number | null; + switchToMainVideo: () => void; + playPauseToggle: () => void; + displaySuggestedVideos: () => void; + mainVideoCurrentTime: unknown; + getCurrentSrc: () => null | string; + getCurrentSrcType: () => null | string; + onRecentWaiting: () => void; + recentWaiting: boolean; + onFluidPlayerPause: () => void; + checkShouldDisplayVolumeBar: () => boolean; + getMobileOs: () => { userOS: string }; + generateCustomControlTags: (options: unknown) => CustomControls; + detectLiveStream: () => void; + isLiveStream: () => boolean; + showLiveIndicator: () => void; + currentVideoDuration: number; + controlPlayPauseToggle: () => void; + playPauseAnimationToggle: (play: any) => void; + isSwitchingSource: boolean; + contolProgressbarUpdate: () => void; + controlDurationUpdate: () => void; + formatTime: (time: number) => void; + hlsPlayer: false | HLSPlayer; + contolVolumebarUpdate: () => void; + latestVolume: number; + fluidStorage: { fluidMute?: boolean; fluidVolume?: unknown }; + muteToggle: () => void; + checkFullscreenSupport: () => + | false + | { + goFullscreen: string; + exitFullscreen: string; + isFullscreen: string; + }; + fullscreenOff: ( + fullscreenButton: unknown[], + menuOptionFullscreen: null + ) => void; + fullscreenMode: boolean; + fullscreenOn: ( + fullscreenButton: unknown, + menuOptionFullscreen: unknown + ) => void; + fullscreenToggle: () => void; + findClosestParent: (el: unknown, selector: unknown) => null; + getTranslateX: (el: unknown) => number; + getEventOffsetX: (evt: unknown, el: unknown) => number; + getEventOffsetY: (evt: unknown, el: unknown) => number; + onProgressbarMouseDown: (event: unknown) => void; + onVolumeBarMouseDown: () => void; + findRoll: (roll: unknown) => string[] | undefined; + onKeyboardVolumeChange: (direction: unknown) => void; + onKeyboardSeekPosition: (keyCode: unknown) => void; + getNewCurrentTimeValueByKeyCode: ( + keyCode: unknown, + currentTime: unknown, + duration: unknown + ) => unknown; + handleMouseleave: (event: unknown) => void; + handleMouseenterForKeyboard: () => void; + keyboardControl: () => void; + handleWindowClick: (event: unknown) => void; + initialPlay: () => void; + setCustomControls: () => void; + createTimePositionPreview: () => void; + setCustomContextMenu: () => void; + setDefaultLayout: () => void; + initSkipControls: () => void; + handleOrientationChange: () => void; + initSkipAnimationElements: () => void; + initDoubleTapSkip: () => void; + skipRelative: (timeOffset: number) => void; + checkIfVolumebarIsRendered: () => boolean; + setLayout: () => void; + handleFullscreen: () => void; + setupPlayerWrapper: () => HTMLDivElement; + onErrorDetection: () => void; + createVideoSourceSwitch: (initialLoad?: boolean) => void; + openCloseVideoSourceSwitch: () => void; + setVideoSource: (url: unknown) => false | undefined; + setCurrentTimeAndPlay: ( + newCurrentTime: unknown, + shouldPlay: unknown + ) => void; + initTitle: () => void; + hasTitle: () => unknown; + hideTitle: () => void; + showTitle: () => void; + initLogo: () => void; + initHtmlOnPauseBlock: () => void; + initPlayButton: () => void; + mainVideoReady: () => void; + userActivityChecker: () => void; + hasControlBar: () => boolean; + isControlBarVisible: () => boolean; + setVideoPreload: () => void; + hideControlBar: () => void; + showControlBar: (event: unknown) => void; + linkControlBarUserActivity: () => void; + initMute: () => void; + initLoop: () => void; + setBuffering: () => void; + createPlaybackList: () => void; + openCloseVideoPlaybackRate: () => void; + createDownload: () => void; + theatreToggle: () => void; + defaultTheatre: () => void; + posterImage: () => void; + nextSource: () => null | undefined; + inIframe: () => boolean; + setPersistentSettings: (ignoreMute?: boolean) => false | undefined; + play: () => true | undefined; + pause: () => boolean; + skipTo: (time: unknown) => void; + setPlaybackSpeed: (speed: unknown) => void; + setVolume: (passedVolume: unknown) => void; + isCurrentlyPlayingVideo: (instance: HTMLVideoElement) => boolean; + setHtmlOnPauseBlock: (passedHtml: unknown) => false | undefined; + toggleControlBar: (show: unknown) => void; + on: (eventCall: unknown, callback: unknown) => void; + toggleLogo: (logo: unknown) => false | undefined; + trackEvent: ( + el: unknown, + evt: unknown, + sel: unknown, + handler: unknown + ) => void; + registerListener: ( + el: unknown, + evt: unknown, + sel: unknown, + handler: unknown + ) => void; + copyEvents: (topLevelEl: unknown) => void; + resetDisplayMode: ( + displayTarget: "fullScreen" | "theaterMode" | "miniPlayer" + ) => void; + destroy: () => void; + setCTAFromVast: (titleCtaElement: HTMLElement, tmpOptions: unknown) => void; + getClickThroughUrlFromLinear: (linear: HTMLElement) => unknown; + getVastAdTagUriFromWrapper: (xmlResponse: HTMLElement) => unknown; + hasInLine: (xmlResponse: HTMLElement) => number | false; + hasVastAdTagUri: (xmlResponse: HTMLElement) => number | false; + getClickThroughUrlFromNonLinear: (nonLinear: HTMLElement) => string; + getTrackingFromLinear: ( + linear: HTMLElement + ) => never[] | HTMLCollectionOf; + getDurationFromLinear: (linear: HTMLElement) => unknown; + getDurationFromNonLinear: (tag: HTMLElement) => number; + getDimensionFromNonLinear: (tag: HTMLElement) => { + width: null; + height: null; + }; + getCreativeTypeFromStaticResources: (tag: HTMLElement) => string; + getMediaFilesFromLinear: ( + linear: HTMLElement + ) => HTMLCollectionOf | never[]; + getStaticResourcesFromNonLinear: (linear: HTMLElement) => unknown[]; + extractNodeDataByTagName: ( + parentNode: HTMLElement, + tagName: string + ) => string | null; + extractNodeData: (parentNode: HTMLElement) => string; + getAdParametersFromLinear: (linear: HTMLElement) => string | null; + getMediaFileListFromLinear: (linear: HTMLElement) => unknown[]; + getIconClickThroughFromLinear: (linear: HTMLElement) => string; + getStaticResourceFromNonLinear: (linear: HTMLElement) => string | undefined; + registerTrackingEvents: ( + creativeLinear: unknown, + tmpOptions: unknown + ) => void; + registerClickTracking: ( + clickTrackingTag: unknown, + tmpOptions: unknown + ) => void; + registerViewableImpressionEvents: ( + viewableImpressionTags: unknown, + tmpOptions: unknown + ) => void; + registerImpressionEvents: ( + impressionTags: unknown, + tmpOptions: unknown + ) => void; + registerErrorEvents: (errorTags: unknown, tmpOptions: unknown) => void; + announceError: (code: unknown) => void; + getClickTrackingEvents: (linear: unknown) => string[] | undefined; + getNonLinearClickTrackingEvents: ( + nonLinear: unknown + ) => string[] | undefined; + callUris: (uris: unknown) => void; + recalculateAdDimensions: () => void; + prepareVast: (roll: unknown) => void; + playMainVideoWhenVastFails: (errorCode: unknown) => void; + switchPlayerToVastMode: () => void; + processVastWithRetries: (vastObj: unknown) => void; + processUrl: ( + vastTag: unknown, + callBack: unknown, + rollListId: unknown + ) => void; + resolveVastTag: ( + vastTag: unknown, + numberOfRedirects: unknown, + tmpOptions: unknown, + callback: unknown, + rollListId: unknown + ) => any; + setVastList: () => void; + onVastAdEnded: (event: unknown) => void; + vastLogoBehaviour: (vastPlaying: unknown) => void; + deleteVastAdElements: () => void; + renderLinearAd: (ad: unknown, backupTheVideoTime: unknown) => void; + playRoll: (adList: unknown) => void; + backupMainVideoContentTime: (rollListId: unknown) => void; + getSupportedMediaFileObject: (mediaFiles: unknown) => unknown; + getMediaFileTypeSupportLevel: ( + mediaType: unknown + ) => "maybe" | "probably" | "no" | null; + scheduleTrackingEvent: (currentTime: unknown, duration: unknown) => void; + trackSingleEvent: (eventType: unknown, eventSubType: unknown) => void; + completeNonLinearStatic: (ad: unknown) => void; + createNonLinearStatic: (ad: unknown) => void; + createVpaidNonLinearBoard: (ad: unknown) => void; + createNonLinearBoard: (ad: unknown) => void; + createBoard: (ad: unknown) => void; + closeNonLinear: (adId: unknown) => void; + rollGroupContainsLinear: (groupedRolls: unknown) => boolean; + rollGroupContainsNonlinear: (groupedRolls: unknown) => boolean; + preRollFail: () => void; + preRollSuccess: () => void; + preRollAdsPlay: () => void; + preRoll: (event: unknown) => void; + createAdMarker: (adListId: unknown, time: unknown) => void; + hideAdMarker: (adListId: unknown) => void; + showAdMarkers: () => void; + hideAdMarkers: () => void; + midRoll: (event: unknown) => void; + postRoll: (event: unknown) => void; + onPauseRoll: (event: unknown) => void; + hasValidOnPauseAd: () => unknown; + toggleOnPauseAd: () => void; + trackingOnPauseNonLinearAd: (ad: unknown, status: unknown) => void; + getLinearAdsFromKeyTime: (keyTimeLinearObj: unknown) => unknown[]; + adTimer: () => void; + scheduleTask: (task: { + time: number; + rollListId: unknown; + loadVast: unknown; + }) => void; + scheduleOnDemandRolls: () => void; + getNextAdPod: () => unknown; + checkForNextAd: () => void; + addSkipButton: () => void; + addAdCountdown: () => void; + decreaseAdCountdown: () => void; + removeAdCountdown: () => void; + toggleAdCountdown: (showing: unknown) => void; + addAdPlayingText: (textToShow: unknown) => void; + positionTextElements: (adListData: unknown) => void; + removeAdPlayingText: () => void; + addCTAButton: (landingPage: string) => unknown; + createAndAppendCTAButton: ( + adCTAText: string, + displayUrl: string, + trackingUrl: string + ) => void; + removeCTAButton: () => void; + decreaseSkipOffset: () => void; + pressSkipButton: () => void; + removeSkipButton: () => void; + addClickthroughLayer: () => void; + removeClickthrough: () => void; + isTimer: unknown; + vrROTATION_POSITION: number; + vrROTATION_SPEED: number; + vrMode: boolean; + vrPanorama: null; + vrViewer: null; + vpaidTimer: null; + vpaidAdUnit: null; + vastOptions: null; + videoPlayerId: string; + originalSrc: string | null; + firstPlayLaunched: boolean; + suppressClickthrough: boolean; + timelinePreviewData: unknown[]; + timerPool: Record; + rollsById: Record; + adPool: Record; + adGroupedByRolls: Record; + onPauseRollAdPods: unknown[]; + currentOnPauseRollAd: string; + preRollAdsResolved: boolean; + preRollAdPods: unknown[]; + preRollAdPodsLength: number; + preRollVastResolved: number; + temporaryAdPods: unknown[]; + availableRolls: ["preRoll", "midRoll", "postRoll", "onPauseRoll"]; + supportedNonLinearAd: ["300x250", "468x60", "728x90"]; + nonLinearDuration: number; + supportedStaticTypes: ["image/gif", "image/jpeg", "image/png"]; + inactivityTimeout: null; + isUserActive: null; + nonLinearVerticalAlign: "bottom"; + vpaidNonLinearCloseButton: boolean; + showTimeOnHover: boolean; + initialAnimationSet: boolean; + theatreMode: boolean; + theatreModeAdvanced: boolean; + originalWidth: number; + originalHeight: number; + dashPlayer: boolean; + dashScriptLoaded: boolean; + hlsScriptLoaded: boolean; + isPlayingMedia: boolean; + isLoading: boolean; + isInIframe: boolean; + mainVideoReadyState: boolean; + xmlCollection: unknown[]; + inLineFound: null; + fluidPseudoPause: boolean; + mobileInfo: { userOS: string }; + events: Record; + timeSkipOffsetAmount: number; + currentMediaSourceType: "source"; +} + +export interface DomRef { + player: null | HTMLVideoElement; + wrapper?: null | HTMLDivElement; +} + +export interface DisplayOptions { + onBeforeXMLHttpRequestOpen: (request: XMLHttpRequest) => void; + onBeforeXMLHttpRequest: (request: XMLHttpRequest) => void; + debug: boolean; + layoutControls: ILayoutControls; + suggestedVideos: { configUrl: null }; + vastOptions: IVastOptions; + captions: ICaptions; + hls: IHLSOptions; + modules: { + configureHls: (options: unknown) => typeof options; + onBeforeInitHls: (hls: unknown) => unknown; + onAfterInitHls: (hls: unknown) => unknown; + configureDash: (options: unknown) => typeof options; + onBeforeInitDash: (dash: unknown) => void; + onAfterInitDash: (dash: unknown) => void; + }; +} + +interface ILayoutControls { + mediaType: string | null; + primaryColor: boolean; + posterImage: boolean; + posterImageSize: "contain"; + adProgressColor: string; + playButtonShowing: boolean; + playPauseAnimation: boolean; + closeButtonCaption: "Close"; // Remove? + fillToContainer: boolean; + autoPlay: boolean; + preload: "auto"; + mute: boolean; + loop: null; + keyboardControl: boolean; + allowDownload: boolean; + playbackRateEnabled: boolean; + subtitlesEnabled: boolean; + subtitlesOnByDefault: boolean; + showCardBoardView: boolean; + showCardBoardJoystick: boolean; + allowTheatre: boolean; + doubleclickFullscreen: boolean; + autoRotateFullScreen: boolean; + theatreSettings: ITheatreOptions; + theatreAdvanced: { + theatreElement: null; + }; + title: null; + logo: ILogoOptions; + controlBar: { + autoHide: false; + autoHideTimeout: 3; + animated: true; + playbackRates: ["x2", "x1.5", "x1", "x0.5"]; + }; + timelinePreview: { + spriteImage: false; + spriteRelativePath: false; + }; + htmlOnPauseBlock: { + html: null; + height: null; + width: null; + }; + layout: "default"; //options: 'default', '' + playerInitCallback: () => void; + persistentSettings: { + volume: true; + quality: true; + speed: true; + theatre: true; + }; + controlForwardBackward: { + show: false; + doubleTapMobile: true; + }; + contextMenu: { + controls: true; + links: []; + }; + miniPlayer: { + enabled: true; + width: 400; + height: 225; + widthMobile: 50; + placeholderText: "Playing in Miniplayer"; + position: "bottom right"; + autoToggle: false; + }; + roundedCorners: 0; +} + +interface ITheatreOptions { + width: "100%"; + height: "60%"; + marginTop: number; + horizontalAlign: "center"; + keepPosition: boolean; +} + +interface ILogoOptions { + imageUrl: null; + position: "top left"; + clickUrl: null; + opacity: 1; + mouseOverImageUrl: null; + imageMargin: "2px"; + hideWithControls: false; + showOverAds: false; +} + +interface ICaptions { + play: "Play"; + pause: "Pause"; + mute: "Mute"; + unmute: "Unmute"; + fullscreen: "Fullscreen"; + subtitles: "Subtitles"; + exitFullscreen: "Exit Fullscreen"; +} + +interface IVastOptions { + adList: Record; + skipButtonCaption: "Skip ad in [seconds]"; + skipButtonClickCaption: 'Skip Ad '; + adText: null; + adTextPosition: "top left"; + adCTAText: "Visit now!"; + adCTATextPosition: "bottom right"; + adCTATextVast: boolean; + adClickable: boolean; + vastTimeout: number; + showProgressbarMarkers: boolean; + allowVPAID: boolean; + showPlayButton: boolean; + maxAllowedVastTagRedirects: number; + vpaidTimeout: number; + + vastAdvanced: { + vastLoadedCallback: () => void; + noVastVideoCallback: () => void; + vastVideoSkippedCallback: () => void; + vastVideoEndedCallback: () => void; + }; +} + +interface CustomControls { + loader: HTMLDivElement; + root: HTMLDivElement; + leftContainer: HTMLDivElement; + playPause: HTMLDivElement; + skipBack: HTMLDivElement; + skipForward: HTMLDivElement; + progressContainer: HTMLDivElement; + progressWrapper: HTMLDivElement; + progressCurrent: HTMLDivElement; + progress_current_marker: HTMLDivElement; + bufferedIndicator: HTMLDivElement; + adMarkers: HTMLDivElement; + rightContainer: HTMLDivElement; + fullscreen: HTMLDivElement; + miniPlayer: HTMLDivElement; + theatre: HTMLDivElement; + cardboard: HTMLDivElement; + subtitles: HTMLDivElement; + videoSource: HTMLDivElement; + playbackRate: HTMLDivElement; + download: HTMLDivElement; + volumeContainer: HTMLDivElement; + volume: HTMLDivElement; + volumeCurrent: HTMLDivElement; + volumeCurrentPos: HTMLDivElement; + mute: HTMLDivElement; + durationContainer: HTMLDivElement; + duration: HTMLDivElement; + live_indicator: HTMLDivElement; +} + +interface IHLSOptions { + overrideNative: boolean; +} + +interface HLSPlayer { + levels: { details: { live: unknown } }[]; +} diff --git a/client/fluid-player/test/html/custom_context.tpl.html b/client/fluid-player/test/html/custom_context.tpl.html new file mode 100644 index 0000000..7fe3938 --- /dev/null +++ b/client/fluid-player/test/html/custom_context.tpl.html @@ -0,0 +1,43 @@ + + + + + + + Custom context menu + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/dash_live.tpl.html b/client/fluid-player/test/html/dash_live.tpl.html new file mode 100644 index 0000000..eafaa76 --- /dev/null +++ b/client/fluid-player/test/html/dash_live.tpl.html @@ -0,0 +1,29 @@ + + + + + + + DASH Live Stream + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/dash_live_vast.tpl.html b/client/fluid-player/test/html/dash_live_vast.tpl.html new file mode 100644 index 0000000..d602183 --- /dev/null +++ b/client/fluid-player/test/html/dash_live_vast.tpl.html @@ -0,0 +1,44 @@ + + + + + + + DASH Live Stream with VAST + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/dash_vod.tpl.html b/client/fluid-player/test/html/dash_vod.tpl.html new file mode 100644 index 0000000..aa07ccc --- /dev/null +++ b/client/fluid-player/test/html/dash_vod.tpl.html @@ -0,0 +1,29 @@ + + + + + + + DASH VOD + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/dash_vod_vast.tpl.html b/client/fluid-player/test/html/dash_vod_vast.tpl.html new file mode 100644 index 0000000..897a590 --- /dev/null +++ b/client/fluid-player/test/html/dash_vod_vast.tpl.html @@ -0,0 +1,44 @@ + + + + + + + DASH VOD with VAST + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/e2e/ads_linear.html b/client/fluid-player/test/html/e2e/ads_linear.html new file mode 100644 index 0000000..67d6fe0 --- /dev/null +++ b/client/fluid-player/test/html/e2e/ads_linear.html @@ -0,0 +1,48 @@ + + + + + + + E2E with VAST Linear + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/e2e/controls.html b/client/fluid-player/test/html/e2e/controls.html new file mode 100644 index 0000000..661c5c4 --- /dev/null +++ b/client/fluid-player/test/html/e2e/controls.html @@ -0,0 +1,37 @@ + + + + + + + Controls + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/e2e/suggested_videos_e2e.tpl.html b/client/fluid-player/test/html/e2e/suggested_videos_e2e.tpl.html new file mode 100644 index 0000000..45d0e1d --- /dev/null +++ b/client/fluid-player/test/html/e2e/suggested_videos_e2e.tpl.html @@ -0,0 +1,42 @@ + + + + + + + Suggested videos with subtitles + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/hls_live.tpl.html b/client/fluid-player/test/html/hls_live.tpl.html new file mode 100644 index 0000000..abdf42e --- /dev/null +++ b/client/fluid-player/test/html/hls_live.tpl.html @@ -0,0 +1,29 @@ + + + + + + + HLS Live Stream + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/hls_live_vast.tpl.html b/client/fluid-player/test/html/hls_live_vast.tpl.html new file mode 100644 index 0000000..f3f120f --- /dev/null +++ b/client/fluid-player/test/html/hls_live_vast.tpl.html @@ -0,0 +1,44 @@ + + + + + + + HLS Live Stream with VAST + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/hls_vod.tpl.html b/client/fluid-player/test/html/hls_vod.tpl.html new file mode 100644 index 0000000..50c3902 --- /dev/null +++ b/client/fluid-player/test/html/hls_vod.tpl.html @@ -0,0 +1,29 @@ + + + + + + + HLS VOD + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/hls_vod_suggested_videos.html b/client/fluid-player/test/html/hls_vod_suggested_videos.html new file mode 100644 index 0000000..3eff57e --- /dev/null +++ b/client/fluid-player/test/html/hls_vod_suggested_videos.html @@ -0,0 +1,51 @@ + + + + + + + Hls VOD suggested videos + <%= htmlWebpackPlugin.tags.headTags %> + + + + +

Hls with suggested videos

+ +
    +
  • Initial video is an mp4
  • +
      +
    • no auto option
    • +
    +
  • All suggested videos in the initial video are Hls
  • +
  • Suggested videos at the end of the second video are mp4's
  • +
      +
    • no auto option
    • +
    +
+ + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/hls_vod_vast.tpl.html b/client/fluid-player/test/html/hls_vod_vast.tpl.html new file mode 100644 index 0000000..9639690 --- /dev/null +++ b/client/fluid-player/test/html/hls_vod_vast.tpl.html @@ -0,0 +1,44 @@ + + + + + + + HLS VOD with VAST + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/player-reinitialization.tpl.html b/client/fluid-player/test/html/player-reinitialization.tpl.html new file mode 100644 index 0000000..9e0fecb --- /dev/null +++ b/client/fluid-player/test/html/player-reinitialization.tpl.html @@ -0,0 +1,82 @@ + + + + + + + Player Reinitialization + <%= htmlWebpackPlugin.tags.headTags %> + + + + +
+ +
+ + + + + +
+ +

This test is meant to check if the Fluid Player instance is properly clean up after destroying it

+ +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/skip_return.tpl.html b/client/fluid-player/test/html/skip_return.tpl.html new file mode 100644 index 0000000..4fcf410 --- /dev/null +++ b/client/fluid-player/test/html/skip_return.tpl.html @@ -0,0 +1,42 @@ + + + + + + + Skip & Return + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/special-cases/_README.md b/client/fluid-player/test/html/special-cases/_README.md new file mode 100644 index 0000000..21d95fc --- /dev/null +++ b/client/fluid-player/test/html/special-cases/_README.md @@ -0,0 +1,18 @@ +# Special cases + +Templates put here will not appear in the e2e file list, but will be accessible directly by URL in the root of the test server. +These templates should be used to share a link of an issue to an issue when creating a PR. + +To avoid conflicts with any naming, always use identifiers that point to the cause, for example: + +* Internal issues: `internal-vast-click-tracking-issue.tpl.html` +* Github issues: `issue-215.tpl.html` + +These files would be accessible in the following URLs when running the dev server: + +* http://localhost:8080/internal-vast-click-tracking-issue.html +* http://localhost:8080/issues-215.html + +To use specific static files, please create them in `test/static/special-cases`, no special naming is required. + +For more information about how these files are being loaded, check `webpack.config.js` diff --git a/client/fluid-player/test/html/special-cases/internal-vast-click-tracking-issue.html b/client/fluid-player/test/html/special-cases/internal-vast-click-tracking-issue.html new file mode 100644 index 0000000..3bc64cd --- /dev/null +++ b/client/fluid-player/test/html/special-cases/internal-vast-click-tracking-issue.html @@ -0,0 +1,38 @@ + + + + + + + Fluid player doesn't track clicks on some sites + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/special-cases/issue-702.tpl.html b/client/fluid-player/test/html/special-cases/issue-702.tpl.html new file mode 100644 index 0000000..ad76428 --- /dev/null +++ b/client/fluid-player/test/html/special-cases/issue-702.tpl.html @@ -0,0 +1,34 @@ + + + + + + + Issue 702 - CurrentTime reset after switch HLS source on IOS + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/suggested_videos_ads.tpl.html b/client/fluid-player/test/html/suggested_videos_ads.tpl.html new file mode 100644 index 0000000..6104711 --- /dev/null +++ b/client/fluid-player/test/html/suggested_videos_ads.tpl.html @@ -0,0 +1,66 @@ + + + + + + + Suggested videos with ads + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/suggested_videos_subtitles.tpl.html b/client/fluid-player/test/html/suggested_videos_subtitles.tpl.html new file mode 100644 index 0000000..cc2d5d3 --- /dev/null +++ b/client/fluid-player/test/html/suggested_videos_subtitles.tpl.html @@ -0,0 +1,57 @@ + + + + + + + Suggested videos with subtitles + <%= htmlWebpackPlugin.tags.headTags %> + + + + +

Video with no subtitles initially, two video sources

+ + +

Video with no subtitles initially, only 1 video source

+ + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + + + diff --git a/client/fluid-player/test/html/vod_basic.tpl.html b/client/fluid-player/test/html/vod_basic.tpl.html new file mode 100644 index 0000000..b342e5e --- /dev/null +++ b/client/fluid-player/test/html/vod_basic.tpl.html @@ -0,0 +1,31 @@ + + + + + + + VOD + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_autohide.tpl.html b/client/fluid-player/test/html/vod_basic_autohide.tpl.html new file mode 100644 index 0000000..de144a1 --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_autohide.tpl.html @@ -0,0 +1,39 @@ + + + + + + + VOD auto-hide toolbar + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_by_ref.tpl.html b/client/fluid-player/test/html/vod_basic_by_ref.tpl.html new file mode 100644 index 0000000..bea153b --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_by_ref.tpl.html @@ -0,0 +1,32 @@ + + + + + + + VOD using reference + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_cta_from_config.tpl.html b/client/fluid-player/test/html/vod_basic_cta_from_config.tpl.html new file mode 100644 index 0000000..083c937 --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_cta_from_config.tpl.html @@ -0,0 +1,42 @@ + + + + + + + VOD with CTA set from Player Configurations + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_cta_from_vast.tpl.html b/client/fluid-player/test/html/vod_basic_cta_from_vast.tpl.html new file mode 100644 index 0000000..1a2b4be --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_cta_from_vast.tpl.html @@ -0,0 +1,50 @@ + + + + + + + VOD with CTA set from VAST + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_cta_from_vast_no_friendly_url.tpl.html b/client/fluid-player/test/html/vod_basic_cta_from_vast_no_friendly_url.tpl.html new file mode 100644 index 0000000..05b4ecb --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_cta_from_vast_no_friendly_url.tpl.html @@ -0,0 +1,41 @@ + + + + + + + VOD with CTA set from VAST with no friendly url + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_multiple.tpl.html b/client/fluid-player/test/html/vod_basic_multiple.tpl.html new file mode 100644 index 0000000..d8d1c05 --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_multiple.tpl.html @@ -0,0 +1,43 @@ + + + + + + + VOD two players + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_subtitles.tpl.html b/client/fluid-player/test/html/vod_basic_subtitles.tpl.html new file mode 100644 index 0000000..b61a236 --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_subtitles.tpl.html @@ -0,0 +1,35 @@ + + + + + + + VOD with subtitles + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_vr.tpl.html b/client/fluid-player/test/html/vod_basic_vr.tpl.html new file mode 100644 index 0000000..cd28953 --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_vr.tpl.html @@ -0,0 +1,34 @@ + + + + + + + VOD VR + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_vr_autoplay.tpl.html b/client/fluid-player/test/html/vod_basic_vr_autoplay.tpl.html new file mode 100644 index 0000000..f3aa9ea --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_vr_autoplay.tpl.html @@ -0,0 +1,35 @@ + + + + + + + VOD VR with Auto Play + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_vtt.tpl.html b/client/fluid-player/test/html/vod_basic_vtt.tpl.html new file mode 100644 index 0000000..5278bf6 --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_vtt.tpl.html @@ -0,0 +1,38 @@ + + + + + + + VOD with timeline thumbnails + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_basic_vtt_static.tpl.html b/client/fluid-player/test/html/vod_basic_vtt_static.tpl.html new file mode 100644 index 0000000..013db4b --- /dev/null +++ b/client/fluid-player/test/html/vod_basic_vtt_static.tpl.html @@ -0,0 +1,1857 @@ + + + + + + + VOD with timeline static-thumbnails + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_event_api.html b/client/fluid-player/test/html/vod_event_api.html new file mode 100644 index 0000000..f041938 --- /dev/null +++ b/client/fluid-player/test/html/vod_event_api.html @@ -0,0 +1,72 @@ + + + + + + + VOD with Event API callbacks + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +

Check your console for the messages beginning with typeCallback

+ +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_extended.tpl.html b/client/fluid-player/test/html/vod_extended.tpl.html new file mode 100644 index 0000000..acc8cef --- /dev/null +++ b/client/fluid-player/test/html/vod_extended.tpl.html @@ -0,0 +1,75 @@ + + + + + + + VOD extended + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_live_ad.tpl.html b/client/fluid-player/test/html/vod_live_ad.tpl.html new file mode 100644 index 0000000..63cb986 --- /dev/null +++ b/client/fluid-player/test/html/vod_live_ad.tpl.html @@ -0,0 +1,49 @@ + + + + + + + VOD with VAST Live Ad Creative + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_miniplayer.tpl.html b/client/fluid-player/test/html/vod_miniplayer.tpl.html new file mode 100644 index 0000000..bdf569d --- /dev/null +++ b/client/fluid-player/test/html/vod_miniplayer.tpl.html @@ -0,0 +1,136 @@ + + + + + + + VOD with Mini Player + <%= htmlWebpackPlugin.tags.headTags %> + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + +
+
+
+
+
+
+
+
+
+
+ +

+
+ +
+ + + + + diff --git a/client/fluid-player/test/html/vod_responsive.tpl.html b/client/fluid-player/test/html/vod_responsive.tpl.html new file mode 100644 index 0000000..1115a3b --- /dev/null +++ b/client/fluid-player/test/html/vod_responsive.tpl.html @@ -0,0 +1,69 @@ + + + + + + + VOD responsive + <%= htmlWebpackPlugin.tags.headTags %> + + + +
+

+ +

+
+
+
+
+ +
+
+ +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast__linear.html b/client/fluid-player/test/html/vod_vast__linear.html new file mode 100644 index 0000000..565c22f --- /dev/null +++ b/client/fluid-player/test/html/vod_vast__linear.html @@ -0,0 +1,60 @@ + + + + + + + VOD with VAST Linear + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast__non_linear.html b/client/fluid-player/test/html/vod_vast__non_linear.html new file mode 100644 index 0000000..f771031 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast__non_linear.html @@ -0,0 +1,60 @@ + + + + + + + VOD with VAST Non Linear + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_ad_buffet.tpl.html b/client/fluid-player/test/html/vod_vast_ad_buffet.tpl.html new file mode 100644 index 0000000..4340c3a --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_ad_buffet.tpl.html @@ -0,0 +1,42 @@ + + + + + + + VOD with VAST Ad Buffet + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_ad_buffet_with_error.tpl.html b/client/fluid-player/test/html/vod_vast_ad_buffet_with_error.tpl.html new file mode 100644 index 0000000..c379f19 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_ad_buffet_with_error.tpl.html @@ -0,0 +1,44 @@ + + + + + + + VOD with VAST Ad Buffet With Error + <%= htmlWebpackPlugin.tags.headTags %> + + + + +

First AD doesn't have a Creative, fallbacks to second ad.

+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_ad_pod.tpl.html b/client/fluid-player/test/html/vod_vast_ad_pod.tpl.html new file mode 100644 index 0000000..92045d5 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_ad_pod.tpl.html @@ -0,0 +1,42 @@ + + + + + + + VOD with VAST Ad Pod + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_ad_pod_from_wrapper.tpl.html b/client/fluid-player/test/html/vod_vast_ad_pod_from_wrapper.tpl.html new file mode 100644 index 0000000..534941d --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_ad_pod_from_wrapper.tpl.html @@ -0,0 +1,42 @@ + + + + + + + VOD with VAST Ad Pod - Loaded from a VAST Wrapper + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_ad_pod_truncated.tpl.html b/client/fluid-player/test/html/vod_vast_ad_pod_truncated.tpl.html new file mode 100644 index 0000000..e59b1b8 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_ad_pod_truncated.tpl.html @@ -0,0 +1,46 @@ + + + + + + + VOD with VAST Ad Pod - Truncated by maxTotalQuantity + <%= htmlWebpackPlugin.tags.headTags %> + + + + +

In this scenario VAST returns an Ad Pod with 3 Ads, but we limit the Ad Pods to play only 2 Ads

+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_followAdditionalWrappers_false.tpl.html b/client/fluid-player/test/html/vod_vast_followAdditionalWrappers_false.tpl.html new file mode 100644 index 0000000..1dec9b0 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_followAdditionalWrappers_false.tpl.html @@ -0,0 +1,43 @@ + + + + + + + VOD with VAST Wrapper - followAdditionalWrappers: false + <%= htmlWebpackPlugin.tags.headTags %> + + + + +

Expected: No AD should play, as it won't follow the nested VAST Wrappers

+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_followAdditionalWrappers_true.tpl.html b/client/fluid-player/test/html/vod_vast_followAdditionalWrappers_true.tpl.html new file mode 100644 index 0000000..63a3aeb --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_followAdditionalWrappers_true.tpl.html @@ -0,0 +1,41 @@ + + + + + + + VOD with VAST Wrapper - followAdditionalWrappers: true + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_on-demand.html b/client/fluid-player/test/html/vod_vast_on-demand.html new file mode 100644 index 0000000..bbffafc --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_on-demand.html @@ -0,0 +1,65 @@ + + + + + + + VOD with VAST loaded on demand + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +
    +
  • midRoll 1 (Linear) - Will be loaded on video start, since its timer is set to 3
  • +
  • midRoll 2 (Linear) - Will be loaded at 10 seconds, since its timer is set to 15
  • +
  • midRoll 3 (Non-Linear) - Will be loaded at 25 seconds, since its timer is set to 30
  • +
  • postRoll (Linear) - Will be loaded in any of the 5 last seconds of the video
  • +
+ +

Check DevTools to see the VAST requests being loaded on demand

+ +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_waterfall_false.tpl.html b/client/fluid-player/test/html/vod_vast_waterfall_false.tpl.html new file mode 100644 index 0000000..6bc8a28 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_waterfall_false.tpl.html @@ -0,0 +1,47 @@ + + + + + + + VOD with VAST Wrapper - VAST Waterfall Off (fallbackOnNoAd=false) + <%= htmlWebpackPlugin.tags.headTags %> + + + + +VOD with VAST Wrapper - VAST Waterfall Off (fallbackOnNoAd=false) +

This scenario represents the following statement from the fallbackOnNoAd description: "(...) instruction for using an available Ad when the requested VAST response returns no ads. (...) If false and the Wrapper represents an Ad in a Pod, the video player should move on to the next Ad in a Pod;".

+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_waterfall_false_http_error.tpl.html b/client/fluid-player/test/html/vod_vast_waterfall_false_http_error.tpl.html new file mode 100644 index 0000000..bc87dff --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_waterfall_false_http_error.tpl.html @@ -0,0 +1,47 @@ + + + + + + + VOD with VAST Wrapper - VAST Waterfall Off (fallbackOnNoAd=false) - Http Error + <%= htmlWebpackPlugin.tags.headTags %> + + + + +VOD with VAST Wrapper - VAST Waterfall Off (fallbackOnNoAd=false) +

This scenario represents the following statement from the fallbackOnNoAd description: "(...) instruction for using an available Ad when the requested VAST response returns no ads. (...) If false and the Wrapper represents an Ad in a Pod, the video player should move on to the next Ad in a Pod;".

+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_waterfall_true.tpl.html b/client/fluid-player/test/html/vod_vast_waterfall_true.tpl.html new file mode 100644 index 0000000..a3ea703 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_waterfall_true.tpl.html @@ -0,0 +1,47 @@ + + + + + + + VOD with VAST Wrapper - VAST Waterfall On (fallbackOnNoAd=true) + <%= htmlWebpackPlugin.tags.headTags %> + + + + +VOD with VAST Wrapper - VAST Waterfall On (fallbackOnNoAd=true) +

This scenario represents the following statement from the fallbackOnNoAd description: "(...) instruction for using an available Ad when the requested VAST response returns no ads. If true, the video player should select from any stand-alone ads available.".

+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_waterfall_true_http_error.tpl.html b/client/fluid-player/test/html/vod_vast_waterfall_true_http_error.tpl.html new file mode 100644 index 0000000..98aeb93 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_waterfall_true_http_error.tpl.html @@ -0,0 +1,47 @@ + + + + + + + VOD with VAST Wrapper - VAST Waterfall On (fallbackOnNoAd=true) - Http Error + <%= htmlWebpackPlugin.tags.headTags %> + + + + +VOD with VAST Wrapper - VAST Waterfall On (fallbackOnNoAd=true) +

This scenario represents the following statement from the fallbackOnNoAd description: "(...) instruction for using an available Ad when the requested VAST response returns no ads. If true, the video player should select from any stand-alone ads available.".

+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_wrapper.tpl.html b/client/fluid-player/test/html/vod_vast_wrapper.tpl.html new file mode 100644 index 0000000..f34fa05 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_wrapper.tpl.html @@ -0,0 +1,41 @@ + + + + + + + VOD with VAST Wrapper + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vast_wrapper_cyclical.tpl.html b/client/fluid-player/test/html/vod_vast_wrapper_cyclical.tpl.html new file mode 100644 index 0000000..0cd34b7 --- /dev/null +++ b/client/fluid-player/test/html/vod_vast_wrapper_cyclical.tpl.html @@ -0,0 +1,43 @@ + + + + + + + VOD with VAST Wrapper - Cyclical reference + <%= htmlWebpackPlugin.tags.headTags %> + + + + +

Expected: No AD should play, as it will stop following the cyclical wrapper references

+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vpaid_linear.html b/client/fluid-player/test/html/vod_vpaid_linear.html new file mode 100644 index 0000000..deae0b8 --- /dev/null +++ b/client/fluid-player/test/html/vod_vpaid_linear.html @@ -0,0 +1,41 @@ + + + + + + + VOD with VPAID Linear + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vpaid_linear_viewableImpresson.html b/client/fluid-player/test/html/vod_vpaid_linear_viewableImpresson.html new file mode 100644 index 0000000..09ea309 --- /dev/null +++ b/client/fluid-player/test/html/vod_vpaid_linear_viewableImpresson.html @@ -0,0 +1,80 @@ + + + + + + + VOD with VPAID Linear Viewable Impression + <%= htmlWebpackPlugin.tags.headTags %> + + + + +

Viewable impression tests

+ +

Regular scenario: Here you should see the viewable impression being called in the network tab

+ + + +

Player off screen, so no viewable impression is going to be called

+

Order of what's happening

+
    +
  • Player starts -> 2 seconds later it will go off screen
  • +
  • Player starts playing ad after 5 seconds, there should be no viewable impression
  • +
  • The moment you scroll down to the player, the viewable impression should be called in the network tab (if the ad is still rolling)
  • +
+ + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/html/vod_vpaid_non_linear.html b/client/fluid-player/test/html/vod_vpaid_non_linear.html new file mode 100644 index 0000000..1cf6dfd --- /dev/null +++ b/client/fluid-player/test/html/vod_vpaid_non_linear.html @@ -0,0 +1,41 @@ + + + + + + + VOD with VPAID Non Linear + <%= htmlWebpackPlugin.tags.headTags %> + + + + + + +<%= htmlWebpackPlugin.tags.bodyTags %> + + + + + diff --git a/client/fluid-player/test/index.html b/client/fluid-player/test/index.html new file mode 100644 index 0000000..984a07b --- /dev/null +++ b/client/fluid-player/test/index.html @@ -0,0 +1,57 @@ + + + + + + + Fluid Player E2E test case index listing + + + +
+ + diff --git a/client/fluid-player/test/static/logo.png b/client/fluid-player/test/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e001c5aba06b30b9356f26109f64221e7b7a32b0 GIT binary patch literal 6228 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 + + + Fluid Player + Exclusive Offer - Join Now + + + + + + + + + 00:00:30 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + + + + + + <Subtitle/> + <Button/> + <Url/> + <Expand>false</Expand> + </CTA> + </Extension> + </Extensions> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/special-cases/fp-215.xml b/client/fluid-player/test/static/special-cases/fp-215.xml new file mode 100644 index 0000000..11a8e73 --- /dev/null +++ b/client/fluid-player/test/static/special-cases/fp-215.xml @@ -0,0 +1,37 @@ +<VAST version="3.0"> + <Ad id="6"> + <Wrapper> + <AdSystem>Fluid Player</AdSystem> + <VASTAdTagURI> + <![CDATA[ static/special-cases/fp-215-2.xml ]]> + </VASTAdTagURI> + <Impression id="exotr"> + <![CDATA[ /wrapper-impression ]]> + </Impression> + <Error> + <![CDATA[ /wrapper-error ]]> + </Error> + <Creatives> + <Creative sequence="1" id="10"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"> + <![CDATA[ /wrapper-progress ]]> + </Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking> + <![CDATA[ /wrapper-click ]]> + </ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension type="waterfall" fallback_index="0"> + <Extension/> + </Extension> + </Extensions> + </Wrapper> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/subtitles/deutsch.vtt b/client/fluid-player/test/static/subtitles/deutsch.vtt new file mode 100644 index 0000000..f7d8e40 --- /dev/null +++ b/client/fluid-player/test/static/subtitles/deutsch.vtt @@ -0,0 +1,309 @@ +WEBVTT + +1 +00:00:15.042 --> 00:00:18.042 align:start +<v Proog>Auf der linken Seite sehen wir...</v> + +2 +00:00:18.750 --> 00:00:20.333 align:middle +<v Proog>Auf der rechten Seite sehen wir die...</v> + +3 +00:00:20.417 --> 00:00:21.917 +<v Proog>...die <c.highlight>Enthaupter</c>.</v> + +4 +00:00:22.000 --> 00:00:24.625 align:end +<v Proog>Alles ist sicher. Vollkommen sicher.</v> + +5 +00:00:26.333 --> 00:00:27.333 +<v Proog>Emo?</v> + +6 +00:00:28.875 --> 00:00:30.250 line:6% size:110% +<v Proog>Pass auf!</v> + +7 +00:00:47.125 --> 00:00:48.250 +<v Proog>Bist du verletzt?</v> + +8 +00:00:51.917 --> 00:00:53.917 +<v Emo>Ich glaube nicht. Und du?</v> + +9 +00:00:55.625 --> 00:00:57.125 +<v Proog>Mir fehlt nichts.</v> + +10 +00:00:57.583 --> 00:01:01.667 +<v Proog>Steh auf! Emo, es ist gefährlich hier.</v> + +11 +00:01:02.208 --> 00:01:03.667 +<v Proog>Weiter!</v> + +12 +00:01:03.750 --> 00:01:05.750 +<v Emo>Was jetzt?</v> + +13 +00:01:05.875 --> 00:01:07.875 +<v Proog>Du wirst es sehen.</v> + +14 +00:01:16.167 --> 00:01:18.375 +<v Proog>Emo, hier lang.</v> + +15 +00:01:34.958 --> 00:01:35.792 +<v Proog>Mir nach!</v> + +16 +00:02:11.583 --> 00:02:12.792 +<v Proog>Schneller, Emo!</v> + +17 +00:02:48.375 --> 00:02:50.083 +<v Proog>Du bist unaufmerksam!</v> + +18 +00:02:50.750 --> 00:02:54.500 +<v Emo>Ich wollte doch nur an... ...ans Telefon gehen.</v> + +19 +00:02:55.000 --> 00:02:58.208 +<v Proog>Emo, schau, ich meine, hör zu.</v> + +20 +00:02:59.750 --> 00:03:02.292 +<v Proog>Du musst lernen zuzuhören.</v> + +21 +00:03:03.625 --> 00:03:05.125 +<v Proog>Das hier ist kein Spiel.</v> + +22 +00:03:06.167 --> 00:03:08.750 +<v Proog>u, wir, könnten hier draußen leicht sterben.</v> + +23 +00:03:10.208 --> 00:03:14.125 +<v Proog>Hör zu... Hör dem Klang der Maschine zu.</v> + +24 +00:03:18.333 --> 00:03:20.417 +<v Proog>Hör auf deinen Atem.</v> + +25 +00:04:27.208 --> 00:04:29.250 +<v Emo>Hast du nie genug davon?</v> + +26 +00:04:29.583 --> 00:04:31.083 +<v Proog>Genug?!?</v> + +27 +00:04:31.750 --> 00:04:34.667 +<v Proog>Die Maschine ist wie ein Uhrwerk.</v> + +28 +00:04:35.500 --> 00:04:37.708 +<v Proog>Ein falscher Schritt...</v> + +29 +00:04:37.833 --> 00:04:39.792 +<v Proog>...und du wirst zerquetscht.</v> + +30 +00:04:41.042 --> 00:04:42.375 +<v Emo>Aber ist es nicht...</v> + +31 +00:04:42.417 --> 00:04:46.542 +<v Proog>Zerquetscht, Emo! Willst du das? Zerquetscht werden?</v> + +32 +00:04:48.083 --> 00:04:50.000 +<v Proog>Dein Lebensziel?</v> + +33 +00:04:50.583 --> 00:04:52.250 +<v Proog>Zerquetscht!</v> + +34 +00:05:41.833 --> 00:05:43.458 +<v Proog>Emo, schließ die Augen.</v> + +35 +00:05:44.917 --> 00:05:46.583 +<v Emo>Warum? - </v><v Proog>Sofort!</v> + +36 +00:05:53.750 --> 00:05:56.042 +<v Emo>Gut.</v> + +37 +00:05:59.542 --> 00:06:02.792 +<v Proog>Was siehst du zu deiner Linken, Emo?</v> + +38 +00:06:04.417 --> 00:06:06.000 +<v Emo>Nichts. - </v><v Proog>Wirklich?</v> + +39 +00:06:06.333 --> 00:06:07.917 +<v Emo>Überhaupt nichts.</v> + +40 +00:06:08.042 --> 00:06:12.417 +<v Proog>Und zu deiner Rechten, was siehst du zu deiner Rechten, Emo?</v> + +41 +00:06:13.875 --> 00:06:16.917 +<v Proog>Dasselbe, Proog, genau dasselbe...</v> + +42 +00:06:17.083 --> 00:06:18.583 +<v Emo>Nichts!</v> + +43 +00:06:40.625 --> 00:06:42.958 +<v Emo>Hör mal, Proog! Hörst du das?</v> + +44 +00:06:43.625 --> 00:06:45.042 +<v Emo>Können wir hier hingehen?</v> + +45 +00:06:45.208 --> 00:06:48.042 +<v Proog>Dorthin? Das ist gefährlich.</v> + +46 +00:06:49.917 --> 00:06:52.500 +<v Emo>Aber... - </v><v Proog>Vertrau mir, es ist gefährlich.</v> + +47 +00:06:53.292 --> 00:06:54.792 +<v Emo>Vielleicht könnte ich...</v> + +48 +00:06:54.833 --> 00:06:56.333 +<v Proog>Nein.</v> + +49 +00:06:57.667 --> 00:07:00.167 +<v Proog>NEIN!</v> + +50 +00:07:00.875 --> 00:07:03.750 +<v Proog>Sonst noch Fragen, Emo?</v> + +51 +00:07:04.250 --> 00:07:05.917 +<v Emo>Nein.</v> + +52 +00:07:09.458 --> 00:07:10.833 +<v Proog>Emo.</v> + +53 +00:07:11.875 --> 00:07:13.542 +<v Proog>Emo, warum...</v> + +54 +00:07:13.583 --> 00:07:14.458 +<v Proog>Emo...</v> + +55 +00:07:14.500 --> 00:07:18.500 +<v Proog>...warum erkennst du nicht die Schönheit dieses Ortes?</v> + +56 +00:07:18.833 --> 00:07:20.750 +<v Proog>ie alles funktioniert.</v> + +57 +00:07:20.875 --> 00:07:24.000 +<v Proog>Wie vollkommen es ist.</v> + +58 +00:07:24.083 --> 00:07:27.417 +<v Emo>Nein, Proog, ich erkenne nichts.</v> + +59 +00:07:27.542 --> 00:07:30.333 +<v Emo>Ich erkenne nichts, weil da nichts ist.</v> + +60 +00:07:31.500 --> 00:07:35.333 +<v Emo>Und warum sollte ich mein Leben etwas anvertrauen, das gar nicht da ist?</v> + +61 +00:07:35.583 --> 00:07:37.042 +<v Emo>Kannst du mir das sagen? - </v><v Proog>Emo...</v> + +62 +00:07:37.500 --> 00:07:39.167 +<v Emo>Antworte mir!</v> + +63 +00:07:43.208 --> 00:07:44.583 +<v Emo>Proog...</v> + +64 +00:07:45.500 --> 00:07:47.333 +<v Emo>Du bist krank, Mann!</v> + +65 +00:07:47.375 --> 00:07:49.208 +<v Emo>Bleib weg von mir!</v> + +66 +00:07:52.583 --> 00:07:55.083 +<v Proog>Nein! Emo! Das ist eine Falle!</v> + +67 +00:07:55.833 --> 00:07:57.167 +<v Emo>Haha, eine Falle.</v> + +68 +00:07:57.208 --> 00:08:01.750 +<v Emo>Auf der linken Seite sieht man die Hängenden Gärten von Babylon.</v> + +69 +00:08:02.250 --> 00:08:04.292 +<v Emo>Wie wär das als Falle?</v> + +70 +00:08:05.458 --> 00:08:07.125 +<v Proog>Nein, Emo.</v> + +71 +00:08:09.417 --> 00:08:12.792 +<v Emo>Auf der rechten Seite sieht man... ...rate mal...</v> + +72 +00:08:13.000 --> 00:08:14.750 +<v Emo>...den Koloss von Rhodos!</v> + +73 +00:08:15.833 --> 00:08:16.708 +<v Proog>Nein!</v> + +74 +00:08:16.750 --> 00:08:22.167 +<v Emo>Den Koloss von Rhodos und er ist nur für dich hier, Proog.</v> + +75 +00:08:51.333 --> 00:08:53.167 +<v Proog>Es ist da...</v> + +76 +00:08:53.208 --> 00:08:55.500 +<v Proog>Wenn ich es dir doch sage, Emo...</v> + +77 +00:08:57.333 --> 00:09:00.000 +<v Proog>...es ist da.</v> \ No newline at end of file diff --git a/client/fluid-player/test/static/subtitles/english.vtt b/client/fluid-player/test/static/subtitles/english.vtt new file mode 100644 index 0000000..7d3e2cc --- /dev/null +++ b/client/fluid-player/test/static/subtitles/english.vtt @@ -0,0 +1,357 @@ +WEBVTT + +1 +00:00:15.000 --> 00:00:18.000 align:start +<v Proog>At the left we can see...</v> + +2 +00:00:18.167 --> 00:00:20.083 align:middle +<v Proog>At the right we can see the...</v> + +3 +00:00:20.083 --> 00:00:22.000 +<v Proog>...the <c.highlight>head-snarlers</c></v> + +4 +00:00:22.000 --> 00:00:24.417 align:end +<v Proog>Everything is safe. Perfectly safe.</v> + +5 +00:00:24.583 --> 00:00:27.083 +<v Proog>Emo?</v> + +6 +00:00:28.208 --> 00:00:30.042 line:6% size:110% +<v Proog><b>Watch out!</b></v> + +7 +00:00:47.042 --> 00:00:48.542 +<v Proog>Are you hurt?</v> + +8 +00:00:52.000 --> 00:00:54.000 +<v Emo>I don't think so. You?</v> + +9 +00:00:55.167 --> 00:00:57.042 +<v Proog>I'm Ok.</v> + +10 +00:00:57.125 --> 00:01:01.167 +<v Proog>Get up. Emo, it's not safe here.</v> + +11 +00:01:02.042 --> 00:01:03.167 +<v Proog>Let's go.</v> + +12 +00:01:03.167 --> 00:01:05.167 +<v Emo>What's next?</v> + +13 +00:01:05.208 --> 00:01:09.208 +<v Proog>You'll see!</v> + +14 +00:01:12.000 --> 00:01:14.000 +(howling wind) + +15 +00:01:16.042 --> 00:01:18.083 +<v Proog>Emo. This way.</v> + +16 +00:01:34.250 --> 00:01:35.542 +<v Proog>Follow me!</v> + +17 +00:01:39.000 --> 00:01:42.000 +(buzzing wires and chattery conversations) + +18 +00:02:11.125 --> 00:02:12.542 +<v Proog>Hurry Emo!</v> + +19 +00:02:20.292 --> 00:02:22.792 +(louder telephone voices) + +20 +00:02:32.000 --> 00:02:34.500 +(phone ringing) + +21 +00:02:48.083 --> 00:02:50.000 +<v Proog>You're not paying attention!</v> + +22 +00:02:50.167 --> 00:02:54.125 +<v Emo>I just want to answer the... ...phone.</v> + +23 +00:02:55.000 --> 00:02:58.042 +<v Proog>Emo, look, I mean listen.</v> + +24 +00:02:59.167 --> 00:03:02.083 +<v Proog>You have to learn to listen.</v> + +25 +00:03:03.167 --> 00:03:05.042 +<v Proog>This is not some game.</v> + +26 +00:03:05.083 --> 00:03:09.417 +<v Proog>You, I mean we, we could easily die out here.</v> + +27 +00:03:10.042 --> 00:03:14.042 +<v Proog>Listen, listen to the sounds of the machine.</v> + +28 +00:03:18.083 --> 00:03:20.083 +<v Proog>Listen to your breathing.</v> + +29 +00:03:27.000 --> 00:03:29.000 +(Buzzing wires) + +30 +00:03:34.500 --> 00:03:36.500 +(laughing) + +31 +00:04:13.417 --> 00:04:15.417 +(oriental dance music) + +32 +00:04:27.042 --> 00:04:29.042 +<v Emo>Well, don't you ever get tired of this?</v> + +33 +00:04:29.125 --> 00:04:31.000 +<v Proog>Tired?!?</v> + +34 +00:04:31.167 --> 00:04:34.583 +<v Proog>Emo, the machine is like clockwork.</v> + +35 +00:04:35.125 --> 00:04:37.167 +<v Proog>One move out of place...</v> + +36 +00:04:37.208 --> 00:04:39.208 +<v Proog>...and you're ground to a pulp.</v> + +37 +00:04:41.000 --> 00:04:42.083 +<v Emo>But isn't it -</v> + +38 +00:04:42.083 --> 00:04:46.125 +<v Proog>Pulp, Emo! Is that what you want, pulp?</v> + +39 +00:04:47.083 --> 00:04:49.083 +<v Proog>Emo, your goal in life...</v> + +40 +00:04:50.125 --> 00:04:52.042 +<v Proog>...pulp?</v> + +41 +00:05:08.000 --> 00:05:10.500 +(loud metal sounds) + +42 +00:05:41.208 --> 00:05:43.125 +<v Proog>Emo, close your eyes.</v> + +43 +00:05:44.208 --> 00:05:46.125 +<v Emo>Why?</v> - <v Proog>Now!</v> + +44 +00:05:51.208 --> 00:05:52.208 +<v Emo>Ok.</v> + +45 +00:05:53.167 --> 00:05:54.792 +<v Proog>Good.</v> + +46 +00:05:59.125 --> 00:06:02.208 +<v Proog>What do you see at your left side, Emo?</v> + +47 +00:06:04.083 --> 00:06:06.000 +<v Emo>Nothing.</v> - <v Proog>Really?</v> + +48 +00:06:06.083 --> 00:06:07.208 +<v Emo>No, nothing at all.</v> + +49 +00:06:08.000 --> 00:06:12.083 +<v Proog>And at your right, what do you see at your right side, Emo?</v> + +50 +00:06:13.208 --> 00:06:16.208 +<v Emo>The same Proog, exactly the same...</v> + +51 +00:06:17.000 --> 00:06:19.208 +<v Emo>...nothing!</v> - <v Proog>Great.</v> + +52 +00:06:25.208 --> 00:06:27.208 +(sound of camera flash) + +53 +00:06:29.792 --> 00:06:31.792 +(engine drone) + +54 +00:06:40.167 --> 00:06:42.833 +<v Emo>Listen Proog! Do you hear that!</v> (amusement park music) + +55 +00:06:43.167 --> 00:06:45.000 +<v Emo>Can we go here?</v> + +56 +00:06:45.042 --> 00:06:48.000 +<v Proog>There? It isn't safe, Emo.</v> + +57 +00:06:49.208 --> 00:06:52.125 +<v Emo>But...</v> - <v Proog>Trust me, it's not.</v> + +58 +00:06:53.083 --> 00:06:54.208 +<v Emo>Maybe I could...</v> + +59 +00:06:54.208 --> 00:06:56.083 +<v Proog>No.</v> + +60 +00:06:57.167 --> 00:07:00.042 +<v Proog>NO!</v> + +61 +00:07:00.208 --> 00:07:03.167 +<v Proog>Any further questions, Emo?</v> + +62 +00:07:04.042 --> 00:07:05.208 +<v Emo>No.</v> + +63 +00:07:09.125 --> 00:07:10.208 +<v Proog>Emo?</v> + +64 +00:07:11.208 --> 00:07:13.125 +<v Proog>Emo, why...</v> + +65 +00:07:13.125 --> 00:07:14.125 +<v Proog>Emo...</v> + +66 +00:07:14.125 --> 00:07:18.125 +<v Proog>...why can't you see the beauty of this place?</v> + +67 +00:07:18.208 --> 00:07:20.167 +<v Proog>The way it works.</v> + +68 +00:07:20.208 --> 00:07:24.000 +<v Proog>How perfect it is.</v> + +69 +00:07:24.000 --> 00:07:27.083 +<v Emo>No, Proog, I don't see.</v> + +70 +00:07:27.125 --> 00:07:30.083 +<v Emo>I don't see because there's nothing there.</v> + +71 +00:07:31.125 --> 00:07:35.083 +<v Emo>And why should I trust my life to something that isn't there?</v> + +72 +00:07:35.125 --> 00:07:37.042 +<v Emo>Well can you tell me that?</v> - <v Proog>Emo...</v> + +73 +00:07:37.125 --> 00:07:39.042 +<v Emo>Answer me!</v> + +74 +00:07:43.042 --> 00:07:44.125 +<v Emo>Proog...</v> + +75 +00:07:45.125 --> 00:07:47.083 +<v Emo>...you're a sick man!</v> + +76 +00:07:47.083 --> 00:07:49.042 +<v Emo>Stay away from me!</v> + +77 +00:07:52.125 --> 00:07:55.000 +<v Proog>No! Emo! It's a trap!</v> + +78 +00:07:55.208 --> 00:07:57.042 +<v Emo>Hah, it's a trap.</v> + +79 +00:07:57.042 --> 00:08:01.167 +<v Emo>At the left side you can see the hanging gardens of Babylon!</v> + +80 +00:08:02.042 --> 00:08:04.083 +<v Emo>How's that for a trap?</v> + +81 +00:08:05.125 --> 00:08:07.042 +<v Proog>No, Emo.</v> + +82 +00:08:09.083 --> 00:08:12.208 +<v Emo>At the right side you can see... ...well guess what...</v> + +83 +00:08:13.000 --> 00:08:14.792 +<v Emo>...the colossus of Rhodes!</v> + +84 +00:08:15.208 --> 00:08:16.167 +<v Proog>No!</v> + +85 +00:08:16.167 --> 00:08:22.042 +<v Emo>The colossus of Rhodes and it is here just for you Proog.</v> + +86 +00:08:51.083 --> 00:08:53.042 +<v Proog>It is there...</v> + +87 +00:08:53.042 --> 00:08:56.167 +<v Proog>I'm telling you, Emo...</v> + +88 +00:08:57.083 --> 00:09:00.000 +<v Proog>...it is, it is.</v> + +89 +00:09:05.000 --> 00:09:07.500 +(howling wind) \ No newline at end of file diff --git a/client/fluid-player/test/static/suggested_videos_example_v1.json b/client/fluid-player/test/static/suggested_videos_example_v1.json new file mode 100644 index 0000000..5e6950a --- /dev/null +++ b/client/fluid-player/test/static/suggested_videos_example_v1.json @@ -0,0 +1,396 @@ +[ + { + "id": 0, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + }, + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", + "mimeType": "video/mp4", + "resolution": "480p" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "Big Buck Bunny", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 1, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + }, + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4", + "mimeType": "video/mp4", + "resolution": "1080p", + "hd": "true" + } + ], + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ElephantsDream.jpg", + "title": "Elephant Dream", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 2, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerBlazes.jpg", + "title": "For Bigger Blazes", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 3, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerEscapes.jpg", + "title": "For Bigger Escape", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en", + "default": true + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de" + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 4, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerFun.jpg", + "title": "For Bigger Fun", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 5, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerJoyrides.jpg", + "title": "For Bigger Joyrides", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 6, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerMeltdowns.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerMeltdowns.jpg", + "title": "For Bigger Meltdowns", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 7, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/Sintel.jpg", + "title": "Sintel", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 8, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/SubaruOutbackOnStreetAndDirt.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/SubaruOutbackOnStreetAndDirt.jpg", + "title": "Subaru Outback On Street And Dirt", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 9, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/TearsOfSteel.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/TearsOfSteel.jpg", + "title": "Tears of Steel", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 10, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/VolkswagenGTIReview.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/VolkswagenGTIReview.jpg", + "title": "Volkswagen GTI Review", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 11, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/WeAreGoingOnBullrun.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/WeAreGoingOnBullrun.jpg", + "title": "We Are Going On Bullrun", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 12, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/WhatCarCanYouGetForAGrand.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/WhatCarCanYouGetForAGrand.jpg", + "title": "What care can you get for a grand?", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + } +] \ No newline at end of file diff --git a/client/fluid-player/test/static/suggested_videos_example_v2.json b/client/fluid-player/test/static/suggested_videos_example_v2.json new file mode 100644 index 0000000..706f9e0 --- /dev/null +++ b/client/fluid-player/test/static/suggested_videos_example_v2.json @@ -0,0 +1,383 @@ +[ + { + "id": 3, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerEscapes.jpg", + "title": "For Bigger Escape", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en", + "default": true + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de" + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 10, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/VolkswagenGTIReview.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/VolkswagenGTIReview.jpg", + "title": "Volkswagen GTI Review", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 2, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerBlazes.jpg", + "title": "For Bigger Blazes", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 4, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerFun.jpg", + "title": "For Bigger Fun", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 11, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/WeAreGoingOnBullrun.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/WeAreGoingOnBullrun.jpg", + "title": "We Are Going On Bullrun", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 6, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerMeltdowns.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerMeltdowns.jpg", + "title": "For Bigger Meltdowns", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 7, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/Sintel.jpg", + "title": "Sintel", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 0, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + }, + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", + "mimeType": "video/mp4", + "resolution": "480p" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "Big Buck Bunny", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 8, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/SubaruOutbackOnStreetAndDirt.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/SubaruOutbackOnStreetAndDirt.jpg", + "title": "Subaru Outback On Street And Dirt", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 9, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/TearsOfSteel.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/TearsOfSteel.jpg", + "title": "Tears of Steel", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 12, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/WhatCarCanYouGetForAGrand.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/WhatCarCanYouGetForAGrand.jpg", + "title": "What care can you get for a grand?", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl" + }, + { + "label": "Deutsch", + "url": "/static/subtitles/deutsch.vtt", + "lang": "de", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 1, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + }, + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4", + "mimeType": "video/mp4", + "resolution": "1080p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ElephantsDream.jpg", + "title": "Elephant Dream", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 5, + "sources": [ + { + "url": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4", + "mimeType": "video/mp4", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/ForBiggerJoyrides.jpg", + "title": "For Bigger Joyrides", + "subtitles": [ + { + "label": "English", + "url": "/static/subtitles/english.vtt", + "lang": "en" + }, + { + "label": "Nederlands", + "url": "/static/subtitles/deutsch.vtt", + "lang": "nl", + "default": true + } + ], + "configUrl" : "/static/suggested_videos_example_v2.json" + } +] \ No newline at end of file diff --git a/client/fluid-player/test/static/suggested_videos_example_v3.json b/client/fluid-player/test/static/suggested_videos_example_v3.json new file mode 100644 index 0000000..8c74832 --- /dev/null +++ b/client/fluid-player/test/static/suggested_videos_example_v3.json @@ -0,0 +1,170 @@ +[ + { + "id": 0, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 1, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 2, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 3, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 4, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 5, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 6, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 7, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 8, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 9, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 10, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + }, + { + "id": 11, + "sources": [ + { + "url": "https://demo.unified-streaming.com/k8s/features/stable/video/tears-of-steel/tears-of-steel.ism/.m3u8", + "mimeType": "application/x-mpegurl", + "resolution": "720p", + "hd": "true" + } + ], + "thumbnailUrl": "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/images/BigBuckBunny.jpg", + "title": "HLS VOD", + "configUrl" : "/static/suggested_videos_example_v2.json" + } +] \ No newline at end of file diff --git a/client/fluid-player/test/static/thumbnails.jpg b/client/fluid-player/test/static/thumbnails.jpg new file mode 100644 index 0000000000000000000000000000000000000000..32269b1254f41dbba7d58de9891f5c6dbb27803d GIT binary patch literal 998422 zcmce-2UHVVv^O5TdhLoJs0fG%C?)h7iVdWLv_KNdl@=frr3s-~K|nx20t5(B0%8ae zLP8B(rAZATB$3cmN(e=SgevNv_ttvv-S^geYkmK3t?!+gHFL_|`^@ZpX3m-4-t+s@ z@6P}M^V?>(0sHpt1DNh@fZt<)TYx|I@Bf#5FCEz14<0^v@W6qCM-LtP^YHPb$B!R7 zdhFPVlY#;#PM$t_?3jRvz-gf~!otGGPn|s{a^{@i8R0YkB4pnmdprjY9yxgM$e9zz zPMrDwoqm4+oIVV2C>;7@-)X@9)BFB7z3+DiKpX(rcX01&_W}Mr?c2Y1jej0Gd}Ocr z!d}B4|84VcHsJUl`vCg|{t(y`u^nyRVC%IylUehYY84FCEOlMr##(^xijsUt<T8<7 z>}q>?qrR)7?uxK?h9Vv@_JCdKY}x0KL`S`#oE4|2chp~5*xrg*=o*f_g)unV7}XXR zBSFk?dl3V=7e1YIJnN=E#i8%ZD8Sa_R0<T2H-eJ11zx^GN+{U`7|7}(n>pr9F~0$f za&J(mke$?}S}9*A6H5Wfk=G^3c^;eUjPtjuAIOAUXdFl)1e(Z^_0y8?`!C+|?@H)s zcfGOy*ulEf(gN4_(Uh!`3GlMBg9=QDpuhA}yQgW6+<X73n*Dpnqvke3f>N&}|6N!A zJDERUt(grHVfIYYk2)B63yJskOH6yrmZZ2kB$-bh>k4ywIte9!7gZxd+W9(f7Oiu* zF?T!$EWnUNg=+`a<FC;Nc3MU!@dKX2hVjgG_v}s3ak#aD24piW8X9D6)TzI-XmIM% zLMWd#*miyQtMQFWqu0_mA3pAph57l%!a1=gliUyQC>t6ZRLoF*O}}5)t`t2jh?j2@ zi%a~jqDcruO!>|&n*s!ls<MwhJD?-*#z8SjL{VcmruL`nQw!b3BZ3P|=&=9XJkE!v z3?W4aiq2$69T9}+Iu+k}V+T|gbKP%!^XZL)&oQCM8t@7pUJX`wk>QY+id;s(eDPss zl8`WmFVvQfmcUE--P&HGvJN3Qfn&}{SuZ}&1IqDl=z;cV;PuWt_xV2N+NO>5@aJkO zyNtC5`j)H?pou=V3My}$pNSL;4oD}Pm(^f6*NhZlx;I2-w<snZW+E{V56?Ol$yo}D zV%tg{-QS^j6Du%d;MD1p#OyA8*?s+g$I$<MFX)qxty~hXj$JsL=|AgeA}gB(UN!3o zg;X3nZaUnu!0;x?yjWJL6hCcGzFrUvH(Tzu+i3@l!~GuVT9(7cCpl~bmDs>Mg4VMZ zS6Ebk-%xv-Lz8z%<hRBR#N2FmFvfGEPw>ax`vavINIf?&$7S=ARgSfF;qlf1Jlg7z z8Yy1gZqikLgFzuo$(5oUrIRgOc2}+uL#ojh=bJo?8eP#m=<^6ymv1}m*gS_i+N!86 zmEql!NPD_-Zz2TZK~(E-fSM9=yT@7;kQpad(W6PGt*^eTX`q_kj%Kw)3<t%ImFv;w z7P_T(LKfXS<}orTrQFVRb4`9}I%oc;-|8taq__X;%ni|b8}ah11>L@RP2sp_fpF@G zeu{nPuzMGm@MQvn2w0@kiZ0qzVApYk56!=FXMG02TjTY5jK>=FI&NtY$a`16CVv~F zomti_k4=0}smNv`c$@e>Mf%x`79dJAm{(Vk920AkR=O!ur7I}s@u^QExjw@pi>d*) z16@kJAX12#*rnu06^gXpp2LJU&{pH(^*)x9TNJK_7Uk;3-vihhU(Y!D*h~;mT3#zB zRa<OySy=F}#z5NN|GjblZ))#7{0Emax~Vfaz>+Ac$MX*5lQWNboJ40GIcuIIyie-z zRnwQ&&oXaF5~T$JCu=tSX5mx%zAqutf>=SLBSP|$`wzc*{Hf%mqT4&;LTQn^KCTd7 zV|NW=0C9~Ak-D(IHnC!J8|^CAptF9@C9Z(YbbT{6(mQlF+G(KK2z?Y%17~TrsF7WQ zp+x_h+dwgMBgrp+p=`=vE4_*NxOoOktZ7j<D5TUC_1)5CzGq}U(O*#6^!9x&Od(tC zlBAgeNSK^xeJ285*d5I)jBLIu&4e;Wmx~Z0iGA+mbY@<GAT)51>~mW9u7cuY2cwLW zwO!kz^Z1X|+9x+7K7cK&>z8kXM}g(F-$+BtgRyUS1E0Mo34i|B`%?1d4gc`3uA!vX zAZY#BTjeq>CMdMf`KGz-8py~>x5e;u>0HD(J4Dxkt4SpKLtmPsOr2{vHX5OVZk}D= zJ*(=UcDsVcuEe1F)I}u{l<6S-=se4_P6H>w0fI8}&LAV%I_Q}E$IMmW*ORe?5|mz_ z{El682kS{m8tE>F=BHvQ3&!1%Hos}!qYBRPUq&|!m!!VP%ruAHx($y$Gu)az%9;N- zb`_6$>Xy28@8doPyAz=PW8~2>Y_k$%Zs*E1XB6;3sW?95trPF3YnoeHJkGGMcO$aR z{v$5VI>&-1GSh~=gw2!RVxNC&1Pm7YU=<7x`jM$?U8okGB+^J9U<RYS-bTf>)@xfI zx<y`#OH5dAMWPB^MXEh?Ng!1MiuC0qIL-g1hpE;Gt?O56j~LvMw{D`<$m*Gg%_eDd ztx=jA_#ErjN7Fw|3VvKuC?fpXMfwoB6gF*Bgv@ZR^tp8Ri1cMr*!MBI?&5nsR2*j= zT*~TRa6R|MD8$gc5vY|TG5MowCs=he&R*SJYvWaaf#!}HAz?(S#?DA8V2Dw8C>8xY zv&k6@vlaftLSZ%ERl6c3lL#j)qka7{t;013_;olNm^9-_mgLqYMRVABvvO}T6dgjN zM!Z_Y>yUa8K#;=Jx$wcm&n#axm)`~JK9`9g11(Pb+=L8j^r#jSE(v}ja%1LlLgxvX zckUqA=WL=GE-E=oKx+SeA*`bwb1=Fy!0V!`5>%#Dg?*$tdoA`Io;p4PPVp}3rA^Zz zGT*&5o&*#MX(1iSNI&Dt`IFVSAfyl?qdcu;-KW-QlrDHbye6R@Uu1c@x)tdSCtaA8 zH4xSu*cd2NDb(h^wYr;IqmI?}lHJ(|d;iYj*2)X@Cv)%YBmL?aV=!PN&Cj1zhALAR zxEz{a{u^Mp<(hk=9OOW8XtqT3+lUMeXMcUyt2eU&mL>5%r3N^e$yJ9jujbB)YdDh% z$d%=H++MxRI-(F>r($6%BY$2pfN|%IX>HX)pT|J1@ADg8qtBA06eHFQkLSrAmb$K~ z!pI)p5UssS^L{FlJjP?ObbyWmfIBw}>xW|o`sWfd%QDP)Z)Gai+m10R6XC&MemDTL ztB_T;gM82aA4S)wJ8@uTcR7_l2>pa*_S?5x&-s*b&NVX!)8xexXnpmTA<0EA+U6{) zSeM=Xc0g?9whODCx4T(6^ED#m4<Ou9Qw{t!(Ku#$Hg4$UO8{X1C7(NY#2y~lTZg_D zAo{l|lB<TpENzuZFrlM@V8kUi28yQ0sDEQ&!D2}&c;hosX+Uu}(w>8i_73vM)?~9p zAK;--5cCgxx208WDK=m^3xCTc&wp%s0Xy2Gg=}h4f||gbusCLfT&!E{yPfUaJcYoY za@o~k!af%?7Vp#ZxSdQ~eV3jCT^6;q!`)aN?SshS<RTH8mA*L889H`$s_5HHf{a3i zS+zzTRl#y}V2Dh(mDVse>w~b5@gTus@<fKeEKpZwh$yU9TGqipw=D7Ccp#`ii_;vX zRy!75fsSV6ln3(Eha(GJR*LXSR%&$vIVJ8oYjme{;<ftBE@Y>b6!!JrHcX5*00n4H zYnN9zDewo-KJ`^vB{|>O(O?R<*=%OLWb)aYf*)KSpT^~&(C;m76)tkh!fHFl2Y)Jo zc!e?R3b9IqI;2kY9W=hwCI_q4IX}_6>oyYCD0FI;y%EhEPRB2T8EeDGzx9rKK!nED z_-lnRL^e5MkYJ*zWVk4ile?_eNNs(g))duLr9B-G*9c;`Ni>uP1itvhzfrg_yk5(Y z4}fk!*K-m58*66R3qsa?g$4IvYP5>(k)JhKd7Wit8(p%N`l#CT`mPuxkhgvwQIt@p zeEYouoH;S2w43-qF$atHvyZuq?(Al0V>xcK+@U(3;1r;9Wf)yglL?ypF+?qy(l+-d zhdcQByjRc;9edlgTLD+xNXdt%Yj#X?Gl|S~-WcTqeZa<Lnq&{m<j3L+K{v|nI4xUY zw+eY&|Hg?@gpR}BAp7@pjLFEj;dthtm`sW5)$ClZAHPbYmKg-q#GPjP)6GG4_~IJL zzh$IFb>>58;e$UFmk-@Omp^>+MRD)O6@>G^QU%*D@lq5|VZb`p;IhJC1qPU^E--wf z<fxonO#vg*t?&SgP_>@y*P+;<Huk)u&OUcEL74Nd%+0YTAjJt?w{_bv0plth!SQOY zj^50$xv<#xNr%rn*@Cdht7|+ZVRu1gz4XEf1;@+;a^)fR<*Lc`sww$bT%Y$+4h^{r zM9u2#EVE_dO2t=0vBYF$mE|*)>K_^&`r)CH2N3-g!FqaIQ>~}jeVugWQ?66WO$aMT z&-LA%iI|$@f}E<D*b6S=xw|_KPX$QoKJcP6_@WQjxFsBu{;Y8!D&|z)x~(0T>N6vQ zt1i@zK87CJ7;2J;dOTuzqKT01d9z;tcKHjDPYf&JieD@K%E#2FawgrG#;^*5{G`C3 z=C{l94$Fh*NI_xe+f@?7q-N2-!q6f^4&-Y^u(K78jKpDs0*Px_{Rcf8kc1?N)b)q| zVi@N-=S$c{cG+2TX9^Ni9bXn5sgGJ;O~3NVM^wfuNpg>*WS?|>_+ZN=EJ+!25_Su# z=tePdx;AXkB4Lk=tj}KRrj~$BU+z&Jm8^h}A=xA(%uwc_!4LV>nqaNP65dofvtd3X z5Y)NL=R}m5nZK@cp&*Z1jpK{xh1E($UUTWv&584=a^%>xz!DJkle_WvLYqSlLu=oD z#UJh-;%pgQRiAh@EWgk@Q4`VeND^|D{LFEqid@C4LSa+Yhv#Q@)Z;IdeVvcd?`u9K z(%p78aVXIs&-HTkixjeA#$OPDgEfx8Q@NQVC>pTRfHyQhJF6e>^A}5l9CRiu`zSgu z@Ti@jEW>BA!TDCVEamN}Q7*#6wu9{2cGkuOlO4PAXW({GJrD=?7<qTU)n;g|VB(&o zdtcCRKstf2@hkcrmlsU8VC0j?51b4SS$g>eOrET^1_o(#jk)W6H#qDgm5aVohozvh zrr1R~z&vc+WN&)z)^7kJ3K(1pbD-;gdZ&K_aPx+LT2BTN_1KNz{NqSrH277kS#_&b z6#9+ysQ<{!9Q2&zSLa)j2c(mv3=q0Isiw$~##2`~W3#c|wc$P&t{a}n6L@0wIw_#t z<m4lTx+0ufx)J4?fo8*=4gW12T)31uDt1wD%T&7b=7E>@<~8M{bIB?91CNd!^*Dkn zzB)2CxKVP+D!N^Ot9AFTG^CVvrZ3^fZL_x}o^`NX0&IcDp4{HVT*N*aO+3h5ee%%G z%S_14O5;qc2Uf7-2~AD(m}%9q+gHoHc(Iri@DH)SHnvwbyjg0q*L0Tq)~d4$lP5bJ z>}G>;F069Q-}M-ykPHFi@(OQ@;UiRYkM|4lxZQ4h&RAB3Ny647CLZncr=5A<qEN@J zgVJwAWFvDv(15ns3}8y1^$%U-136j;@}lGkiMPde!~D982s=MZG}IpK_bA;slKj-( zttQ8>QD~I;8(_`Sxzz71p$Ut;R{C$s_^;=EOX2imz9Srx1#C#){XrG4wJ7P^%v|e} z&l?TRn)=Q6TFD{HJ^4V<e(Ze2FB69A*G1l7Z%ABQ_a`)mtqk^uXmk^!44;W_%d?8G zRJWi@EtFRr>u5r<JVictb0_Rh-bcE0Igvw~r%1#<<86Fl<kw3)1y{uE)B__iO(PQ* zt>YjfUWf51aF&~Le^j-r02qoAk*!p9tIxbU^YM@+pKbrLw?`zV{f-RHzzTGQtxo9E z8f7|Z=isDB^_qSMEbnC68dqDvrOrpygt0kTkQwa5V6{_LjPjS(&^#7R0e(ikY`7GH zhgsvQVm=Hz=UA%A@PrXQuh09T`m|Fr-ck)Gg?UZk|5Z8vRz7rpwEMI<3Qdd1NJ1^; zrrrIs97an4e$G<QaXc8nP3SDIl1@qzsO4&M2CMPp)cimEpy6r>mOcI~JibJuR%VTe zmG^#N?tLjm<hk5^yDliT&X-g5Qy<b0@F`E0@M?$rGtNC=Du1vktmwlADEL<YIMwFb zN?Vy{XD?~BO})ILuqr&E<INjq&?)xI;Xb*b9B9v?=j0Cwm`3|GiRaUASoyeVdg1)i z;`aTl(wqV1g%x|zb#hU0CnsKRLAeMCvH0sml0(Ga^Eb^uOGPbI6AT*1n=Z2qEZ)qH zm3`$e=|+h+`wXJN^Hh3~wOmT{+?Xk9UcEOcKxgd1@u*<++EZ7e$@SXr-~5|W{_8pR z(uSe`;>;{RWWyzoRYB|y+XNzC4-XW{pS20(z~6uP74|iJo+8Zu=9g%WOx2A^9BDn- z=nccweVsu1S!9NL=432RD8F~}WVK+Z5#JR!ao-Gn15zdigM*xg#vZTm8Zo%fE5WyC zKW73j8@Owae5UwE?8elDY<~Zt#|{}FoYf5szD1f_*QYk0_!X-WzE<0;!9zxmC+toL zZwnFAi$C)z?VR0IeTN;n{tfT$ozT#MbzH<Q>stL#2rU+))QbBOmqlG!*nyAlhF$O! zZfvaHjWOX}3;V~t{sD*TioCQmaCk^GyE6)Ms)9J+K&)i2uyf9_t5Tl(vUBMnEh1OY zeq}VR^X9qmDhM&9@R-`-Uq9BmZslM@3ezY|a>Y>^L~7W$bPOcQfig&){oF1{w=suH zJpqhu2%EP~H`vG{HO2(Du>5W#A~hIvpMkxvlFKDT=m=AhpD2E}3sQ*RHVpR<aB@A& z$y276_~CxU<dqg@kGBCQTIPeDfmJ60P}9wST&+wj7T5F+K4T&IF#*^pA(+Kdiy+$A zoi8I#Ke7BwfB{8bkMTaWNejt|*h(SjNL!Y0gw*#=6xn~kB%uDT^Wx%}tXJqhyCkfa zDU|~D@U2@XHC3Yz=ZQXNI`t_BMbr;IAMcA&;a7v3+!9mRM#hldyf-AH;cVUHtkZ7f zOTb_t983)IU~3A?f^KyN20+;@w@F%)GyHq_JqXq2gBQ#vE4~6<zBM|y8A>-X2(O`6 zv<H=*h<2H1GeN(ZR^jX5OY;}!=CrBV)w$V3pT<=^(b*t=<!C!KYO<`Z{!a4G7Tb<7 z><Xv49J+FsV4pDIro9r_L#&rjGH8v~<4x#~cZ2l{@qHX5?@VzBf0*R4Fbj8*y^_AP zVE2Qf-w^%9Bc~aIKEGIrDO5I`0E=#%8*7;wAeOrju9be^1|e`oncTi~{F;JhIq9xq zXG&M%Z4qRYe*8!N!+(s8e`fzECNcNl2??+iQU$wMl-c+)*^~L=n8a$;K)1YV@YdFp z$ar@?VwYm;9dI&D;x}Mmz40U_=t(}VkFru23zR8=IFTc~<yXP>&U{=TjcS#b?)l+m zMf>S_w``3E)PioCE4<(*m=I`d>gVV>Q66+{X8nH1L~F=olU|3WVLkTQ%NPXR3V#ol z%dH!sxZZobz2q72D>swR|F#^eyUE1r#_I*eTSsRZbZZx<e~UD{%YhnEVOByuwX4z- zjf*S@`-e8%Vcm9_!)sHP2!e*zGu$RaD%5B*1qKo~IQLZ{CiYGpQ}bonEslA!HCj2i zqS%UX>o(o_KDYXBBK_!jgf*HmJghL8oSl^D@-YXPcw8y250!e#@HaqwHR`W_>gyl* zeH-w^C2i>TplJAdx(2!M>{)AVAKe}MY98{(N!Z=6+1b{LYt>tB>A;DexnJo9)@g9* zsy>k$$Ez_>3LY{&KT^9zpxc|NTo3Zh&U|Ldg;_p4ss5Vn06ib(M2h;>>Rm-%C#8Mw zcchD3Zp=4oaGKQmr=)YQ<0*eUA%7FWT-_#ABQe3o6Vx7fh0U|w#2!9(CuXE^ofGWq z=eLr-(PM9(lYmmCD-TUCG&Du0pQ5cP7xRu8pC`cE8GXT+YSE1XCUd?!zt4ECrO_ai z!D~wU=3-D<h@BFR&;^%+zyET-l{efK!PP-}@gvvow|e`Wj3sX`%Q|h^RBr<>*!457 zk}t*^9xCRL5!5e?p}+ytZ!Lsd)Cq~wP94f_u3P$v<UudD$=p6nibx~1IoNcADr9mE z1m><eM6NNET7DL67>MZXxcAY<)&g1HB42`IP_zSnoQtqEn!EG`l@SfoJT4YCClM8d zVaa8q;u@dFSTq<YuBea9&8^w(jKXjqerk&5jUvCNw<U;2^iGKt-D>yd{gokTT&FUh z23$Lv%74ecf^RzMS|7z<;H5stS^nq{3CZUShJF3P)Vp~(p1Rarxa4<g7>AT*0_E&Y z(}tj+Q_5sYrtE&Xq}SVCer_;=L`4=NypCV@GVF%Byo_-q3M$u66&N*wB*hp=jWohS znppB13n2u|qNYMrWms<R>4+D4Fb}C+C+g1Hn`*~J=m;c7YVyJ2w)RxJ#XH`wZ*gPC zb~wTfaZ6;7?f{P$bj|(`Gg(UZ<tWUET^Y25F{cg85oPUpb%@VY)2pU>cg~QruXIp~ zfFDx4i2DQGTI;#nnVevmuiu9DUdt)Hp<;!3Tay;;%Yu_vL;W<~JE(@=v;=h-U9E*! zsU(q*$jyqm>WH-<rNy5ROZ=>Ensxu~9=C-w$@fdy8~FsK5=+p~$7kX)ud?<BPGa73 zx2pyxZ8|67E99~%8gsgO>Z>g|Ns5{4rPQ)F3M!qi%n~6!at7rj+vhq+2h<f$Lrmhy z!kDm{>Ih`ys;mkF<=LF#QhFlDj+P&QgOY6b?fX|^Imt2{VwOg`%fP3hG_e?rBIJc! zS>gks2vnEN72g4}BM|!W;SbK&*0e-7m-It8CZd~##7K=s6Y>gndd5<(X%m#wn+%)A ztHEo%gxCtcZlEW$j=f@|pvy0kmrX8+)oj>N*G2v^|9NPp0h1OOFEp<kt6(nE?jxI* z>GdqyaU)C*CZxXvbycWOB=%3U<*jrRZzvn5*ucUu-4X}4f}`5t)VtGNi7R=nh=G>8 z(RXH<3v@7;$PR!q`FV4aU3cfI)Q_L{Z?ywYKDwsexl_0!cF`h5?8JPR&hu?Px=GQ9 zsJRTC_m!HNoWO^OIMdr4-Sq#eGZE}_<ekD-u77@Miej1)Uw`=?rHP}o0fC|E>8%hL zv+xSMFr|l8)Wh&|UU9wfwP`w$9IiI+NW?{?K=LgK%T#;utMDN+DX&cMnk7iaM@z5e zW8;s7VXn&9^q(-N!I^z#ht(O9GQ1Nh8b>lB5DajO#+2IyTYX9@nq~RexSIWrgMD6S z3$Hc;Aqry(VJ7|u`|LwRPYd7&2n+`JN^V^hBkNcUO)Ibv<RVRSOAe!%uxprfOQEaM zXI^G#R|X{u2U|wA_*o1ee%=kO>3B_(9C;&YE~V!sU-DR3aKJ~=yHTV9*#~PPvO^cM z+Y(O}<TBS`7fh}WS0-IOEvL5KV=Phf>205GEkzx?;ep7Ji=z(kK`y~FlWmz}b3cp^ zy!$gPFV!2!3<c&t6T`jaCY9IH%LjZ$E+t7Z$|Xr6R^XP7hx<>#pf&QLbCVS|eHwv1 z9-lfd@V0-(t8DsN)2v~q_TSdbXBHM0o~yA3mYvyH7+C0)dv)MbGR65cm+*+FGXtCY zo6aEkr7;3=ewh5nK1N7~iSx`d1#s%+lv>44jW8|6Pc<UWc?(9v0Y|TH;b@A|H*d<J z%#wT`TP7JD0o?c~c<i**^_T*8x{iX!ewSp;8p(TyrG-yeW!Va1U+;Z7_VdSELvGri z^uY#ABU~bIS|vkL1z26vrowI;*`g~BFQ-?;HM%TqfLDiSB1FHyic0fdf|F7~BKRb{ zGf9-qz{UALzG4U@28;=vFNCp@hAHAlYy4}JZdbobCii0>9svLpAMP_cbKsHGQAxla zo+Awa)B+A>-necGxcYGab--TT{*M3=vxEC20VRMv^1Zrak^tMivgzaJ|3dyhh!D6V zc;NZJiuf0%kNd6z4m{ld9}H)tukZU0iAMzw?xB?bQ9dU5k1}BY^`rYFZ6#|>0sEit zzYh4H(jV)0{@Juk9)1fl*Uz-;9bANVVM~!s$hK3s(Yp~laR<!^a(*)#ed;driwVNP zDLo9E98*74a6cX~<>cp3CaWbMGAuP5UNV{AO|vLXhn0$B+?GcxNc2>xm}@od?r|mt zQ9nE($I-V{f$Y4PW`NE?v3y}tL!K~tq+XR~giO;~!wd$sTL+iD%YW53_pQGHv@ru` zWSl-=X?HU<%+^2kDggLYTu9N9kxh}wtv}(5X?pRqmPHqv!~{4K3=+eQKA1orYnXpJ zb4c=u)E&SbVddKipb?g~rIkXBbXRg78J;0k9=&I<zZLgP^>V)v0C48MPi-Z^pY=~I z{BPtn^crYdDopY#H(<ahw#e#@CFry)31@%<datT<Z8KBIoOXXUH?D~S;mA*npD)x| zpEBbybt)>hC0IPxDQ2Gn_q!5(4<O!(RvKNKvcLzs6WMY0+@BX8b0OH$U>#0G(#S~f z4rDpW29d<YoS;dJk2_8Nf&hJS4x~@DGSX&$oyZFqU4U??^f*|3<Jymno!~VVeJet5 z$AI;vl~6uI56VyztnVFeQ;B=DJ&OngkG&7{%rAogZg|alCrehMWiL4T2p?0iEGx5P zgnZhna($1vGPUEtw>Up=zVAHs3^($}8`x3Mnr-121Q)n46^SnaSU#Dnl~eS|k`h<p zCO~P`pHOAy#U3J+l`3o^vG7$5W>YH_@4wh*4Jx(6ZxUkfl9RL?_Ngw%>957M6i~qe zn#pWq?c^|jJL$*$pi7LTN*|blVn7!t&juSMu>u_ZdJFYRxm+85&@~(vyRJ{Eo^2tK z6OdkEp`jF=TObo{FScC6tH;UDjQA$1m-SRrlUeYhigz>1>GFCKY4G~2fx?r|!;Ifr zEJjJu+qGR@*J=7-W$zfh1&Exyp(=w=91d8IF-B7rsLcP3k@7$FA(&pJ$oLET^n=n{ zOB_d5BTcLReAk}$Ev-OtP)ea*Ru&%7GHj*J!MFV6IZQ;&m6*+0sV7VbsnPI2_dd)h z$Ao}&cV{+MJSK}R*SMu0@|bk7EkC|fUFX+;G)c$1UwaXI7Q>5e9tkJboEr=21l@>T zs%<`}aHPC3*wbF(qjHh41yu(;H5aUNl|J0TLI@>1U7Oe8FLoyLV-_#ghP7uC&&@lD z5-YVR`Z<dQqv4)@v|Fy8DF#9}N8rQozk_G&$mzKh{fP7CuagiqS1TqPAsz&@bq`TK zRcE@*nc&uYcDSXFWAdfRN>40unw7v<WwhmBgZKA;-mW^0_Zy{2T(B9D2Aeb2{Ri%4 zI8VDC`I235x-KKSZumE#hCUbt&HlQCn6apkruQ(oyk;%lgZtm+8{>*ei-b4@di&}j z6Yk09F<{6b;~grL;7Vvz(j9*>zm%}2O&Evhu2)r`6!$CMrXpz%xt(~IR{x&LxSdDm zdhKDAWm`q1BQ+2Ya0n^J%T9iBWIC{a3wO5CEtytFFS-?c(dSo0b%9<}R0O2IU;&EP zZi|C$c1jsKfBpIKjO`sjNx!0_V2Y&RV6fxI?4xq$XhumMBNP9Vwf`^bzl;8Z2}*HQ zvDA`IGL^jkP%-IQos9QB8KdWbeNslU(k=Uq$f6Yecgzvp`a_du&u*SbGF5yo`TEr( zl}g+FW&#I}907!(Zj@?dGWx3@z6`kd=MBM2d-I)Cn0A*bobF(;e6r?GCiqxn?AuQ{ zmaRh>asoRY3q$yCmQI!-3aZ0)qD^17D{kO*b8bY%ZC{HE@9N=%!8tgYA>??#Fyc$y zr@m%&N59ZOSq+y(6T{?JwL$}~LM{|oeZUmmyrl`0TBy=aE#9ausq=P|HM7A6@+S`` z^!z-J_sNmS`0DMQEiEp4W9?I&-f&mCI4beDQO66GIBz**Rgo3iiYt$7jYv@tT`qiK z;%ur`%YH5p%X~1%@>YhQi_vps9pPN%lGAdD25Oi6H1eD5ooeerA=vivi+cb#gQrz{ z<j*9#k;RTNI2>6u5PU5fI>$}$F57&LFE}$~HCaWDmAD_xXgzf@PZvrK>3yUieXERJ z<eOi50mRrq?;0GoDcf`Qhw4Uqv3nq&_`3Y&Mq(pU$;oB>ik^(+Y~4$9jQn3z-<M-X z*oMJ6-#(+c?R0D)7iD7jd7jebM)~Tp66XktDz18O|9PGirRkPZRGs7=qwGk7cMia6 znyea%%#-)tj2jW{S)cg_tGw$WebzQOSEV4#dwteW<Qd)dfiBix-vU>|s_ZSc!oc{~ z^PEPDF#Yj8*rU&{Mr2Xhl0tm!ff83r>BF=Z_R;5DHHvf=L+H7iyN6ZS2@&)v@Z9`I zy3Sm6d5VQG8BDB)br)S8i-3UGdTV`JSXb}%k^v38-+G)OL3XK=(MRUYPsg^M$U{I; zENn>Bj{5pQa;*%b)?F{po&2>;Xv(w-6Ie`3VCKy+x$X1gR7;8{JBDD=@zd>)%{9NY zU8jnfZYwE#9k2Q}lu3c&-&%MCINiS4nkTu&CV~fAFO1#$KoZj<F5=)ieRbT&%1&-z z%c?6^@aw8{^Q-|r?Om9q(?BPBpnnAx=Z7z{rOkPJv$7M557y#E>a7ZktbkjEzA@%T ztw2L$gnsmztBxZbbAA%b{S%3J+cXWjf`+lujAlZ2>|lq#u6Z*=8Kk*n3&=|;c4Y97 zw|?A6947YsQYBW)53IPfgY!#w?4#MZA)ETLV^>MEK4#ecP_c<kmBkM4yO;oX5WC># zeRd(HWjsw>c?{hed#XH-&GWZ3MC=cM4=s8YTabg$JS_%eEbDe)FwjbWJm1faiOq40 z3+l34m(4J)bj#|*&(iV;22X=M=@vmya1{;v(ZYUinO;B&TdJ|>iL*d{{{n+t4seU> z-TfJWeqLN2(lKDs?e9!QY!5UAr?NWU;Qhy{ak^%%iriGQ>gwG-e<i<i1<sfq+6m3< zF1avM*CGn{As#2|*7q{&!aMNAr1So|z>5c75l@%E9AyuHjzc^;1CRCy2VgYNIgj}P z?@z}QGfhzsA6rWQZDFMmxr1Yy`?-1S6UjS9>;Cgo2|!r-J%CRw-o_tauZ+Rsr%8X2 z@4LMT{EjqyvgYpkDA2WUYG4^9gC&jm$hR4<x~vdCX94T3z6lXAPZ{M;QO)anP3uAh zU^;j^_ya0GdL?UT{DObTCJ#EB6fN^$ELoWr<D|E=b;K{=L)y(^ugm?dx4xNW>^FUO z=DMi<9fAFSnM%GExN$&J88+%?6TmMv241MPJ%V}eH|*~FNSHj3b<AH=OKtc>ZEVm& zuTd@WjD=JLP(1OX+bMUY7G15vi#AF@4I{&8ocXY>F3~<Dl*2;vx1??&vef7{Id9X0 zrMClK4TGR0pc^VMFo?XYv-7>Vp$O8$&RP#4^V1kHmU~N&2ZZw2;H>%Yaa5EfT`P2j z(8svdoaRDK&Pg$l=lE8JCt-3Hx0~MmXpmMVRZ$9zc`!#GC3snuGhRIL+0s2XR<=^! zb2qm_#Rxp(36XgeTCR5^dss%w3*Ur^D;TWSf4hjAcrP+~qZ&xphAPiuW7W{&XP+&v zV(RleEAr}wgRE0DYyA$mk(6!3?+$(u2Fe7|?zZWYT`9almM*#X#P?qAoCW-W9*cEh zn|mmI366A&O~aVh%r_^bh{UFxeT;U(=3_F1iA{E64a?bNZK)lkcd%s@B1dnm)7>T5 z8yon&5%o&H$V2%SwWtE62nw2&{*;7KJ{XpUO3q1>Eq_3;2)f&<v}K`+^o+P7fexP- z7psUblD<qApnQpL_?3Qq!X;yx^38Q&0!vn#Zi!m4Bd4B_=OE85(>%)$-PXQ?^PNQh z6l)MKxVMO^zv%WL_~>+1RJcrS-0tdKTCtI<jvkO7rRPee-z46aLNHMeu&}Twzelaw z-jQRu%+?rTWm4-wWfSIFp^$jsNpba+!E6|3_+;w?IO$gqsn35Xjd<F|K<;jJze>c1 z&MyqoQEN*~#7}+pS^ULY4=?vc@<@eur4*-6hrtmNd8$lNKM3&YeT`Lm>g#_@wELIl z8IFzu2hYG5q-;~r-Ahtoe1geo8RcHPkw9mk^MX%|WzXC+noKgoH(oQp26be<U}vwj zWHw^Zkz*5;>B@dQd`12ot8|w8fu;C^dCW-TRpxau$+CoMs69!RqUCe`Fjl&~Tq4Qm zN-p}Z+)UR_ME~e~UbkFCC%h{vc5i+tE$#hO7(+QTH=y=@Oxg1*>nSBF?!~rd;aMsZ z9p*7%ur@OPrE_}y!XYTaVMy$$W$V-Wey1ec**C<>aP&BS(OtV=?daiTOA&_P(k$E9 zXxYlwZawhydk-I(^D5Kv<$1rTg`pLwt932n8IhAHONUq4g+HK#w(0ijkb%3Omzrlc zKhL40rKIGo1ra`edoKOB^k;3{ZNvE4pI-MPco6jr1IGv4Se*|m9}1OE0T<S+0^Ur_ zkD^=DP?fgVQK9`!Y=f)yX+>>aTuSgMsy?AQO=%EuKHGpqCVqqG;pKUOuuR1L5{lsW zkB(nN-`koUf>*Ka;iby4-*`LutGnrY>(|7$`qgabNBe650Bj1Aq__>UDu}@Oclrwn zxMlfS6|QYg{svsbw_W*|yF=P)D(M=)KF^eX1OT9EC%n5J4-Kyqa#L!te@+tJ^2N_b zbK;9e-P32pV*PhrZM`EnGG1o;0Ya8WuM!?Zd{1NjJ?N%iF7e^n6}qgVBtFYpxdy9x zNiJ4Im5HkBwrakO){F`!^i;QMuTe{8-GJtu=c}K=&DnPmPk=&pQyxF2{y2djzRwQ~ z*;o@Fch?Q`YmaIrSt2i2W5d1t_6)A<N3Eu2cej#)$hdMDv<23OB#pMghiT33nEyJa z9F&+I>lQa?QlHNGSvRBq8(>FvJzoBXrV!;Lt{UwY2%=s}4>_3&*$WduRgrPa79hL1 z@s{-TrG{aOMui5+s0ZdyXJ+xGvq##Z1fBvyRMcPgk-@)}J#Qq107`zUw;3Sy`YnlL z;N-<Q#=<lTI!=kR9knTnX)A50Q>#g%aAZgLRIak;tnWtD_QZL4(pKz6jc*(({%d)Q zmI0ey7&*^d5uzu1X9@IV9R|q^@2s5T7pj&%$XN@E*&;<H1qy}DcC##07X6e2Ju~b6 ze%@uyzm#RQK&|IUWa(~Og?&%G!@gum3Uh`?K5Oo@Dn-9~nQWza^Snxwv~-SBAtn9n z=?5r;AhfXueOxRes!tt4HC=JB;->f|c-WR6N>4I^;_Hc+E69I5uK?GQ3s)4(&HKJc zzONOiQIIVbd~%b9qvD?zEK8B*vmjF50#X4?&s>7%*9)@gx&EfvPf$jZS^EVJTvW-3 z#hl1OE_h?pVs)tQ55*p-Rmyn+7yQs4!fHoJidIIwNg4O3=Gfj(DYjY9I}|Ki;Wmua zYePDJu|a*_M4nz$TUS`S#pGVVOelm))JQ<zirLxeuD0dW*Slx+dd7|${8F#zWIB~3 zy$fk;h#}8`=XFcZQn|cq*(=x%ORxTgs^LD()3Fc)OcUqfU7f#9?(iG1s#&bG?j*P7 zQ8&gd`gv`)K4+ZF4ZFGDp<W@0lEy%))TqoqCPLBvQ)2#8l^^aY`+Xf_U}}XN^PIbK z*Ccu${!>5y$RBECe$r$A2Iza%%@b3D^z4=?y}J0Ck)Hm3zQzlnxI}0^9vQ%xhD5q> z0=|wZ&;s%~ampFh(7Ga*nQw%8gX1B~x=jtZ(DuHC`H<Oxuvsi8G`zLUce8T?6OLTy zh@goN)P9fGv+R$aq&uBb*Jh+`jLebmOzE$f>!XFlwZi7%onJ7RKdR5=c32$o0kU8D zg}?fkY47A}B^QV2@iD6E;Hlm`mqu=GE<LyCi%@DWuXmSl(#j4@^)7uv)9ARbWZC{~ zSh}tU#y_`iw=``&f$Dz}k}n$SLpOGQPH=A2^nzw0m@Xhjm_p~2ub1U>Z*Kwa^DOCs z6!vUM$KB$>NU`RBsN_Fo{~#`Yt{S;qwPbw{UM?JlzhVwazct(vx4mvK9!1lS&ziS5 zeNZte!0d<sH_0)RMq8#P<rrCLDUMKuAureywu&7`D5~bQqjI6<^xl=zM}!P;cH~U| z_adle(aFg?pH2@fI?spDY)|9t1mphxthsq_x6Qtdub;0IJnMRTVk4?$a(!*3Xq_9? z1jar#EA?2wA(SUYUanab)`iC#&+SO;x;(H*uRttUlOYkWX3_apMQ%1uilTH85C{|J zcRBxKi}GuoaNMghf$ZZ+>uu!KFhrUm1rmzL3k^YsF;cN(64UvEDX!%<h}np>y=a7? zHRRjyjh3ygoMQ5ZA!2bL&v3$bp=*|1p?Oa~e{^tnMdbB=($aqv_Hlm$9`sRdw4UDI z>EHbgxVqjvDUNhmoc$SB<uJbx#?!?Zw%QvK;PifKHReR3&kOpSu_DTpk|z-r056_f zpj3;M7q%q0QDW8j1BS=z#=2PycxhToDrNsDv%<-yyF%vuBKaPtwS6{dZT&}LA}5s6 z=tyocajFEXwxzYkM?VPVM1+0jAVGTZ3S-6eK92ZS^u-h!N1_dQgq6&yq(IvOWan_- zSD5V|NY)d(9vl<kg{amC@%ZYoa)L~6RP2LC3*X~`o4XaU-(smBHYIX09tG;Af_7Kd zetrLsTLqk$2(^QxUUeua$v+*@(O-E<DVHP<WsZ0GJjk@g>tvmFJd>x!F11>U!n>oR zx&~^YK_4epODt<``>9nf+-y(SLH!N?H7Fa(HjMo`NE?~2izp4R_U4Vwy$^gE+UY-j zir@m>kR{48QUX{3K6C}`-ssOin9<88iZdcBOsCD&kt1xyCQ0nqLB@Ax@To_P=W+}m zy#C6`$|iN!d&v)AMr^ymPi<~jm(58l-r?y6i}1+W7Kdgj4@)}-m8rhJy$}W<)5-Hq zY%lNy3$HK1;C@}lHVxs?IvUOdR;yU!>p^2X0?!NW{6UrQR_}ohF;cbqp?N8)`DBRy zB22Dao?Zb5Y9T;Z+2B>GB~n`2<QeqmA?4z%9JfM=iK)*aA_WVB8e>3znhqGRn}YPr z58#lLk`jFiG;py-L2}R3C&83teex#nO)EL}%r@mj0pUGzQpo4L5J_Y)&~g&vcQ+mw zzB*RM8H*MN1uPGD-76ri^z%d4Vs)8g#|J{O)pr6DY%azI!#Vzl?4_praSynec1+~X zBzbpZy_cbkMKzD_@O2g`s6tn%uen)qu$YElRSnBT+8(=FO2Ac5no08jmenp3&YoGG z(U12dk$0_s;!Iq8=z61wO4P&^Ey|zJuu;EHH7LK2){~I2r>MSb0q??IM1x~hySmHc zZ8`~9b#kA{NrJ-mZ@|5OjFJD81tI1i_Y2(XXn85()lrYbEB6K8nQzIpZUaZ_@VDcO z>W)re-zd=U?TD3+yR7W}D`0LAQ&rg$VA%xjFB{IX1n0{l%|v&U(5t(oMFneriXhS@ zZe=3=$Xfjq{T&IV$p`fbQ>TKaE*ha;EOO?4)jwYpms=KLgS%)qUbX@I7oU(Ogi)JI zT4)!CIgsE$^zk2!3q}-uwgf!bn6tS?X)*ALb)mv979!>h?TkKQmzZ?s@P$|mEb6Df zZ7_^qg?1mt+lb9kKQ^u|KNy>&94_VXzq`1eYiRjV|8XGHCcxj5ZM3uq@0IbmaV(;+ zd8}$U55?@FF~+QSaz;rC3y&FT4DXUO(UF!tfKCTlqtgWJXd4(i@1AR5Q}~~h^^d}- z%GUUaM7=eklXbx%+-FhgNY_4V7ImukXON3qbwoeXJ$v-;y~iE_6&LHfGQ8S*0bJeq z1bC-8;Wxm&Tch>bgM;Zt5v;_e-lw;p5;w|E)XZ-goHQww;m(zoJKdYKcgm?yu;ebM zR;_FFDFnE~<i)b_6pLQIW<<OC;dM-_5`j7WRh5P9`gP+=^tpWNoCoT9+bU5YV&je~ zavS-^scvtT3sbv%fsoJ8zh>Y66La8pTpo9gAC_g|79XnKT4b;ht873DbIIaPwiV_N zO%ro*<v)QYIX1dqmy2i|Y}&T|PqiC+&gi-)Lo=Oo^BwsU9J)5{8ZP!)e!Wns|KIdO z#N!t&`ibc#Pgi%Wm*&1Tw~V%2a~lK&-EBL#u<Fd;T`~XOyd5+d_oOtvZEqBMsI@Y% z7LkdSX&P*h`_NBi3=XMv>Q(NysXdQ>4fipszOYFQKjIn4w)&uK@l5N*WD|V3$As8# zmXP*#PEQFrv%Yp|j!vUHwiUiv?i2L4+FWaW@MLAJ<!6ekM)tg)+q9c`93jtcBBvp? zu`${g9%=aG>$kf|SN)#q6T0~@@cnK3_MPX-g$4X?yWcQRG;>|&Il(3d2*PZAA>T76 za-lLHzcIzh2OZ%+zl|VO>k(aH@OtMVG&{GJ&^PH`Z%r4JwiJvJSN(H+0dJ#4(hM2? z<&;_5qmk=%DVN~$iU}P^h9o68(zwUT2>n<>3jRy-dRTP~Of@{YU8GVwRZd+R{6jHS zE-7*v)Hv#E_EgDk(=Yxm4^+1(=I-XGP*LT1%<N0O*EibpnU&b8<x=wjv%wY@6HVOh zEF!cPVdpSt5A|L&ofAvZox;sc^~Tz0h+i?2<{Ekyf1927Hai^?Yy%^pEz1=y<44o# z!pa;-N`Zp4#686DNMu+CB+1a?FU7Ll`R472A5oDj7w994oP24pF^nkgyJ$-McVg2z zV2R?)t(jVBu9@$Ab7MsFzfv<6IW?J-4DfO{RMbu$nxj=|*Yg)wItjSwk>NqNKJoaJ zWlyS5$FetrlJ-+ZS(?R;RlZ!1YIwiu@6=-^!=Y(|(J`G?#4Df;Y)Fj@hHicQp?<cH zf(8s>SU8RZS*~bw*FM<R-H2hqd_>9()5r!v(J^gSYZdbU!myE;#GkmLZLmx1ompBi zxG4G?Q2fzMJr5L`XmEdTZa1cc5q06+RzDk8!dA6&yqRfl8LR18MtPN-aFf0mYh{aR zYW*%Rdm|duhW??SMm?3o0y_*3%-WiJXt?w_eLyuV@n!M?jF?y@tJfth9WMh*kfTKL zuq|haiIwlap5zUz)$lvhZ&3%Q9NR47f<rZs?4z90v<+O0)i!*XwVsEC9ga9!`zN%v z+?*P;jR~C^W~J{)ySl3ujrABMp78n1%~5DS4fbGYjB>bhI}L?G{;RlX7}}?+asWy^ ze!;&tPeHfPSy90JQ`MU-i!13eED@tcr@$kHgUL2QiZ%-LQo*0w#n|<T_QGL#PTehU zd&_*O1DMoFj9Ar<$Az=WC=~jmVW3RO+?HFLUU1BKpnZPHIn;q$LYG)IU+*s=E9LBr z%COH{Uldyifx^SG>yK66sj5*Hu@R}=A};zKAc3U^e?BOpcOVObjPo58qHX<3+^w{^ zdS|K6n&gs+Ld(xU(7{|5zBonb6iH$BwRBl-fGf{2Ny=3uL*2NJ*JcCr#r2Hdyo-i| zJyd~qh%**<MlGvOdkOgVc}Y4Ni&ZhpvYY7O{yL(Sb`)}cx&Oy^It!ImlX6?bI4S47 z;Cr9sXEnWzf|kDEkx~=vC7;Sm*hCw%ZdTXk_V$mvUiYD<Mk+{pxik&^7I($`mO1&g znMj!Q!@a268|5LHH;>?6eo&Eytg3gkE87$1oPYyTY6!mAZghha_i><j=}p}*#9XWI z92O~+ht+%xLO6XYRX;QOSn-WrB<}P)Y74qCcGkuRPfq(j=EzJUV6raWsJbW0EC{r2 zCKKJzwN1BRs$ux#i5efQ$1vDd^Rl<N@V&JU8jG$v$#T>@oVr-4g^{`Cldqz$G6An2 zR-QSg_V}n`yVUi}hax^?5BDQSAK*pZ!JfCJ1)?kh?yHW4T4Hi=DQEGpPbS`NdUC#B z|H@IeLfw#N!CmqTm-}y~H3x*q#c7MLxV@<AQPnItDyz;awfHur@TRQ5e34KN&2Y-P zvM;u8Rw*L&n0mh8vK(A*&X}0ForZH!R~;)TPm&BdeN_kY*xT#P4Z9gtd9A~LJbip% z-@E<S0Y?>47Lou{#a97>2T+Ii9T436jennUW{(%($id9i$JaC810)|`-wPJl3pd(} zNjP}s|BOzu*7lvLptIxw0n>ewfP*3yGA{)sUqY^al0Kp+u>Y|1zXUL($Yg#zBJkgI zZF*Q*#9Zsh!F~VeI_Z(L;4zsC2Od9sD7`1~z^fa^FBKmd37*Wn0RTuI7Pt=hAJTt~ zKd2v0kulE{?1d=?k;(!_8Jzgn4fX3M4a3Pwx)Q9EP2Or#m+aP8H`PYu{P)F!vhr;C z;^9HMMzKmG#GzHzZVl-lwvkPqXpF8-S1)f5TDdS;_LaOAZ^fb4=Q<T>3V%5RmhQy+ zeyQAl^f1i)gDEMQ?VIF-Ue$}}9P@522VGeG5#hA5#b4XQhV=SFm%rBRVTx8#=j+1l zu#7#pPeJ;ypzRQn`n=`<#VfZZZSHdVd^dK1_w#+CD&cH0XTc|Alb&)5g2ybXypwXU ztx^3OaOU8d$j@R{zT@^<Gy-h^xy=isA4?em9LP1=kNv9>a2;?M0FaZG$SuG0Kd9;d zS+!<#WX7rT8n~1a3sLY>B*{bUdM*%BUVF0xn*Cs~ZmQn!%#uBfRL3l1ByMbzv^Yz@ zie|N2-D^?Kus-Od_kF{~tFa22sszF`GA~|ul(4vpG`YywvAiENP4+R+uLrBS5$2|< zyGH5sG=2=L<Wn6NTVZgmc{fS6NjF^0vuJ)U`Qu!_d3*WRBtE{#GlKW|*Q2y&pkFVx z+TL($nF=h9`8L1#K7a5Oma9U>>5<@8jd(7PGxaMLJjNu`V7IYScG8E<vFtAqBmyGV zWcAl?K=^wWub#HuYQmS${B?dIPP@cf@t#4N<!=D_X``$i9hT)?+u>R47M&aJ_k}Tj zZ-d%XE?kky-|d(9W}T8l|JJf6L~29#KJvccB@5NG)O*9l+<`IK0moyI%D|F*l9#Eb zv~-zBO2z<XKuc|`<?|kH=PnW4iEO=nF<29bM7aAX5|7HC*-ZbV!v18{iS0dy@hxgE z>*%Hr*MEZ{2smcfVWaCu&+*KuWw>gevO#?LdFsgG*7z0T7tXRKp+$=pGm+=-+8vaY zzlV~Sr&dzKLx$<{_2ogRv;ao-(MJl-A+iMox`9$$Q+`O8M0_!Qdy=3#A61Z8F&h#W z+#+k9eFBW+#_QR@SR@2HH5+E9XD%%wDPnfW(vXy?NIYS@1k#NG{XZL8{|AEi`zCfs zx0g5`3m6W_f~lv_#C*Hh8SqZ^z|$!KWj=4bM!k!5@%J88A)NYXMDyOx^`SP!O-?fM z7;kZGfT+W4yG3FL7+AMv(L%U$=r!ipM_PSB?LgWVFt(8gdXR`->LC<!#^dkt@r?lt z#m}f-g<zT5VLTAlABzJ=Uo~m2fUSeOM|LOE^_RAL3oq*3s1_QDVSyu&k>96;XW`?# zLH9c69GHSo!n3H$g_Tp$*0JYiZ;FtXX<!50D|*7@DtlT@9pPf$So(#aXstPt{-z7l zQ&e+dt*UjE4iU~SSS=Vz7)V}ov$I5QFK<*Lw5_HJz42iRiGFE9FxQ>TU&dUHMQD3~ zI{7nL;(QKw4V-RNHCIrinN(hy@In6elHZw0vla&iEzzk6jo|pfihO=qeVih#wbI!W zF<{I^g|>`r8gELm4HE0W9z1-WpkFoWN`NKw&qAAl!4DLs5oO;}G<nfUYv(Iu(+Vbl zzk+W^mf4@gur61Onx!}P^ESSpW%N=6<^Dh3zB{U^tm_*cyJ7*w5h;oSN|i3vLK8xf zmOuhw=p_WCLkKWqp@Rho5Fkhih!7A$f|S6h6seH}5(xrIOF|JL0ZAzH<$30L*E{dG zzW3kntgK|8weLAM**Q76ckkc+ZNtXrMWNUhW?Rse3TnM^si>&~@Qd5Ioj%op`e5O> zSem@tSYe5OvHpW`qO{6-!rZZIuY~UB+sWJ!Lefl~K&32u&G(d>Z*r_)|Ni#(|NgI? z?LSS>5fVK9ZvT5n=-NNV{O9PK2mUSWGx^uc{=Fub8X1Vl=bYcqX&ycv<MQyT$Wa%e ztBtosjvfc5D&<+40;~gBaPspZTK~u7dy;|5i-X+T0_4Mi1GRsc98h|8PvMS?*irSR ztL=c|suXhjIi>fq3NHIiQsjUpXO5f}v7p?4l1@8^vNf)}pp69IeBG^d?LAH#a#y$( zdoNmYDiKs=^oz}@bZVh<cA#8tu=Z0$7lLS6opbu>2)mFolz}I&X$&nNQ*_dwkH@DS zs!F5{{b))X%u|LFYDW1VaanMU>IyAtTqjD>Wc*8ERl;$9+>?2--VWnF+4l}1`HY+? zv^a&B2vy@uj)+H-RnXX)Di>@F&IRSOnR&A5+-s;CwXix+0`&B1BnoJm<1HQaFcPuW zJ8b_v3}yj4*5{mUh?nbL<OTm6X~4K^KW(y&=cv_c%39SD%Z?v*gCSg3`)N)B3L8$* zW{<)Op<dP%(Rd{`5;p*f{#4scF6L<W_it*F0*w`AL}YWX9xL&|WZ<HJgOsO*?F=v9 z@jDm>!h3Kvg8>`D1+-8I<4Jyp-XdGyiGmyZ?_Irk;7K4$Xuha+437geXuQXavp2$g zJg8C^-yPTGE;D0cIc{GXy1%CO0sRU5$oYvwHeq+xWNSRpE|rL1H~cm@Q7!HSBGR_z z0}I;uWNz<Pb1@T<(a-;~R}wc=nWue!S31?*I#kABy{XfM6>F59OC6{VMo#!B2cdAU z8B?)e2I@6xPEH6LszMVEfBw2cl9uk>c^YynokAevmfKp3IFvb-ZCsD<NIFOu94K(b z)71irJ-^n-40c2->N)#etbA$~ucEg(36+zsmXrsb%8A)qc8(D6mw+Q9&JO=2BptBA zvt==vi}P%t-&hry<;(tXc2>d|Pm^qD0fcy<v|Hbm!we1GN<^1<&6`XPS%VG^h!b9> zmklW<7S{Vwz72fm+z9VbmT_HyowC)j`E`M)@g&_f^J7mXs*Y@p&F{~I``N@Ft<jmq zl39Kr@1hEF=_5<DPoV6lPiVP#ab7rUSR!-R@FGb4^AH^3y5V6XBOKO<Me-xh*lRw8 zn$LFlww#?J;TxgGWkDvDlEw8pC#BsB`~)GjX&?J$MSWr|*soNJ5aivg;(n{zvbD`h zsrws2Brj_;0_<%q@|iT1KpK2o&Rz=+`8H$jrz&mgJ6CTqz6?<{omrZT(+&5tzRv9T z4G2!Je}q|Bc`B9W;C3w&8poM*#G{6Btyu}FmF*y#Gfx~f2W)MkP5Ll>7k~cRB{JLE z!nXDW!W9V+4sR)HY+`Z!Cqg$?#ogu@T<m;-SR>si!YA@I&QQHRaM}8dIkOhjS^j|Q zwUQ;r4OD<XWD*UlDFYP~eNp3|iI~KNZL5JeQOS7uJo<^)+}9U@QxFPWC0V&qXHMoy zp=(`nvmwtWV?qJgKlPbgxW<Wz@?o|gYO*?qVvZ<L!MVK@nM%UO`zgJ5fp(NvNmk~X zjzrJypz-9&qqWVrf?-l5+_(E>eih((<XvlfrIZLOVA7D2ILY<Bh{xdrme|v|Bn-3+ zJw{LjR|n#>N`fONiU7VsLU(2DmZj(^cxUcABH8Qd8|F$DcX;KS4RrYFg3)UmRmh>w zVQxjatufOBi^2SabE}Yd8m#hhW_O^1{crgq#vrL&bZ_O+AilfeSn~p6i?ma)SCT2M z<7dH<27bTg6p)PB{FXPt?93aR=I-chPpeA2zx-m~(cca~+o}I-bRr)qe(m0oOD``q zUb^?Y;Cf%^Pt6c<7g#az2Gb||XCGsxG2*B-KpTG|Q^Rtc;UfnALI%QeMoFQH{)$St zTs;w5Z%}+_65cD&h1=fM0gFMRU`mpXuEm6(Ow<^}?k0bQiCw|hy9EM0KY(Ld?-Ugk zwMb5$>F}lEy<xpV&gjIsCZoVtj<?9%S4+7hUKws-Vak%-td^_&u=$Z<o1wyKd-h>j z!WlS3Pq<;M!?iO}Sh!_cE8^Yhj>Iank+}MYm69NQZe^k3{ifdYiYi!6zw^>TrK2t~ z+f?i0)aK#OlRK^<r3+#;xrbt>2yW`6k#6I{PT+$mH~sOYJni2xc&OvCn5DbKu#46{ zDHKu=6q8HFVloWKjI}Fhz26jLF(34FgJA>3y(})MXZn_>U!7}NJ{9|>9?X8EKl0j< zD7!(m<UvS==Y=&l2Zjxwie(ijjd=#fCiHJU02i^>5r$enS_URFtu^M7u=2lvL8)1& z3TI`8azLR+m?uh~Kiu99iar|~R9qyc7-s~+<&O6%uVH&x!R*W|>AM#~(N1T=h}Bx< zGN*xj-6iuNAWSl(Q;eGd=FiVhO{YtYQKD~I+XN4|b;M$xhi-D)I6><hf_sR4>VAmk zI#0QF4SfsLc1#3wBQ%ixD3r~P{kig*Q<s%^la^iFTeGn7>(t5M45M1{+=c0|@d)Ik zM7Q=#L`78kSd*PD=S)|f{z6Ef$Q8h+Euy#8i;jqk^PeNbezv!TBX?aSzl319JVHaA z+bwC3r1%eg-@MA6=!eP$YL;G^|HO{}3-@5^Dj+7?CtFGtPDRVVoGN~52HCsimjkx~ zn1r7(dHGN@O*?R_i7KqOtc4?}x2pN(G>i!R9m-fto_c4i$FKUc!-Bor?Rq%el1u1t zahbZ7lO1^ftX&UL$2xqfBZf=6=)`)_`%)G?;LrWF%IV%ZPH>w>h9)e2WM4OYa%ENr zTY_K^B4qqX@~g}NPU~-v;G)wCOKLX;_3poi_$5LmY}^I6WWNiYlu5M&q#loG6AhHF zWwHhd*I{|DIbWzop7Nh!R~8K4hMhO}ddBa!%*jE^=v&7Gbhq_ANU?_~cKJtpohK|5 zjPJ=~^PY^0g7Y%P*E=VM5gkaEDP}gyH=M2f{5~&0e!on{*WI9@Yj^=S!E6LH@9F#4 zTMq7q5DV~NO@uBts%?q<Gi=`U<?vv)!;v~%CeBi$o@~;8Pb4^8g_y;K^qNo1Z9tnJ zF{f_PK43D3fyC#ANO%LCcs^SBUXv?5Im@33&;v_y%E>@KN5MEGTqU=&1Bz$y63u6m z`$>giu2NZ2dZ1o2rYCCuOQFLS0PS>Cb<$WFl^HbD0AEsGN-S4(<{~>QLO;xBky=hl zn;(}{^ePW;un@WZ`!5S;bXFi2;9yx6xg$WaAyB)b6}ZVm^p-Eg%Rap|;1(CUW0ZAL z95`S$@7Z|u)qabIKnFj`nyFm5>^?%i@97Pr<GiQACPc;9h)QqMZ7|MrCGxo?F;h`% zi!id#Ix-x$<GKgt>Tx&{yVn6=l|gT4^TODYw0GRC<0lIizX|e*p-G0C+DsmKgt?w@ z$~RfHR5CJ49u$1j%XPUGi+<mjlFSe+1vRZjyhT&(&#F;9<eZ*^gRqt^f7NHCr1=)P zBgrU$xqX(mJpmz#PlVZ#UlW4a=3)^aMDQ+f7vDy3P2d1R02?POemW|rt*84N^*lAM z1!fJTTb}VWvFs`fw2s=GC0V<u6#=s?j^$FWj_3LHwvTnta``Y;f_eVtp6V5M$VdWg z5s5EJ)ScTrr!6zo3*!a+xkO%e_xfQ(USL8eLA>p)ZUfls>)rKKt0F{<O7J8+V2Bt0 z=bG8`K~w+0AQOZXsPoJ`qnV96nihoxfbNc2tyGCRdiQ9SK0C+&?6*v^9P@2@KQ4a7 z>J4Ag{VEyJT=jN1(GZt?=`iZ+E3Epui8J<Peo&5unbJl16NXvOgYmOJn{DbnKpCv# zBB<BuvDeQY)jNCj-xtz<KkW;~OLRR}e}T1nbEh#(%;UNDzSF4|={wslSQgg@JeoCP zXq)<6Oa^#0Kgs%n+@OWHHq0}R@*y$&N8DB&<A+hnA+wzoW3!B$6z5LR3|~j7XL)|n zKpHTdfd3GxWnU9E_O=f0gL6}h8he={_K@h^#WER8Te_sMR_(uj_MLWtp-O}CDsLFE zVf0hwFQLq;Ge0C_VPr?eyXg&L;gsuDcPju!)adI>xF6k9d7?A~V={kgxl=2*Zi2^N zl+uj(na2uEIN8^)o>TjM-kYi}eg=G&`qD2OGTFa3Uc}!4bzKipA+dVPA&ngk^YNX! zRoSyfPrK9t9ADhK`6Sj(O$!eG^f{G=w6#UP?tTzZH!r4qw%qy%;=4mZ(GMM*zQJte z%YRtxpW;4l5&d`|D?HL`ZF7n`6wi(;<Jt|Gww~~NuBWG)+UbMx#}w#-!s9P|7(%8E z@5OPp!>93bLrC0W<hW*CqBb=1-Pi(sV8o!Lbp8A4#Va;(9d2<YW(J%I#L1`yWfzA} zriOB1>#Dct$;k%rty+_*#m<mUBkMZbc$M!VCEGVIh~ll{c3R%7gy?pLUMv0eh(F_n z+o#4k{G_?nazMtpjv(h$msDRx%5SOTRHG`Rr5!`p5d2p;x5y1<6{@KLe<)Kn|6WdN z5z0E9jFV0_>xn<T`C}}<0W;4jzW^!HP^TO$5QPJ-U~PP{zBjEkU-;sJ*^g809zA>I zIc!Q&_Pkz$lr=v%@a3O&`KK(I>{o0q^<qE+1oTacm;jW$ZT}e<)m(`*oyrJsD()5F zF*Kh?-T7!@QPBtf2n)!HLX;jGo1vFU9{ZU#h96sQ0#CL3M%Ll4`<2Rg;a-THb4jW3 zv%1}sQb0r%fXD!C--aM74tlV!#<&i>_f%^2RJ17}@@Hi*r!C9il+q8QXke6xNw4VD zuB&#wV_t~XXJ2!1vy~ff_4lTre&uD>jSDlo^#+_)Tlb;jR_@wvXd-Y=!eFdiHIFf8 zP*DG_;)12g86~NwLE9zAk4x<#CY(X-RmDSyc7xSZ4KyZMHgZ9^ayfRVc{mQJMy=<o zK;1_Wow*(Ii9>e1lsRw&_3547NhXawyEEa)L2<)f_5W$0f69kj;*$=$_mitmHO5BZ z^Q!t_EVpLWi=8c*CDwc<G<>cx4^pV8tmZoafflt+^xmOc2et4GIOXsyYZ6*~-o9bw zEi&#(IcYuqWON56dQmS?zL~yb)qatUc+(P%Tc5VTZr(Z-6}A||M05SFfPWh3h8d2e zmz1)1#C}ZmaV0S2y*3WixtgdTNM0o-JxR)#4FT^E8n|l_tVK=UviNqCE`RU&kG;fq zdfV&p_Esi&1K(x{Wfo?qcI>(#69&HSHRtoD<FYr`m>ng|Rx)6Cc?oJ<Q_^R2>hnK8 zD~s624y&`$I4PHUFXwJXdaE_%IkYb2pbHHKegn`(B^{HkF<g?DtbGN+@Hstix@&;q zxlJmmT3MV=%=jASRHAi|ASrZLNyqS{!D`7S<VpV^@FD(S4S1v!70PJC4;1TCh<)1G zfs!%K8#|-DFvoO3mgZn{Ik#qBqTqZbT2ylh7sOWtc`4crly>S2DEo-CaK~$FD<~(^ zI&4X9BM`|8Zj98*2sXir@JRAX|Hcdi2Z0zDHOdxPIT42p{3k`}E=#pxKB?;2Cv%#O zHUP$DzONsfXra1a5T7eI(J!Zh$Ai-F<Mw<z$qeORLxaZNoTvfSZ6Ys@ko!F*5(?QH zys`GbgaEhlD3f{C;N>d^PY-fv`K6^pQ+vUS$G-BR(xqKfW(woagN(&Ice?fj$<W$9 zS`!r?!~!*2;w1yJ(1fn+ks(GXwZ-AVqOW0d=*02QKVH!S2W1?a#a1@nZ*Zu+ZnfGI zy>1H7N$+dWq6A*3SY4;PmJtR4@v<#1xs`|8%gd-vfXr=4TiD2)edLLViP)83Xc0Ru z!e{I1qFVq%$2RMrIh;&<9|djr#gX_PwdF_#$0IdhWG$^W@_5e{=8J`ing%TnK!pTp zhS6aq@WDvh@K0EPM|Z^R0^h+Hxw4exXLdH4S=woM(uT3uNmgn#vNh|`-_l84{^zpz zr+nB2H-&ny;KDgWaecTx;6y=r#w&xaqw?P7kW|AXBZ}hJhV>xSks71pBSV?RN?qOo zPe@-=W$f?Qcv2XHQ8kr8Rv#ddNXD!+M^6_Aiqo*QncdK3)!!Ota-ktul_vZ^r#$sT z-zKkhv`CO}b|jDO0*eW2%2vy+DrXW;S<9gp-9zqw$B1@gj5wvm+bSW(stL#h0V!Um z;qJw*pBmhLH!ow$7{Btb0FiH9Yp`?eYkG0s4%Lh?bhl}Abf<?l=fsWWEkmP;^h#{R zP?JwcGCFE&)J5-1_vjRjb>wtq?t%&3BwS<3IUs@hs1q}#CH|co9{Gg?{=5>N#{EHn z0kaTmZmv63w#qwEr=*wH{%N6q%D=Ft^Z2?A9jAaw(?;o!%H>^A%>}{7J24$Oc&+cT zOh8G9+V}T44Ad5odNafkQ06YGd{q$!$Y0r1Er!YuabJ!NgP@5uN?9H7*HZ*P5pjvh zn2G!J6A2wgHIMKkTRMx#j(VvL*znJ_iE_;9H)l~bYqxzy+4CFA*Ozv8#EajC$E;9h z){RaXE0)x#z>6o6Fk2FCuBY6MP|p~3mu1Fg9{hYi2|rh36rJTsSln4*OSoy!#&)J& zMSiH8IOVj7?5BmtLKOmNL)XV<6GE^hD31NcHZKy<;3sX&)2{N4DlB&8q0Nv02j~W0 zXN0#`r8r$XRO#H2ET`O*_lUx4tC1Lj39EkMFqW;g-ZT&Y^t)BhLpL{PH`DWMyEl07 zSG;`n=3m+!3u0M&^^Xp{btE`bhJ61LDw!PQ8Ig{RzyiL}&A|L`(td`m{HXOQj3k>r z)7jkTGTgD%$P3pd4S4RVJ@op(;jTiADnH|gxzcq?D{~lP*X(Ly^7k-Qt94bfhim*P zs9`M$$t>GZHgYYt!MGxP$1824b<Qux8f1;Gxc()ii~KoOm)i^ikt3|1GzgLh3ff!= z)rmK!mG9BIBPh7`fpRIPa7XG4{RJs(qpH-KLKlHSo3W4&kQm3Qqr}Li60CQsAdBbx z@Mgm}4P#rbp+AY82%I**5;bj<vno~=;d$IN%>tmNWYTb63&)3Uzz;PHShw<-gTqZV z*j5uUf}-hhzzn_G_Ra^T>e#9%38vW%aJ{8S7mFFZlw4&iaH2fN5H2`j8^y?s&$J>Z z0;`hXy)fw5WM28eC0ci>0X~f6Bdglb$M0IaB0vJ?t7NGkkE*ku<TR(_&m%%R$57_l zbe*9uc}dC-o`Pq?Lm-9DpGK9QU6w7CgWdtBS|nTeXw7VtO`GZP8$T`xXtetJVr1xt zV6MUN*BrRGc(O(5QMhmu>4yEouJ?mVl@!%MFsuJBA)v0r1bFJjI`{}-v=<lJLck3* z-7`@_pGJK`<;nREPcrp>Z#ci)5*NFdh1~W@XpMNg;eu{+wI7)v%jbjOL5Nl}WFxnE zmY+7l@pZdN>u;wW#mTe;a!TxumQCjAL><~0RW4?*DYIk29{iaJ5E0{Ul&&I43O9-j zj!Q_aSuGjL=gvSBIQQhPl^~~MW+DuxDmbk=+Xh9ps-t<X8?84bM-B&HXo+gHp`)x? zy{0c?lEiRsLE$D7v)Qu<U}SeJ6D?p;Rpjg#{*;y<3h8uM*hR)eb@YSSz7~-kSuSy2 zne&m~Ib2&*Q@xc@mRrJWHd{A#<jqse#w&q$D&nYj&qBL%bZ6xJuC4Aevd4S47mG6a zriCk9h}0*u0mRU$O?~qd%Dh)AS(Te6<{2u$jM#HEfsG&BZCo>}%STwi0aQXQUhxdm zUzdnS4L#l<4Q{Yn__5F|OK~sB*_Z7f{OetAm|j<?M@*z2vNe<S7Hd4E`l8FxdH|#o zL|B3Lkm5C&fv=5%$9DE=<GtkDP{VJ>CJdCK)9m`1)AZ&ZJsbO7C15z<o;pL1mD1*0 zi5^FPUj<E<<StM(BrjTI?K=U;t~$rYJuUJ0QdSmw4{&-w<n%i>N%(Uy`mH2PnUkh8 z2Tl#L?8k**EwYrcPH7XVtf3K=q)B|KxNHOp?f#*v;zL!<`;AszPDF2E;S4uiryND_ zz5bffaHkyST%(lgY>oI}EiIdh1m9~~gSEh0l5OwY8|!dE`wi5a@f@f(al*&#b(1br zg$chJLoQJiy<ex;eGF?9HG6Ya!ie|+f3C5`r5;&h{YBH$P9g6k;F~ZfVoYStP_(N< z)y?mS-pR)V0y;qE8thToS)b>^=VZJK>O~K75U=p5Wy7f%h<h)NXo++YJw93pJvOlq zgysnd&G|;|zl44HVbi{|UBH>PVQ2^Sr7{&m$yL8H>V0$@DS>4->Edyh3%eRkQty~6 zNM@DD+w7iOrJlpmpOAd1Mz4uothrA(W*rY4?njOC!-8RAh!2onNTZ5r+N6w&SlCeN z!?tVXGgpDj=G7q8`2G$^>{{XUg&5huhLX6Z+af`~3tf8Yn8B6Pivx-?irK|#2jRhE z17v%X_h>t@*U!C8l{HEMi>TjHV}+NVp+|`e`34r=AORm$6MPBd2{~ld=wnxXrnLC+ z?6jeOvzv>Dd3nk3+Tv7^Z0Zr&6G|6qd>w2aSp}8r27RO>wkB#FQAlXl@RM~*>o`r{ zeBLq<*H`DJ`A~`LOz<{E47I$j<<+JP)jg|v)p1kVOS@cOJHw)5+5Vbu_X@Z!WkGSI z85wLErdYSD3~~*{Q&n0G#X(r-CJwNxPwh@+U4cWobN-tYA5D|%S+cokHid8vxOx9$ zF7S!U$DDt`8N8NX{AOJ7%C0)XSoDO;<*P4_{BrH~!+V0@eD?B-Pbc#ouYJzDoSG)v zpe{(0{X_2l9|xWZU3*lqeYNSA%5%rGWj}g)rfZ8>Y0F+}^f_|c;$M)9_!r=P)MHOB zip;600U@HYr482)8Y^BC_`qH&m3X86IQ1-97*KY_$_elBZ`}p^10uJD%1-|4gs0FC zGan_%DGYdeHwoq}SNQjP5iX>;Brzlk@uKhT)hbNJik#75^<wv~^*=ixwD0yf$v5Ap zw69IgK=z8biM302YL&v8_rr|p{YL~`55kH-$d&w1ACbPf(5oM0ypw{gBf3SN*}b`Q z>7Q2$|CIOfU;VS209i7%%#s3JuPgB(U4ah2Ms2FN8MY-KcY0}z*s>)IE%4p*8E+Zt zct&0cVjQdhzLp=MZ$;I$s>{jiF0ynjSgb0qCx<{6s8!7+j22B_k=Cm>+csm!k;v-2 zTe_6XxZl!EaRIZDXD{75>s%m1?Ha7>_M(Iiyj@;jYh^RoC8c2z8wT-CmF?E-uWjzb zRrTWI^wc!Gg{N#TUgX&RV@eX&ugc32^qekF+|-MWKZXCuKTlpwx3MkRy``AU*`10m zq~NUm=ieInS4Z446-m8wS4im2hl)1<lP61l=axqKQlJJKDarWQQ>R!$r!8LXPnS7% z^xiW;SW)QMwKM;;#{Uml@|4Z7$7C~TCP_JL!{vjY=&96)zoF@LEnFRqx8h6GnzgEt zw65zK9*%LHct(mBWgEph;VRXp^^1z1Pi4>*es-hMjY6smrssnm#7QO(?7Bx{fQ^*i zTOeI()-8AWmtl*3V}<VKkLWgW0AEnKMzGtdrk!`$;ESPd1Etv)AiT}%6=CQ+{DKwO zv{SW4n#GH1**)d7wTf%gO1HcPl~&`z7&|{dab0?fOf$GRwcZV{ubpLkaT1g1GWSJB z%e>Q;{D#U=GkSjsY0!Q?Mg45JVk^ZDDfqfOeJX^B@bGQ5+Hs4Kc4uZExSi72D!cf( z){R_tF+2*Y+BwSGdy3gEF&schJea6jl775>c)t0Mc<EfGwCPO6{y_oEUx&j=8xNQr z1sty$3d^W#uyP<~6gGICbQ%$QwQ^H0;ST|@;?3HrmpuM<cofFHp1H>)hmm%2n;6Ff zvlX5Ql0r?~>R{(adTk!%HKGax8$Tr6i7?}q?URD&cr=edCPp8Gx73=-r}q_apOU9R zIBOkM1%;$C!nn4J&cG73G+XhEGF;0GB+O<Pg@fr8qQ1(s2T|W5yd0n|GWC{V;)8<g z(e40VfIBp3ckLmqYb~CQrziq1GKEV;E;}gOn|uf?4Kci0*;4$go<jM{H&?U8wwki$ z7yyS~lH31(tg`>@9CD7SVP{Wo*l#$xbckAC4mca47ZIQ-f79D0>>6I!1=NY4*Qq|s zkJ;VtLF^euw1!6&Wl$(=a!aD3v5lMUU0r>|SWLX~WGr{5qdk?0YtD<d(Mox!RWAu_ znq#fbQpt#s=91XXn5|nj(X@G9?F2^05=O2uiYIDvSuG>k+Y!SY!+47*iB{)ca?cWv zkvAaIkpm01&1;c@I{qBVD!DngU4@UB<5evC`avf}CX^Lqn~Qz^@I@lHaQ1-9)DnlU zs{d(o@5D_g`P3haGmmUw)PYaEnLwQ`1k{WC^FXnhfln1wuGbW@<ol%!xL}3LHO#HA zF)Hzm5g!;5?F!M=w;}<MZc_8^iYe1WT@y)39r4!fuZaskIub`EYQ~;h6j;cizgq)* z+jk8%TS0}g+&oFAWK$dEUXjRkdZ$_Qt=5jj5QxNi{+^$7c`vT2`0K9;Z#G<OM=Vxy zvhU@MhPt7d4jwnm>e7v2f>=dahg)&XYCs>s$fk{4uOAB8^@`nP<o^ukRH=!#fXXH> zt7fEW#f1+kG0#Ob2ew^YU~s4w#96i%8U5vZv-bQ>Tb)x1R?^8Uwp>|vhW9~we4pvr z)2U$<DY;_8&l;<h#(a<bo~6|N{L(R#e^K4K=BAIPK5J0Bi^o-XFjcP8{wr+L=9Bt+ zK4zrY<#W4-J=Ct^<=+csU(|^2r{@~k3=Nq6`3wcC%6QrTtf1qxbW}=NP#Hv{T3_5u zQV<!y3U<zaw-&X)kC%Nt*0C;>CSRbNf@aQt6teP7#z&vzsA<b7{+V;`Ux)wa^k?tf zz9Rs1Xl@SSoojr%u-+m^h3xM3f+e-?$k;bNzkaYu<esdL&<IV^U)g!dyOt=#cp=mn z`FhFNvr9xcRWQxzJHKtelaW=_i#MQv^LN|=<Qc%<(2ro(MH(*&2}-);?mPJ6@};W> z6dWOE<y2@9a`|};hen^>{zK&GjROF4#t|7ed9bACQ5WQUE4{ANh(Xlj+A>+3ij7MI z!$R9vH;FPhe1A0#xuWP05}a_VWaI-TwKXjGbDd5#lWTqMX$)!Nxmdcg66k!08pUgY zmSw*PBt!-saDAdToK&C<KUldM>=fJNBh%B;r`hm?4g5iM!wg5kof={h4s8b-PrUFu zryE(0Nwx1XKlDNbs_bIKEhR@YVF;hI-~&q&dPi%-FrI+!;Tq%9699gw)v9^g+PqS2 z@7>22kE)6_h4>^OM$uypflj!&4tr)9jjMcI)}|MJufNtUD*X)6R@t+{9H9OpcmJJD zH&*)Y*<`dwN`d8ot(vU=&gM{IUaFj)w6S)NOA!ND$S4kPtkrs4OKj{<s{!4;Bjb~T zw0X%<mTMt*>X{0%ksqE9qYXWgoAxtQVCW46;O@OpNwL7Dea@FtrUD|N!@J+N{5cV^ zv^CW#<|?8?DntivTf{%nQn`An`ZL&TfsEZgRXo47t*$XG@?~p-fN^)w3-#vsLDOom zp6E%eGRUSmK_59;)H4!I<LF5{^t}JZ_5MNn9`(GccX4yGKNuXmTQV4CAXTCz?%CrQ zMz3IQ@Fqe(7>tAZzNr~%H(PxNxea3^J8X7_*782D^WDw+1YFrCR!^}S8{HQ+NJq(D zFIoj8x9hHnCClOI>tn;jxQLd>-^L_3-T@h@a!L*m&EX;KysE;M`Q^NXz`f3F9Ghpr zEMYHfb!;Z+bds0(S~nwZF3`X1B+D<vNffaM>@zBhSI<+{wqr(D1_|Y;7VGMX;~Nv| z+*Zo96ix-?YhPA!u+o>f0!ZW8xg64CI`sm(VzJc|Y-?ST0q-4jSn@%COa*`HF!NtX zMNCX&pFhc#fm=t7kCKtNACDW{L;|R@*bBz~QFas51;vQi#-;ALmW1cwhTa`f7IG>9 zMZkWSx<isrD^VfE0N~iGlm_c7Hc8;mz}&AmzQkS#EJPT+ZWquETEZ-ON3wjV;GJkW zSncw*(#pF|Xt2??u4NSECIExdpxJaNE7dLQ!)mnM&WBCpEq^1SMkATkhyeCSlfDvH zLYs0%10uU7Vt&jcQ|}#SkPzZix#F8>+cPjwc{77WBWbpvp5u(%P7yRh3Yq$P;WD(a z_RxtyHDtG<duXygQP&QO4$xBm3@HTFXAz=jdE3ff0w0$!kCs;h!P~?v!EF-w=x`Q$ zATO}iiZJFCFK(8Q6N}Jg!>Wv%b@U-#Jx>Rm<+RnN=7Y8h!s%Da3y8zT>kWCPu|p_7 zSo&91a_ys;6~d7>rJjriAX^AS%(6Eb5DR>T8Z_3*@{p@mj^`~i%MVRuQ#f7(3!U<U z@#O+m|I`r>N%mgx#joFBffGIkcP+*WjxPBaihlXg8lq3BMhM*ZQ#0Rbyb|nJ!>4*7 z(ahjjOp}CEZgBA64l`?ccAS{A)Lh0d(f{P<W@D6f<ugY+02{}IDc4_#%fqtP{u1)* zWACim7qdZCPaD<^6GA@x<hjH8Xq!97_xx&39mcvBwu$NTptTDmEV-Owc&jL{J}c=9 z$DaRrMY6_ExPBlyuaw#CxD;_)^RR{a(X09UukO2qKk8!VEuh2`YW9zLl}7Zyj-<gd zc!8s|#W_13Yrw>@J>^b#TXsa|4KWSUfhIT{;c>Jqkm84Lpc-XDL9SnW5mNM|=Dv+K zwW%aSabQnUoWHe9CCN0zX2cBMoXMM16o#7%*8rXM<Z$pRwFU%V`#gD(ITubTsh(E_ zotBr6ijov>Tc7(z|KwiWzT38T!^&fDaUSWWXmhTSRv~)?Eg;!gB2>l~i#3rSS3W}+ zd2XyJDE>eQ;_dwKg>PeY_@lS+$2RcrUwbzE3fi5d0aReDjK70T>v%{+_%vOX=vpNo zzALS^YhYuQ03z7%KBLD5f|snG-Wr*Y#JZ%ey76s~`hbTrxTS#*RHRngl_mn>dsZAI z+<PNzeag0h67?f+g?s`$oxKE{IGBnr<}XpD^J*|Gash>el_$KPlBL>&`uSlY_M-*I zw5T}HYt{mx(=Y*J^Gn}mTs&{vqCdxFFR`?cI?Qs%a^a55DM>}<u5O5Z{1x;bh=iOr z#*g6dt%#K&{9zQXD#mA)x^1whQ`kIoW16KqpfCauu9>RMXR8x|xxN<>m<PlM@y^q| zZUt58AriGUK-xTFY?Kf?NZ=~YHxR{sE=+v@d60CA3^wS@iQ`p=y13&u2~CT<XiS}= zGjj#5TYt)bpoxYnMRz#flOrV{HlwTT%yo!ReH2Lyv3(|5^1S4a=KkZL1oc0sjjE0> zJ3(P&xOlFQ=~lXXDy2Z&>wu|uf4XHZ<;~n@ljk8XV-cQpgzL!f7=P=^*yeiEqVFRo zx&gIixQMyRy~MhNc;xN>{F(pjMP)d{?*6v}XYZf3+tdrpExw0orD}6OEOZ*AJsi9v za^$jyop0Z#{AUD_p>W?E2+-Q2DeoP(jSUBYRFo;e(6R^Y8>v?xsfxhQ#nyh^f2U_k zoK6?i5+K+18NB$!DKFYpXyQz+VlCrVjbgx%KWIiT=3@>6SSS6C#%%H9rr<--+`0#t z5|zV;cu0Qtjos^VquF3clY0>>Jfii>Hahl8h;-}6oU;d$c4eMaDWDDmK+20Yp@R|m z+%Nr;T6W;(rh#K#ujeW7hFN~YpO#*g+T3RZmqAkSOR51s<N~d`qXf5u@TyJ4$MC4- zPir8SupS!s2Ln~0hu*YHFdN6~!=PxL`nW(|rrXs37GdJyu%Q%%_4MH4%%2PGlVZu@ zS6j)p?^(O<S90clhOMonmWBF93Yc~_KS!wNEVOb4QxeXjsKPSW?^HUzeN|8#K|14} zMP2pRC_Pz1SwoP$-p}ijzGNldz0mrA6$yb?!RI%_NXV^4ePy^HQEbq8Q1a#&R&o9P z{T2JA6AP^PrEp|iqWLgCtEkN=q=s|KH^J?q!v}x0Pq-Hcg#HkUt%5AUFlP^Riyn}z zeTV3@{4y;yF~aF6uUBCfEberVm!Ql>e=s`0XU};5t|W3?*_kjDh6C7<&8!4fu%NW) zepWXh$TTw)psC|6pn_5!G~Ux@RfWvzZv<r1_3I+HAO5MOG)huen{0BR>Yr<agISIi zS}lPuJ`c|gYuZuckKozCWw~>!Ab1Jx$7(e>M0!JgfjCS&Kb{>Tr{Nbgjw%qhpNs_e z(x9t<F8W0aU}{z5iE1+a59+|0HObOoSN8Rrq-HT0_XGL(DkI-`yUL-Nl|>V4|53`5 za#qWaRdu;$MLpMD^sf=T5a=x(uf-3L)<DyjxTyjS(ktUSyP*J(cL8RMfH;76GrWch z?eK%x&qll2j}6zM<b2ZZSYNm5J9tr~It@l@J}|za-G3x4sAW>wGR)g57lSW}$%fx@ z*iO{wOh_!bLM7xyB2@=HVwBz5H;0Gm>(glJsfJzmTr8cVMy{{!TMo~udLFIH+asli z@%CE6Mp={Z4VKbBA!TK9emQtm_6h7l;Iyp=nSO7q_D8WnD}A5<`^8-DccF@=0#POF z{_eO-1p6M7?i)#?^!5+PWAGCsk*!#xabIA-$Fq&FyS0~dTs8u9Yj6i&LocUm2fn-g z$sB+x9MM&b0FsMs&tMfr#oyGL8M_s0d1j^dlm7VwRvm%%DI~EK9+W2=$61c%ClSfD zFJA<SI8Zo1FUlJ$Q?=mgZ{m>arAi0XeNrsceV#R(ZxiG-%LgaqbK;BChI~>ovV4dZ zXS5>lNoa#@uc)vHjBSYO3XgsK269YU!}PK1lkwk71SJg5waJOWbiHc}lFnrAvl9=d z{ebEZecJs?=%i{XG%KKGeOFxi%*edtwX$m}q91}HIinSh0nqGYzk!`c1Q?=A9pM6` z=`M`9-b~V8S&}jhMNXAm<n8slhUNEnP1fGoFMdY*8?cd8H|F;W+k_`J-Gu4JtAeTk zJKMgr8$UU|_l-Z&QbX0{Oay@OS7E_40Hs)o%PxP3{*AJI7IDze_SmO<&dEaF!l!@i zaQ{P;zTZ;?GW@bcp0DfG3~ytPoa4|jm5_p)UpD&bRuiC4EkB~NsX*T3uk$`ZJFCOv zZ!$=J_V8Ss{6H0*iRoxjeL^2~kOCCesp!pYQXbEi4^7kfdF!j7;l4KT$RKbETdcoG zsV5`8NNNlfDgX4MxZ}e=aRgqM-ttGSe(yOI%M-$WVv_L(2rE|JV-hyqWjT^+rAWHI zPaWIHVNjh|?|-l09_&Wh&4}~Z75_m!_R!@;W}$0!c!X~_L(Nx~m8sHR?-4ZRcFiZY z(q5^FF-Z3Kz?%IT+Ep>)O_zw*RWfs&87rg6bajp9&v;T4pW8cI$0X%tU_5W4`V^4w zWfvK(k=ji?F7=o-{-yt6p8xLb8{1fWhsl;XP&=G;uIhEW^}W_XT;^RX85wLP$*bb! zo%Gjo4C(MjTwlLwHO(uXfwlm=srG&_mOjm@{0*LmMMx#)hi)=|M2zRx6r(R|(r!MB zIaoP40;DzdE0{z!(aH~-kYniu57(l>5qtI8t6Ds(kVoX8L1l2tlJ9<S%8ZLxN#NOn z(<qC`y|n3#w}v6EJREG;-Ax+J*NrD1n=Tw5i3(pQuxZ?u2+nMM?o9y@z9chZmeJuK za9sV}n$){ZDI-6tAq<82!6;rL+82fVUMQ8NCqb<5xFD_1`W6Q5h;AM!UM(l=#>8t# zYdq_Wc-|{H8ph>;Sw&VQ7vu86k^eiuqhjyTOmq<lJ2ErQ;wbxJOye<m!aL-i?L^=@ z%$9{r)TI#A22@(#`6u~V$`BE8e(uk<zK;)_EoxEO29fcZ>{(p*B0qjFjvV)Ml0$0i zAFOgnF8K0bWiDQ-M|c*u(4PoexM^UR(hy0<3R2&`?%@YnZ006Zr{-M42L`&$++AYA z_3hd&IQT*I)-61f-+U`~VJfLGAAy<p77=r+WpIEuk)5=65ns~wv6{7DKUNmr`i6T8 zG$b>5SnjRlbwTiZTd+`Linn|a2?^07F}o$^g>lO5=HGT7{P$82I+-4Xc@~C~dM;F> zCx;lXIA0N6t)@Jq1~<H$yUeVvxB+o6<5mT&{)l|16(QebnJ)vEsl8&tH^E~`OYTAJ z@IDLg0sgC%OJ7-qh7gy>xO4uW3r|#_UbKR#C%Ne+Kg;<KniqNL0CzI{qUiu_xW$F4 zt9(Miv>M3kK0*=?u`GOtA*@dt!O$-KM5zpzbG}=(N;JChds-V}pvirCphA!=jcobc z5qb6ps~R&B&OUiQ>oMSvfcYR<#3nOc!M?Y0&}AJWjp%C!;4EwA5!{poNx+%Fv8GT( z(F<o?E`4lfX`h{~oxuf}aHv786X@#<l3)3}#o~iSTjlRlO133@SVwdA@J{Dg0BzEW zimi1^S((wh_Vf^8hggjK_O$YrulX%Sn1>Z-z^Cgga6GEAxS0MK87=#5Te9~Pk}H*n zO`VSeOI1BB<V*vw#jV|7#Qb#+@%y|$e)t8hPt{3YTnXu`XY5|33S@#9QC;bznjrrM z)JlZt27c~10N$~+a7L;()j!?zsP2$l&<kbs8r~QXB<U>RieJy-aaJdTn@w5+GP5>@ zD^V-;c@QT?KpNrKPP0tc8AACl;Fyx~fhiLpO3OF?x-y5LRg=Y__x{dY_Kil%WQIVA zB+*Hy(WR`OXmnn8rd%yo?d-^$cCFjz$njxS;EjM>m{T=vqEJIBtp(OxCvC`c`}&U+ z@=tLeh3%s>RIHUMC_>W*7g1o$*WxlgOXQ;xTHG0W5_%1sdIu)I_$s}Q&5SncytVlN zujs_)upJx_#0tP~F6!=xKMUjSr()^>H{V!8WO1@r{PNn$=9d+^Cr~OFH_4jJ?#?)- z0HFAToXC`O(P)aB4Tz!v&v^zj+{ooMFue;+@uFj6a}qARoiJ`p#A^8F^nfd_WlgU| zPgQ5+cY5I{!C+!B;qJZkGa`eofKZCwV#|tB;I152?id+Pp1|tVSo#bCviMuUDWe0y z@?+~Y?#Bwh<<ffw=e{mM?m8vVo`?Wx+_W{N9PPTF=Y4;wf{sro8xN5TW9xNRcJ{VZ zOWe9Ute2{a*XAv`IO2t<ry^W~)Bm*6Kjlp_=I8EtbZp;K!|&Y!uj5<SsQCQzofyQ; z(T+IXfJe;=+;G@zrSNKQ2RxsEs%^3^o^;voL>TTt#HVv0vAO(epOGQH>sylUbgD-| z5kbEwKE|z`zFs6X72+r0gShi$A^>PmPYIWLdII4E3WBH!zh)H#_^-G_*7XfRRq5p$ zv9Sh`tcDVa^>~Fsn?xHCvwU&ww|X(R9Fl}Jrm#yQG>ZKQR6VNO_l<P~kMGY;LDQ;U z$4J$cm}$dotyxUUDsxVQ2v?q9=<X@+P_yg)62cC$FyYyCPnJT!5%C7Q(uQwc^<uxL zbqBuIJX4}QOi+N8e9oT7xehfoYkl0%y_t~4=1Jw{Zp@Z1@jg#Q`=~%O(`<~=^=B!F zso)Yazge@ABD-m@SM`oN-%pL;z#_t}k_Th{5{i<{_@-p03Ab;vNP4>?Nu|Z^v^H}v z(*}HfpCO2KT0<3$GB*)C6;)*}>UnJybGT-K$8^$zg#}E=b;ax@WB@TGQ0sfIeVS4~ zwB5y<KcaqX@AQD_ZrdX!d=(Q$NYLG7^hn<)eur@Ick!a)I+6hse-v&r6SD(g?zO@| zjr2msdQ}c{5^tUrwi#Azz@R-f8&)x4qzB*Sn#&Wy7T`34!=2ZZZQ)<1Cu3jX&&Z2M zyec`uO8<mYiihDL?=z3fwmYM3G8Tv1$9ylUb<bmqno>1N;owFA$pEq8jBkya5pHB) zK{#GVr_iDNnV@u2c)hHoQQ{atv!HD9yvmpF<Gub%Y#UVmEEtJzF1cc98dxh;FcVc> zU$xE_gjNYLc26os(Hm4(L5dArmC{s=RGz(v^iFrdPFp;(j4GnGoYV>0Qt61n9s6Z~ z+o@ZxE@WX*C+q9^mr$^{TZ}0gYh&1SSu($Ud$jhsn&MTfumcjwR*%(gAAEj&*}}zi zZ&|bTM|z=UQK7#{Z{Q4v>nJ!(#@W<E$kE70Rya`hu1VMCL!hr})Hf{su`9!IZsM+- zzL~1gn4+hgriG|v>7_@NQdfsih&-a!Z%Mh4Qy=QG3Vb2T?LQZ9u*s~2WLL>#+j29E zY3D)bjwh;SBQUFkS7_vHo|zUtO%c2?47|!>>z=);SyO)}8JbYwJE8m<KFZnf<A!%P z>px(va@d@N5`8&&o4o29LmK?|<49(nnKC{}5j-|bND#11EopI@L+90|h~WA4=vuRd zsf4KFQ(Pnq=dU$GvH{I5b=N78Yiu#kzBP?lc7y;yC0`ge^;PdINxvqTSFNkETwRx* zdSy@Jnuq5huCK$5hNhPBFmb8q5Wv8gUrC_-*WFWEdc2JdBGmB<+M5${4|$p3`$$&F z)=m0OFLx`UaDA^+bVI;nm`lwP?3t3UxW}z9e!$|Ul`Z|?@MQ)hZDnqrzZJCNW++o) zn5SDWe+N}NqE=pw_|j{hN$R6!veu@l;$MCaQ<iD+%<&@n>W`(VS@x&-iRX(0&lhKU zSPPV<0O&YZMFZ;51;o8-(m1O<So`>yg%Y4N@UpB*3!Sb~7PSc&bgI8K6CG`2*3lef za8at(Hg2$VV(8ECO<KFDnna<0DbYVw?&aram{GzA`JiSMYCtWFv+Q<$l731J_vS~M zW6Jt?+GN@oxC!ESd=Z{3L6L~Ik4+a9>F!HrR0{{Y{fHvph1H0bx-6_n$}}?Civl9S z7K~ntGEXwV!K6toIJ^c;2ssPoD|W9qm@^6A6EOI^W-4zsXKCTjqLy9FZuSC}+I#Hs zRjR_8lJN=<=w+3Hyp$<rBsUr2qcRZhs<$01wL%Q)2wfQ})S4mI1;3@gIa-qq<tF6c z$UOJ_*N^I33gXwe)`3bc8)Jt|h#nu#oslV%aXq7a?-^1K(9id}I@WMmM&1>CZ2TbL z?&T2;CxdsI0)E0feI^9;lhzmK6*650EY9CUWr?GX$%u)X3_#2^EiBYrAADo~vEN;# z=2mv&`{LI16_%-9FI)!Q3X`q&3}?^eC<lR;9h*o+d^P1-SWla$)Ajv;(~{EW!^DWJ zO^6&xk_d`qvi%J9vOqx2`^*|!6?9Cr9odq%a!@m?IZNevSe`T96Wk~#9$c1{@*EN> zJ_4Om-vFBzf~TDHfvDVo=kXWRDc(Id<j!2W{X(wRk1C05c%G|vqWCz;puI%Z^SGL9 zO{vrCexdOvsfR4Eai-VuVSX1cdRqDT;V+H;6eBl0232VwRC4DUSTA5BV+7Q*L7xaO zZLt5{fGnf6bj&vK{jyxD&(a?d|8ljUjE!mfh08?*mrhe;$+_P2Rxh{X#nV_#nP!}X zaMX0h_o8%rd7MwGhQwW~*2^`{Xa)c7n(o$W^8R&Rx@Hl(0OuxNaJ{k#7AICGt2Jh) z3?6GA#Vg+v>m!?&zoH*;(A^gX8|XE+HQ*76kMEj%@W)%AxdZ7$xkd&D;~0=2qx<^G zapjrR+h^$=h*lq;vrE_-=2P(yh(UhGd&0{384chlnsau#iC&m75D)Xat8AIqM+W|R z`rzrs$R3LtQ3Nbmo9$;5r8#YXT(#U#73{Id8Kn$<xID~k3k=$K@U*ZZ70i3<l12-t z$v!`hHdaijAP8zO_P~Q)J<;Wo6ebDULJw08P$k9QzI`HF6X=;^Q_&SJmKIP2S!TRF zOWFn&`^lhtMHq!bcW&=DQDW%f!f^hd(c!tBpuqLB&2cz&n5N8lQ+u{3qi7g%)#cFW z=l#coM2?F}O0{5X@PXluoeqKPj?I49YbKO*KMGsTfQ}(MreFGdMu&^%>j-54U_kY; z^%k`f;NzF+-NkrWi5{(>=iV0`emipQz(WV$4O){$;E>j3C`e9Y@l(#37(CItJiiC` zLg`Upkl>o+D(Xp1!l!MZ$pP7iui-MX1s0X&O8iNMI|m-#7O4N9?f+)|cuV`eI`nFV zTx&dVBU3jEeWk4;PRyBqzOZ~IoUgWa3Uo`4veQv}(IyJvI7>kKiZk?Hz9m>X*J5Qq zA;EXU@4#<TKO+V7T^&p7@#abd%>^{p#%U^UEK#VVU1|32xutV6pBRevw@=?c>#S6n z+Ms---dIpD^sQlI3pZkFGtL=XENU83L^|ny36mjP{r=Y?ZmlJ7F!i7kxV}jn4<*{! zbFBid$64vwU{2PTXHz{5A%onhEaT?>AHx`1$pyanuMy07%4Hg^I-Pow<dymYUm%v% z$QZv=ZhuTy2+OWSeeR|XEE;0m3F{F&Q0Y5P$<XfaLQn$aMj1n?zXAHgkuezi<snu` z=-}@{W&*Pv+RPPz>@IMd>`^i~Hn~gb#jj|$|2F3@iGjVsHD+*SiLN*0q6r&ASp4-% zf2;O=T5&FI@$awbz3yQtH#vj7aQ4mL8leaX@FpCpjz?KKJEUSpPN;?dx5i00-OMIz z9B|A|JH%P>X2E}<_4TY@SK`VQUc9%@P=;Qr{WkyGe<ovV*QSvChp`1meayt*r@Q`# zW}TpRS1{y>@7T<*9zOpygxYR#WBu5G_ZH~!rrG_9--Uz@g97_BBvr0~&nx?2r;=qq zC3yy97-cB=VY%9YxpW1RQ+;7Iu74=qPYHB)hpp=K)1bwE{7zsi3O|4#NvsS9!!(go zU%uBy#`5bQL@V=1qUlIyTHPo;WwAxOI-xEBQ&k8N=SR$GR^42VCof#RjHXhLpKDtR z;Ly5*wqBfz><NlSmGM4vws*bW3-TN{_+gwO_{i2Csaw@A&V_C1b-wvg_brQ^Z}@9} z2wxO=R2Je_nPjNbu=sEsU>@)_u9!|nY$1z{-1w?pok5g<bJYzCh|##6CC8Eb5@cHm zAU6I15>mxG*<ZYS&M-^7Fx;N@47|M;UB%U5CWZ`bOGsVbOq4Gi?<y;IkPMj}i&jZl zvDD)nAy|8&KmBMcT#dcInge{CuH*!BfoV`d-6V&vd$Y!ty!v`hjv?8oa%Xh2Lc7iT zMVQ!c2OwX^9#kfSUXCYOt8f-uro_7?hBn@M=0`ZEMI=ZQ*zWq=4v&pn8ky|aFsA;r zJl&i^jBa^9q%Z;SJ^JuBtG)A`V4gAJxw2Ih7Ngh+(aF1~r~VX=N-!eT|H9G`6#lIT z$<WPk2RZmBbDUZ{))r9Qc1}@kcq^f`tM^8q_NURKL8xbo{X-?>a>bg>{!VlCv@_R5 zxQ!lVRu%(M;G%{2+d@M7MnbFsJyJmDoV({$Pj^k2D`x&F^zZfymR0#=R`jBg@cywG z@!==s&)$FiTeEMJYd={ot*8X>J>uH#P`eDhIUM)<-@3z)v7#OuptH7#3iKK<Iz+<O z@Xx<BQjsK=>Vn)C2T~wSel&z6teX??pSvnCIlV0OWn)G4<1%8n3v0pY;Lsg<jmY2Q z&ch`Sn@YQso2aS25L3Re(QJy<bqz6l@wZl7Clkk316;2c;hjdU+2cvr*xHan0VeQY zO<11}aK@{FbgNxZU5}QN#OZZ%p#F;A|D_W;SYtx7xY1vh>T=rUvO$fLeWSn{>id2; z|8bHac>~%E&n)a#WDvBGs`TrqESSCjR(aW#LM)bH#VM5WL)(Al+WU3~^81H@st=d4 z2_Hh-6+_xk?stpo<r_-K)8$Ed>~61%pQZ;|f&*llB<-wMU?pA?3tkVvYqNW{tZ+&l zQIuKcUL5sjBV@igQN8>Bu=So%O=WHWFyrXhu^>1KSdb!Jq)8u@9*Ur}1i}bXLqH(3 zP#hfv0Rd?N0wL0c5D-EVDS=U%w1g0n(2*KKK!hYf5WN4H`+1(V-Vg8jcFw-`S!eCD z_u2bg`&XKoWwsd>q827#QSf9=`YTFEM%qLST{X>e2Cu(J)ZxWE)xt=|)SsC(MC@lf zc7MkOT}REvMQP6`#Eq_x4A>6g8t4Rtqa_KO%^kX+B_7W$ddkJZ*siTmf*Y|w?uBdJ zzzppEJfJxdLW;gw7>r^Pl3A+q!C@2L;`QQ2gR$S(1&^z#ofuj_MS;E%^L;YLA)wbg z1l>ECty-1JO~`rw$Zo(~&%+~d65z5(tye{c6d36d7!r%?2I-^WPz$XeevUI~Z8}wY z?q&7N<>{)#6-sBr!Cj|Jw+jV1FKz(!)G3C|5nmzYC$%;8PlWNCx4=a4_}%r%Z0ne( z5MH$XLk)Z&FQ322NiD6*k8=zd`Vtr-)HP1gQ5WU~C9K&B=F-9LIlOs<e*@snwYof2 zN<WKt*dg_MNY#-GN6v;__`~|dS$R1pM&k9{mJ$owM@P)=tO(!sD1#INmR0ie=NN#T zYt`gYzDCLeVF9_h|NPq*M1J)KMtHa#30gm8H#1r-7ASvt2&y=^#mP(?{%^U+<OIsZ z?k>pSz8Dd!WI6^Y4POU8L+(be{Po}Rqj!Z?5@uI59va+tn`GdR&j%^ULy{<Qr?md~ zZ~3nwfq@(=d1XKU`3Nm+w2|(qa$mn7_y0AlJ;|)yPU=_cmyrKmDM+ROjI%=sYd!dH zO`-Fc$YJ4DAKNrP$T}_g+VKY>RtnYtC+?}*fxr=LmTZ<YNJM0OrL5kXj}tn)^c_0= z{IImL&Z~S}V5UabSbi^gQKCCPNW!-EZA8|%T23MXu0>$=v)Dd9M_up5I-HBqnt$>; zG9p(*xE1*F?(Ib_%bT))Jy%xLev$O)tPs+B3h?JU+2hCE&RRW}y(edOK?Uih)nads zsxHviSCtMl^Dzq?O9tJ$n<-}rqG=a|I;*R_<$Shk?mMo9X~G0VS#7^ec1`kgkxA2@ zz-!8Uw{=AL_<UgNE=*3UVS?S2V4LS=)tyzDVv?g=xNNEFg8lF(8Lt61&C0}-%v+Bu zY`jRmO8#%N=r}~dcKQ1ixW-^1j1(O%b)aI}vZOMSU>n9A$9LRa3A<n25D<5;!09^> z7iv3VP>FO+s+Zg=;M>z_Vc3fGC?7N{FkdK0LB|F8FX}u<Z*m(U;3nFe^atYJkpniN zSHf~F9AE2H*GojDo#qsFM_>yBSL_~LW-EjF6#!dBpNMF<|B%nYCHbg|Zhu_<3e@M% zx4|H%k^1Df@T(wDe(O!nh4ot@Db}a7vk1k=J2=2NO&@is-3uiYt2*ZUYY5tAeGAUO zG4C~mC{B}NjqrWT1G%dyGnAanAhhIYwgD%MKbhQ`WN$_vc)l*!sf=-7opLkW85k** zHU<7sI1a6FUnU>OZ7{(xHr&r^{hoe3?(o}f_U>gN*>&BejMxZ|OW`v_@fJ{;pZE=3 zv`s7B;qv+6*QDafbEkUX*!t1?FR_}ff+nMSQLx<_MQkkC0J61SA@l`VGZF;@Fba(Q zocSBdc{V>@UB6$ReGxYamb+cdiVIqxcCrCrbnY|ymS^v5_S}!$MwDo9U15Ut7(b$T zqj2z{>r-ZSyH;s+&SIVNGig6clrnhK_oGu`hry6XMA_xNrTaF-h=rknh8)JPw^eYL z1#9CNf&N;6%}gC2e~J3AyJzxa{f9{(q2_z~A|of&R}7LUAKMPW1#LI)u<9CY8@HG7 zeKQA|%;mMw&-?Y5#esC`%4f><am|tkVB1((?b<jOW%n_lS>Vj?#TC*QTwbIFKXkUK ziM$hUr8xrd24IFLt)-Mj9)3#?OR~nTI2JW+@oHMWrn%Lte!*P!=p3n_E&1bmJRX98 z*TeHLx<UGPif(p1?weEt1wM{XNGLMmcC%UktSpwq5w+$bq9~}Vwv$y-!-^x2^q1ag zP~`xp<khy>dmYcvRe=vc*_F6^Kc$Tn6wK=+7d9?|xZa$X+smmzo)S1zNyfdQkMsDe zc2xlsqek+Cx}ZI=7!<V8^@Czm8GWwGVSpBkuKB2h=;{;pjopfWL%GK(x8AA1e# z%5A-YWiH0+Kr5F%RJI>f%eU>5BJrKm5Tn4242wj9-X2;kwOwk*Md~RDeGi0I2znoo zl_e@6cRu?JmNEVzuExd+WN&*M1BhsAY70MwZ2Xcb{{C2TPZ-Qnwk#QIt0{r2v`@W- z132NIBtOYdGu6ra(m<rVOKB5vID_?4zz(Nf*kV3km>t@K$F{cv40ozP5mF@g;wgmY zi1MVdV2>`i^h(u_Nr4zyxS&<gVlwX6A6ip9F2AN0rvD5;-D&2LG|RH^s?K@rW_WXa zvvPMC{v8rdC_+@e=`Fi5IyzZg1S&=L=gDh+t;=^!I(^yt&g&y1?@V7jGJWw9{o7x2 ze_apz-f%hM5iq&hpUpNbs+k~?&ghx;dI!~Tc>`9-`kJl*^>=fd0}AzB?$xf#=np=^ zm%H1o`^h{AKwGsNNx2{^i|nM0GKk#eF`{${w(%oLaZbwKn`rEEw1Q~KH6U*{!^DfN zG(KC;9Iva@#suF}rEerTR66UjI!B5jOM9e@vSs#;;LYuQq02*}(TUUtYkPWn;4=@M zJdINM2W>`2)Vo>u%dXf(^W-YG1x#=ae?_M=M5r(}&}TSnKiu;1hiILmX8Rd5d!nKS zNIbWqi9Vg=e8wCcdT~!NH@<oa`QbaG0vg#UNCVo-5X&%;ytO8Za$K8o29AO6BoLxw z)+yW&)tdQz=DUgyoVX#yCAcwW8GtwJY(-~vCitqx8nn|{>`FdnMboCW*9N=58pQKc zSshyQnv>Gn>md1}PKd7N$bmw?P8Hp?%R|pEz*9dhy2W;o7r_q0WovSxC^9^z{$=|i z0cVvslvj1s7GnBI<0<10lvEQ5)z%vHGo4I2y?|b!ys0ZX;zP&3&ey6pDO#_h3YkEa z#rgFLVw7?APH!LZPgW&MZQQ8nz({^xnN?q-{Jg?&8JYrL-t}H0{vu}NYhYHL79Fld zYo)1`*3H+eFpBUx@qUG={Cy+37OQh@2@emT;{p89;>iA-j)#?oi47g7eT?<Q001Yo z&&V;#g#Z_-0n;qzGRm9L&>{3SN?zJ)@0bs<AK&~Ly>n~U#l)T9MG9I-D=V)JjVjTh zV%usqdoeiBcvE=48xk8#?ds#(dHkq514v=<;#<3lb*anTtKq4`cbX_|^tHv+^+aF# zsv^MeI@QK-n=2hQ=k@O2sao0@-*Ho}XYS8`PfmuzoF2TpCVJryq3$qE5??%j0|;3R z59~UpY8ra;T3Od&<A)^+*+4#s8iaV9dHWu4ARvCGh`k9Nz5ljpRLSO8x?C2l!11ql zLQdS~1h(zIcBo24KHNai%eD!x(wv`|oot|l5xCMRDpyYdj3GpimYFpssn*kn6)#|g z@my+PRp!R8Rs>Ud!5&4Aje#*U(*Kgf_LuQ6%bW|>l~nJw1p4_|yXImm@&o0BKjMM5 zdmf~s(OW_uW@RpocPBJ@@6TRf*2|a+T_e-X)IthDpWF>)D*T<#huBwj?YHV-IbKvd zM23L|bTwo(3)6nZA$Qdd<cQ?;Rgg|7(3o2{T^}Z>E-Ed9E(t#eHPU|7b3uFHD21gT zf;LpO1kAdUUXLjzT@;<lOE@>HY~V3rYgk$wkqsZ7D{-7!w^=Tf4);X9hy6sS4#N}d zZ!8^%hA4zNd)!_e(qxA6{ornnb&<M_Lto2%w?5%zoa<GsFFxe`E&7TSw2{71!a7hS z{<f3HiH7pGegG>kVi9TO<yPnaI)pOB1q6-PZl#@L+&zy-0uyuxgxmb>xs#OXt%H!W z?K2($Rf)M<Bl>-Amd71r^aFeuymhDi^v29<qla8Mj2;1W?@H82>-P`=xc;?gh-%Yl zr}emhf4{S%thnUi%*y!2CqVsi9B7P#CYVau3PF=V9)3*=4PWx}L10T__&iG%_dvdU z^5N;}N~tO{Wx3{|&pVGCdz8C4IkXEv|9Ewt33@7V`{LgKdk^govuCnt0{v;;=7e^w zsm19l;E!G!gmOnW)pw?ZT4r)3E_)EdxoQ!%2?FTfS-_{=9`2u!wEK^U8l~p<HrUAM z$czEZ(8%pF4Y@+rd)cJ&dC-`Spd+Za<?|VgHg)t!b)4?@=QcZ!N}u4a-r}akyE0bE z%8@gz`kQ(Y*o8#d=`XE;w+R&Trt}r~1h$FB%NyOl>a)CumW8q_r;Mu5oQ188JoxPL zYB%jPIU(QAvo78wePDf)t6v?99%*I4uilQ>=$$C;9slR2?S9e_UoU8xU<43(l5cKV zc&jl**({I^7}GNdWbA3j{1o``zyF8`D6ln-EqGFJ&0#pJaRr|<<@jRQ#**gjO;bQO zSx6B~bc2V2S4d8V{}I7u<RP0vC!DtHV&(@HIg{*ys=k=L2liLufXb#rjtVO$w<2zB zlzh2j0{_mNeJ1*T`JCbM6dl$N2d%fU2ZgU4%L_!`^j_6F8_+ZMCSK{^G5o*BFYxRm zrNF_9Nu!N0h5RS@<(nx;C&b++)Gn%8z9n+xNf+Pk<tw+m&!dO$UrYD7e1g4zm;TVI zT@M;XemvHd?JHM1mfB-$HWS-27~FPVtkVu+P9tVu3#tlby-zPUGBihCaq(_t(I_{I zN>eAm7svN+13Zi>U6%OC`qy~X7n|1i!lrgT1U8r8-B!Mgq3racLZS3L3%a&xr)kva z+s2=3=IN+j7)6dDV@+1Cn)F9LG_Wh)NWb=Va?lt+yn5JmI=3+NtSRT-9j8=3=LrXo zFKPOn7}d5puopRC9jYC;6b)NUkC{B1oK}7sNX_(<v3l(lB#$b4CMVg|9XJE?cv(Xc z^TJ-X_oIZUtk$0tl4X8dS_rXxaRH)k=8978dKGPhD6PI%+v57)R?|Pp^fo<P;+A`% zG(ug})InXg@ztZbOw?Z@zj8#4`&xJLjRRNnhW#Er(BViO+%BWowz1MH_u_N6eoWd+ z?ojRO(Rbk3>;XMJdjngTKChG0Y2EBQgWz(u4|Xr1d<7d8CCn=1JjKMsp^%wMd=*<b z#UX`U>^BMwhg(=^+%*!v!MOG2KO#lEYutD;sI@1`UhAMGYT8|Be4IxwH?Gnp=ey8~ zkE$CH7cwXqo(G{Ij6U+pr!u!R{I>i)tE7ynn(@|8n9v?4XwQ${aKerUX1gk-C`7pn zttTJPqNxLp*R?d!LAw>vLjBx?IuByW&``9;xTdyV-Tu0acU_BX#E!esen-_OG`$ZZ z$z&oc!a$48!}8rL@9|=21Ri_R|8+{X(So^a^9;cGa{rgwFE6}IjfVg}WpT9=#nA3m zAz>u{#HPM3=JlVvcb{cU4WHW3N?ZOAw(z0#l5Tx+#hk+hDH&H&OUuN{d$o#Pe~Cm$ zOGWa@?Qn9^0>pBl02^T)0I_=E)gBqYGL}E@n{WC2R(FBKJy0#|$=;<R&)4auHm|et zuqPM*c&EoDfB{fedoOel%L!)(j$%<G!ifoZ$qoKX`TNmX{e}`y%eXU{27GZ9@~LPB zh~lW0+3}f^DuY;5Zb^AJNI!65TK<y6%K}jbsDSGv4V$p=SQnuGjA>VY0l#YTWkI;a z=QpRdjcZp8|4hH4Ntu2&zEw9X4cgi?*bbdlW%qXaQZLxLe$cyW9-lO5g^z#sY4Y;{ z>f<+iu(FwF_RiijjG%|Nm=9exF`{{%{8SOa$Hj(y`<XhV+)gl@nO+tosDJZj#dUb1 z?SRJe1AXON%h3dp(;(BoWxrTyNXh+<eA?_^;YJji31$C_Qu6;djr(gb_1yJG4Y!1b zsXFpSYQUR};EC(WsKbK~V8UGPFY9RN;zVZyV!*(b-z0d#Ug}@wfB$K*PWo*>?iq36 ztMiX|_cpq|WSz%LT4TM=v%!N70MA4-+)({SCTDJ405^`A-!UM!U%mS#PHDP`=zHMQ z)LdUMs#o&oS}V61TlR@bqz(*qb&4uThtY<&xvoMT%UhEp&H74AOd>CICfzPI*bdjb zv3MXV<sL5@TL#9IE#Clr;jBZra1T!l3XMIts^{w~&|D2ehK0AAVD0>>_=0fwE!xWb zSf}5}I9h=d{<AKk?b$mt<NH_s{?9rA&&`u%@?!fRVP6t4AbBm7oYDLI-xFzx=5|}B zhcY(`u6@nsJT|&Q&$GsZ0R~oqAL3FG4@TS$H$l2fXs9A1OC?!=gUV}Lcn=oI7O!2$ zrBKDMH{tGEy6PZWMlMgB7}Pxb`O)|r)=NUNwt+haoJ@Q3V?phsKTw-j{Ne*jZ*2%} z?G5Ic&aL)%%4ZiyRC&BN&sl&^9cce_{)PvEJ_!{A(;0O+Sy{feGGuIB%a7WvNT*KL znW*g7ES_>GuNO7nGsqe-T*}FRH!&Dd$XgPUt=+QzY*@_Jw6>Mm@qknAr=sjUjo;3d zOSNhmxL`{vUT2lkj^WQ4WksYTC2TC)ZS=-1G_XR?M}41)*>2y7h25WsyoyhK`;^wk z;sTG{m^=5?;C|NzYCARDd0i25f1g*)DsnAqu1l-J?bW0I*=ixQCk<r`t@Ujg*(Ht6 zeG+VdoTUTvLjx*5{$|=I>Ls7^`6@7SQ{P)7*hTfd&5oY^xr=iFbrsNW;%WXMEWR2- zce#bH8k!-V2D#uCCo2nGC-opkzm18x7itMANkvOqi^@cygjYu)(|wFs=4V`+Dqa{t zSdzPLX6!LbSumP%_L|H^0cRWWS`H<ZFm?Cw)Q=jF1joYrAeeTsOkp^lFb!RUrF~um z27-cLlM|@i4oo+in!fHwjoBF_-R#<lm%^2a`trAScY1jL{7RTXk#k<plA`y3xqhXL zB63u<8+|0tS0)(?y60j}=L~vRi6#Ce%$KrJdOYW(LFiC4azbhH88G}3u*j|_2d8*F z7i6X3p#RW)Z*oWwAtG9{S993vmd#r{!~!x>83vO4EwOeVUu!QGb*1&r%(7T4^D967 zjD_EEL61OHyJC8I`=>5``6nx}-zMwWFxwR1Pi@D~<F}fqvHtAswkUFy4j$J|RJWaq zL`$RKOWjIryRuZmlKMi2(^kt&+WULNBP!01%lkBeIIo_GmWz3FZ4&7ttsU73QH(9D z;GnhrSxLAmtbv)!UYcEE3+;14<O%iKd;bwhKNl<ky?l~Uv1+@Jf2ZXVrS{Uw{)QLo zoI2(Wb@l|2(zLKK)>)<*$M+rSuWJrXm`y@g8M`D;36kUk@<$skh5<|;iqBs(#_Vo@ zfGQ))z}`BKDij-tElV!Oh!<4H76eH3MDEWVS=|*jAsqr<u$<o{&~toSFCsHfp0{z6 zZBl8Ls><v6Djb|5zf3`;BXj0I(C$5kdYrU{om12Zw$FD9kNMc9B_eVrPC$9b{;0LA zuT0+IvKgmB7~#;*+dg1s@f)=wUqV#WGD}|Bwn>cU9V}T|)6_h^sdyw;h$2(vZDfxp zfx;$wBE|{HoZu)M2CgDe$is~gs1FM=Y{oX$W-huE!l!;_F7N~$aiLdwvwh`@3rZ#A zyF*UD@5^Z5_M!BiJOsGI1#8gfz03jFf{QyTHPut=TbT0`SePr8$Vee%Arb?ttKo90 zqRoopB|HSs2+jIIdN?xIL9^4-@Jr~v<PH)r&xDvz-Dhfv+LX$bPKxGCJ5V1%#|L+6 z8pRYBJ;4Xx4?nqFkG3rU#lKqF?>!E#llRpuEOc(V3-DP-+it`d#edlJyg1qHM#+1& z@-%X~4Sbh7vqsel@jwNXP!if@mM|QWlzxOy=O-f@eXO3=JgB(o13NOO0zvw1Y6@M* zvFfJF$?KEl@UWgVHjQR$j5diH+f<|h3!sJcp$wf>^}c`y{e>!>uksx)y;&gvp?Tfx zuwwiA_(J)ZG<6zxGBRM0=Te`aFhx2Vf@&z5nnV`w*0N+Jt{MtFEiQmMhBjs*c8ApV z*T3emm*KbSE1%upqWA#CH13{Vid%r{??dJ@XM1)+HSM5E?DZlfJoub#VDfk4mOU5E z^oenzOA~84fnKjs3|40}veC}ukuVKr+CX5`o9Xa-)*#{BT|4<2i3>1pChGoj5%2%E zX!=pN@pdB%<DZWSV<7Hvw-o180hD(}O=3N-82nRxdI%jf92TKinWi;Sagd=8|MkwY zA<JkF<7cNjY<s7FgJLEiDN92ua+X|d>{7<m7ldmoX1!A`bZ|4?aH?*1ge0k8_1IT6 zBhJUv3f2X2y$4qLya5J+J5IYtruMUeWH2!E9Al)5p3RP4cao4_#m^7g==6Y`lFu*7 zkV(N^_VnU<Y&V#g@r9F)LnGdH^_`!XIG&90_dQ&zj&X|oY_R<L(V;Ik1k3=*jRT)@ zVn@dnS33JIVWW-DG4J`iST5H~ioL@+Aq$#VWB7*oYl%exqv6{s%sl2vDs*s9>uX-Q zD>N*84z4#A;JEwa@o+W&G=@9lVK~S-fyV-Mu+ga0Nr{FFTBQf}CV{pwsHe>mvjb)3 zaxgN%Ah419^NkFW?N_I>zxP3iIodx!+pCd}Kqi`0J)4Y8I9kN2fY~`JKW<;rGpd`9 zqUcS-`zF&fTnZBO(3gzGBL>rIm~|cKS%t#V1+CpZm4Mu#r$I861vKjBnVA^ztsR}F ztuk8w(nllf%(qr6bInV8@zOV3QfuTI?I4)+`ikx_Zf2TJW?o`b_x;L7l@%R@*wMWc zPQk1T^<W5^Rnac@aQ)I4w1h&ZF@rObO7+1?vzj&^XMUbIFg!RtHs(=KDybb;ae`vT zJ_wF23{PyUw-^{_rb|WsZA}{}oz>x*7w7dd?WJKKCY7yy1MKb(b7?kkB%2IO>v`O8 z*2X&P(&VCPt+?zJ!%T_FYfYL#vG9lpH+E_wqHP_nCdt3lE7#@&mzr`O{6R%JpOlf* z00enx$aW9u)v{k|RHSh7Z2d@=DkB=$GA$QjB+XZ*ZSldC_&vkP)=<89)wv{SaY8C` zX`p8~Ih}%k0vzq4!dG2CyoyHLo7b*}{$6w`oiNH;cb^D&gaGcYWCpQcZ&;7SX@*Gj zF_5y!2x5eqGxs6rE$T|@!gh=auFsIEUWUA_?4VktgYh~pcFuX|uzrj2d6iu}a^{=C z>Kt<_=4Vocw+;A>4<W8zOR$5b*zuq+m<LYO46-CqpljnzQ$ke0%wJ>4?+)YK<S`dr zTOBi1?j3voT=c%PY3Y~4RGpq<`7qW~8<j4c+YJDoQGO%U)co2i`sh1kd8bHVzl@{Y za{sNSKH3>1nKS`$mOn?;t~mRPtW+{Y{jQ?r=f}Tw_2}3ZOl2I3RDsdjhunM@$JJ9e z5R8xROyp($+)`7FhvrDo&LHZV{}-II>)UHDP#66uV(LxCyez>u^R#qK%cQ-<<xrBb zg>7+j&9G2#SP-vf&aW=s^lKB(=R}(Ik9*&%R7rKIT)pF3`??5!E?9olDY>uU#dVr! zp^gtns3xE7ETd8V2f#NFxB8edP=sVCrE9?jdZNaR*Y<%EuZeDdZoYi3L^}^`0s18& z#(AyjoP@YbMQ@@Uf2GP8=#!zCN2C?OPlL{tF}(hvb*~Hh-glJ)>vjbc^`K<Vdg2?v zobM(pw|$92@hfp#T`!tk=zcs($N)N;1@XcK^3tIGZ;ueQ4tly_qmv{b=KWrw8DPlW zhebHm6Rw)2wCgz4`<R5XAib1;;UW0PbQkO4N|Y+(6vZfjTHdG8t4{CMcw$P!@)h)Z z^@>-cF3%nAzVjhjE~~>QsQC-=k3?{j;<LL>+h~p2S{pG5Dp2Ls$Jghc7k}@1S0bdj z(F1Z_i<&0zfo6CpkZPpDR8k!s(o-b7amh`C1N<l>+!CiRm18{WwPQCe4Im5km2r#U z!S0weLA}w%jmn}a&kAHX!3yL*?yT7N5Q>1wOjX98uKqV#8*0aN4=wGxW#d2S<vhJc zLwP0yP{xJ1ZdjFp6$a#n<O<evJtY6d!MxSGlG$N&tf(71Y4Dq4Y*RRU%H>eMIJ1#? z<-U<$O5=?jN@<%LUiOzG$3@Q4M;a$unB?EDgXK%3)KQi=uiYF{tJB+Ri6FNRP%DwU zPecxDZMgC3npkH?+H6g~f%G%|=Xd#}R_EWHQ*{VJVN#J7Uk(MN1z-za;edh(q2$dg z%YqB<32(qkL!t7T^Wm644d2nXhb8_Hvw_$ODIG{AnO@SMqGbA|!mP<_(;1Siffg$S zIi~8A|0VK^;<*H>*5`5fI7L=c3@nQLjQ`jakzaZEQR*XX4da33*+2eW#QgsqCQkp~ zt7isKjfYe=w=!>!>u}&^9G6H4V}!(qaP|xMQXb+Po<`r$qTkYW1H*BFdO)Hqv)?N@ z9S8n&*viU!AnBfK)2l2V#le5uqxs-jMpbpMqSImI(}QrX+}=lXH>!C5rbg+p9O1)A z1pr&%er0v~=MsKo*SE7GYvFrX>u3z^9(6HZd-K@J9KZi1#yNc1Lqh3^_2oRWky48} z`q}AJhy7_WZ_?TZmV(`9{aPl^3yX!2H&#~#u^~Q9x%HHGW-1qJq*83RzqaG1f*l0- z+ohObRIj81!YNl=hM9S~e^Vnu(A~3go0ckIL~P^Zl|pwT1Db&1S@A;++?>1r<LjPy zvPdiZzW@2`^Xo1V&aq$j=RuBj2JOnA!l;=KG|Me&gQCdcLwAG?cO>~(ezNLcI*!*f zZ~gT@4f%_grM<=}>pw1A-5SgPzqW0VHQh>-yLLKzSpNSMP7cK=$>(S&iukjW<eUDD z`^Ca_?9O2oo9lXq97U+y6L-&#sR-4IL_`>E5U^sW7u8&zq~K!Bat;Q{ygHWW?1w1M zMBkTr`ktfx1`epysP?}mBCUo;+H0#`63?T@S`L-ZHr+k7o7Xi6VFNE9Gw)~>Q(T8? zUYfZUO?(lFkbLxtgB|qpgS<w1rNE%T1}$avWCU;<dj~0A1lPyP{3?$-e4BIa7fiIJ zy;mvTx9jce27jSM)AR1u0=MdOht>MFFvqR~WsSu2Y8+GjfmvPj)J}<emWK6kq2DBZ z=$Wc4A)G;1q@yKW2zGT$WgU6Mxc_aLgv^!lVYGZ!&qL3XEB?L(b3M5MMy4)$RR!?k zkcVkaeo_+~o`po(E?i|i?@Gow=^_s<M%pc}Xu5%I+{zsfc#`j4FXtN^JCIBYR{@d% zkp&v~84ub1{f!WHxpog-6dUG*Y2I58<LfJ!W3=$n8kAXe^&j<FXP*b!_W`HJDV?=5 zYK`!yj50H(B1EGLel(dDh1`WrWMI?cGm=xBW8gQK$2p2DcE!ZPk7iFd8n?B1!*j5{ zF3kIUG!w&FoSCSoo{T<t7$Y4kHIpaDGrp?+EhcjR3ei!85Bo%SnUJgf5UGQTHH7ae z3>}=wi&scf_xt_2c+JYI<aE`Q_D72ktzj#yc<|*Jp=+I+?g!jS?L%G(rXEgiZUXX{ zP{>v9Am-@=VSj^*IfDV`4Sb_4aQgR5#Bsmi(k)OOa@4viu)&N;)$^4w-#tV1C2B%c zdeZ2O?V62}v|R1z)(-~_s|MYVdn-Jy=VyLYdfpdajNO}%J>yXFGM<3oUym|Ud0f|< zw)%K)##g=S^SAgX-*;Djw5Z#Z_bM;*MRLyiH{2Hb#{=@e(H#TqhKXX2j_b>R(;w^g z4<{v%ty|{z@sW47B8BNOk(1}M9={E;wmGMs|3@zT%l~$IV3W{4O$biPv$@80uKnwO zt{%Z0mOU@mXlZrp(~|$&|BWQx%Cfwc93-2ccDuCJ@_#Pgl&F-v7IgR>&%B^g*%^5A z-}*;>bi=U|Dt+gFF#LU3kjRuwUFcb7nAV&9CC1B_4tk^i-f)VM!-j}SUUaBoWd8Y2 z&xFgHRlG_K#4XLN^~TGypUM9SM;Z~UY*ud0Ur@?^1{@OmJGTjXX_($v0lI9i6CNx~ zenmg_`%`$U2?ic>yAbFikE<v*uC-Y&@h@>k(Y+#|?ns-){EAaHYr-Ij^;0jiik;?s zhb#1Lw(mL>-VkC5!S9d{?xCKD$UOqQ{Q&D+&R&0+hs7+Nw7mENxnc)DRf41gyj0(h zmxq=EfQ+}ci%!%_Gf|Z|9qx<ATvY4Um@s=y@0-}@M9;b(H1*8$IDSN{;7jbmmL<`c zA)Am%BqCm1eWazaX=A0VKU;L;mXM=TXNqksH0aZ_qV~$~_Q5#;tadt)&B%?_(EAZQ z6e)n$duHC~{=iDnC;`7$uyAh0Z*lM#=_@fy2W%}5Jyto<-G^Z3!R+<3*I5gHK&wkg zS&s}43vp_TrCeNv-wEb=SNHYh88)v6fl{45*;0YJTjZ<5iv%@-8AjP4G)IEIO>xv) zpG?$i^#xBHEvZ<E5lo?Y;j{Nfvu(6L3^=z-EDB<yzBf!4M67Lo3!$R4k3Z^=N<rq$ z_z&0)E-T$z2{x{?n`joZu}mkTgFO?hWUPBAE~sIbUMd=0?XjP#KAaPVYow+-)#0JB z4+q{YwH8xDCMi^@Ymwv%CaU8~9Px8@=}bZrh_W8GlWtL;e)8g#TD-*L{=N&SqK0z- zYrS<lv88r%q)UNm&BcI~gZ<lvSpQ8As+){-;DlyCIX5u0@&f#tsK_s09EQ`Mi2TB@ zMby|_dna<Jv>YaU-yu+YQ(nxRS&G|7NVR5o)#Xf;rn{Bk@MRv?u=ScSK-j-VHtbl# zthi2Y>r<Me?}nY$ybmcn1bvjn+j5Wn-xvnWkFoPO?E7Hd<I3`(nK#uJwdyX=(&uL1 z%uoOKE+V1>7~^c5w5p<~^wmTp#Dm@Q5)Z3V7he+S%<bx*{hy%KJ<ZWs)ziwJs<Pyr zY)H^bnWr_^$$KH;e#X=PiJ*_**r4+%I91<Aeei!$32$14;AC@MVc~;+11^X}4`1*< zCLCSZo0&4=%GZw}hX0V#w@Hevlj?>IRc!Mp=O4>v`Z{*|9R5`(g<^A8sGyUn`0(Dl z<8s=iH_-vJ8Glm}e32197P=ne&i|l)fCl9rlECZJg;{8*&xhYebI-?B<v+0xt^7TL zrbOWA_P**26FMTAo<FHDhC7{XP0q8>o(}!z>o-{rpi<%W6MHkE_&g2+B{eREjypa- zYlBUG0DyOcWG{#u`Guj<jeK2*bnI7RJVwN;yp^|<{akVQ`Lzc^)5aGP^{z4l;hgiI zwsLUh@ul>JK1!%so9rbw>+{aAzFZQ<%(AV8&Uo3-Y-v^DQ2|2Dy1Atm08foTtcfY( zv%Yi+mSdySI01NEMIGvhgQtb{6oy^cD6EoS&rHnyNI>E<qFb4TnoX_&e(6-U^M<JH zDPNUuV>0p;n2GZ;0ci&xMw!NiRe6-#Jg=Dy=F!g`d9>evOnU$)w6m0WWqqC+0s<qn zW4=v6?i<ZjR5*o`AWk2y2lHoE1^^f-<9KfA2q%Y7TZDX2Ig}a_6@It&E~Ttl{i=;S z?{;dz6^FvS`{4!Gft8<*a%YqWUEHvlAgvLIA6heBvzr}|6aHJI4gbkdetvcpL4$2g z1HzhM*W`R-(br#1YVV}A;Z?1g_uxowXnZV8z`}xyO-8si6G<qV$(a&4xDLNO#<OPI zu!Xe$5y|S`<Q!EiXmGae#B9}*;g{OEWr&6u#0Ms}(k&jzd2Buz>`mWVwFNClj?b^- z^1$04e~0lBSZ`7LW0QV8-=Swzw`AT95<JeJ+s{Nwl<wf#aBjDWF0OePw;1o@S?iy@ zsdvTW>MiakHOB2hAs%EklxJ)ge#I}3njzVVPf+ZAT@miv;@;}Z_tp-HM0%EzohM29 z2`I>SX2E*@8A$KYK+u0g6li!#d#{2=Dw(2gzJXcx-kYj2k3)+h-R8b<L-H!D0v77c zgn#sYX!_Cm#m>oreiq3P51M^9nREr9T_5)Wf}zRzz5!Z+lmAwnTH@gh+QzV#rQkE^ z!QL(Lo_Q6M-0u+3fVuPZ&MRJ=34YO!FCc6b%UT9>0t~z-LbmoUNgFEY`dJK-YSoih zzE{+KgY)-ijMbl++@Q}4?oDdQ0v-g|Ucz3_^!L?rs6L@Zs@*H_uZS~>U1-NZvO^4Z z;?hBrTT4sdCVIQ@)cLLW;&ko3<>G|;6D&~6c>p&vno$+q>e`|GqJ@UP$#G#Y|8=5G ze4*5RAUVi;51gEe-Mff>X2R)^8&Ax>Vo{ISv44~PW_;W?-OqVsWhAB&<<;swy;%)d z4~JQef8O6tml_<zcUW~#ueO_%jD&-}99TQ7EDuiR8I<MfeqNVp^3NP5ET=fSc<A-; zLk3_hldHZAICr`|%G{#3*@=exy55lFE}o&g9T!}fI?RIaMl}=RdgONN!X-mnWPw|8 zOT|`$hiZ3l*Af^CG91TB+NK9%gY<8P3<xm;9ikogxKlgM36EDdy+elZ6uJu-E|GG1 zo(esm3OaOMEK+>Y)+<|CC!C?G>54~!zXAP6@Tz((BP7m|_peR28y+~Mx};rohF0R) z!8qTn-Nr#Z<m=aEmh%G1$J&@`E2P+<<;^6<=*MG8(xIWe^9b&=YA;!O%HE!WZ<&Uo z`W9f+8gE+ty{Flt6x9xk2u}30heku-nA_KUtk-c3km@bLfgZ<RiLpQQeQh3vR`98D z3lUa}qozD|Y21#F;idnIQI>8u!E{aFRaN+-y9Sl1XGJetCRJ)QMywt`U;0S)@2<0N zqUR2uC3(?L)pt4Js@tt9<GvZVF_otc2hHLL=paqK*g}BOWg1YABZo-^Y{0nV6)Pir zjCOX*ldcaPr#mqtg|S@0G}MmB3$gD@93AY8k0x9!WVb7r*|z$zR9ity3j!XTg`d+E zeM7b*>z=MrxJT&BuF2nkp25S}m3BE>2?^*D{oP9hJ-v{=un5jVMNDe8^bv*JLe8X# zIH?`E#{D={okXF14(F-Vjf~Tr%|@=|5<oy7Et`VbP8^e+Ca8`G+l+<@h`KhB$))hs zp?sHQqSY43do`g>%}aey%2#qY_sz!XY9IkGv8|RKqdj0?6oDhYWYr7zs5BsX;z{;t zkB2c(r%^{3Jqd_a_#!`R58LF1CV&a^T*jepRda7O!ZzHKFj@R<e}4&v1x3$*;#J2# z)yD}=5d|F4X61wznUkypZ1FQYx6lxY)C1jmT@%~51H(XQ*2s7^Fqu~r!8>@G9rRR2 z@OCSRuxC=1{h=KUv5k{dYYwP)07hvQ=UTwLQ_!c<;tAsf)lWq*a+}#2K3(u7OmWrr zQq@fYA2%#i|JZ=qPEg3gp&P(pNvEk+)?IWlX}mojKpfJceRxQfzqOR?#wvYc*JiI5 zIN$Xnu^_0d_Vst`^={LH_#oqO=*m^2jjvGxDvZ0+-{-~?Ew+M!FKcu4q04!-$2Qb2 zH5JHcirrI~z60NBiP>z?*b=-^3Md4{+8BA-7+xLX|4b5mYnSXW)@00Y*SUSwhpfgM zYA<yICqK?EkdfcaT4P;Avp-c4li!EB3<<rgf6>8&L@mxTaOqKleE5t~v`ckxeL_f? z@~1@sTw0-wb(=n?`b=eIz(SQERDE$zp`-)<60TClpms@?{pCCtw<ee5LDL7F<QSV^ z;fg?_^2@9He?1jW%??lgeuaOO!%^a&D*LpZU%vRsR8i#a=MySjUs^T5s?K!Kay9N+ zmb|3}XciA;g*YvDxDC_~v?DacfJzKUN6uMqr9*#}CH2R=dX3i@)8xUKVYsSezU?tF z1C6Ls(t_`ecNlp$f{@#*53dqxyvEy2?X|&UlFaiB98c7;Pr^YwJ^1>aZ?I6_cvp19 zZq-rj{nK862R608JiarQ!fVUaz0HtxmUQ|;lxPKT$g!g|bz)v2c~6&o>KhSzC%2zR z^RpRO${8-&^N1G2wQ?9f*mpXF`UuF0h3*(7yCfIm5S?v~Z+DFiys+%JowZESQW>56 z0XsxpnKZi`@VZ{t^j7nUhi|4sJrTzv+N=J?uL#-{()c#LuHj9HJgjO+eQ^5xW*6Mm z1aZms1|l-%lV07HOw|!*vqT9r7KA8o$pCb*jqI;d_C2w_`keqPO&JPyuQlXoGv$nI z(e?|3Z*Kq6;7sO9)}!6PMzu(T7JeQufY1HmS^X7GIpf)f=WXup`BTN!a?f5<5u3>y zuo|kUrdI^Iq?Uk1Q_Zv^bMvhKjd#I(-J3mQ-<Qk3eMcC7S{N_$x!f*2XRLt5ZNUU+ zm4d`%fo)Xt^bt9lkumvM0N?N`cy3jo)Lv|H)$Fp3R?DM5lF#{Wjso@Cn%rufA+>vh znvSO826>;;sj-U0W&X;<QvwzmP6eLmXH=h%bhL?3&sIO=pXKI-s6XjwC3986r))LE zdp->Q5$(UCK{E*K_ODuso%v;G?Lj35upY*1$K5Y0JU<kqA0FZXPCwPZ;fTay<Z9+Y z&Q`V>Jo}QZg2Jr<|J9GA6F6MyOu*ugUH5~SzW!zcrrH;rTU}NDJyJj{>8|RysLyC} z^OesIv3l^sl;)lgoMbwfHl$G@mZ4Jssz{mC^X<Y0UFTR;YVy9XZbddy&yj~-3h8Bl zWd_;c4ZlNLTDg#|4q5c1Om5;2tT581gHx@ebt7{$X|E+eKU~Jt0s1X>wqm#5bC=SA zR$C+|Sgx|aGI_-tn#0lC0`w4{)tIg+bM{FI-~n&qy)EDm(trz*#Th2=iHF7i4EDgN zx#Tabx#iD~I8%Ws7>?h)2t<Q(SD{Cmk4r~!u!pWN%U8D@uir$JBWm(H-=<~xYraK3 zetbEkyJVo9^bs?09KXWQ42ua{mXLd{`UPc|Ft~ohIXj!$OCEH2$rVk07^$9|7mu$A z_;fxW_((W(|L-`&mnW453ei%Zh8r}(Y_jELl}ri8#V$xbp=-$w-%xlt?5LP`eK`8B z+#H{_7TDJ8NgNpm_yi{)g6M}Oz0T8viGSkG+d4mzkxxvs6)KogvrO@)bKcTOVb%VN ze^Uca17165obWS)ReKn<>xW4?aMdk5;XC{3+JW+s{EFdT7Cv;O1q$>24fx~Rh5iA1 zJw{Pwwwz8nG3^jZt?fWzbq2^D0>h1T2kN47Y0Dj&<NaNu6@`xU+d+<kY`0LMxR|YI z1<0x9LM0XAD#PF>!yzt1G?3B9>5oD>7Qjfe{}`g{<A;X@rgxC?(W&D3YpotfWM03z zZ4EGsN&izsbRlp&f4ViPAMSDeu-du4_lQ%7c;Ef^pH#u#C+A205q<z?H{5)N!G^5k zYlNCEhI;??*ZFn%O3f-?RE4~%FoCOx@yGe~!j2*O5>1JuwHLG8bD*nkAy)h-kR~+7 zGdjJm*Y-D~B5p&7ZDfYd|3}2UEjR30#`xe89&MLTg3(gAg^$bZ>MLU7>Jm_A1RWJ) ztDB+C@oj4#6(`zQ&Q=2}eCY&xv2lbk9YeLIH{prHQ_W9*+JlJ-t)NjsPKS*vA9nE5 zsLDlg<tck3B!`tp17B5q=9m`MnVy@{7;NTU=!uWm06#P66(iQE)h>5!TMZE62(ih3 z?&9R%e!f$%QB?l-T42z`U?-5#Q*^IzCf&&Ik)S@UJ$>^x#~G+xs-{uU!+P5OGf>L5 z;i~jc*mwW{Y!E$9ezTD3B+LXMDw^Na5-{fn5MCsC%Yr6klRiY+bRa-Idl@%q6}SpA zQeNc6bX=_z`DJ<?#Qvw|fK&FQ4}U&eYWl(F>C&yIN)xx04H04gcFZeDBp6}=mzJiS zFrbK(^VOTE>AdGsG2qbQV_AIll8DHvfnh;V>XpfJmt9$QLF>PBB<{z))ayT~As*Bi zCWA$oA=D+pR|@NMWz->m@2=aaeR08Vboseh`pV(G@b%7tKx{=>lg4q7E6JPeYF^-b ztl;cl&m}=D9i&RPVUBQceIHLUgK5sneD}E>8NM2jYZvcvNQf*wd@QfB4S3A@)yzZL z?DI;%Ac#bZW_FpBo!$GG4d3_YO3FrJB@=pYL@ce`NP1RiU#!C!6ee7(tF%5@dAW%h z(q&@p8#afk*Q7N1_u6fWqe#UxvCkXy-VWUf?zZyKlCgqE9F#O!)IvN^*De3HSW^_M zz7goc0eY7tcq$4^;A9D3yV&eMMb@;^F#0F&w3rf-mkLmIU_}O8NRe`kRF_D+*X)eT zaQj65LkN~?VQBf#z=m9Hj#;v=BST)<l-J^tQ@%DMm+aWqrCpR_uUquj(U_eX^IZ7B zQTr=DA1w<=#c-5sv1eJhjqECS2T}#8Rhx-=!LE1cy)qP3$MrPvkS&aGkNc^-65+cO z181x+?i$3p2{F4qofgDT8>KvwZbmBe&K*HIW>>vzvICtx?7gxn);qx6=>xz%(qc!y zuY~<@d&FLg{Q6It7JqhlcO2#F{-*V+3Gm<wICww7Z~B`%QQ<y?JQa$K<&^MNSq6rj z<_NceyffA@{}CzRKMH1U$Hf8SMZe8Fvp^4pi>(2+W_I-YR_@cmsZ(3AE(OAWvCyBd z+Mn)T#r)f)&fJ~JvR)&{yJV>U7dZ9HFvMa|r~`WTU7qVFFF4dI)|8P_KC;kwC+mA| z{`$F0pnKZh%t=4{tVN)r5IU9bS^$;6h%XN^#DKX-zOAKCvVv%BJMjrnX+qi5DNAC$ z+SOL#8=htnkgeTgS1Vn2Ija7y2UfU8I2LI*$_tUK3Q3LoR%D1<iEaib|ATGd1XU9d z<FvG9<ExIuUf#f;h!M9Z$YqYip9M%-Fxvn#7O@q?p|I47Hgp@+0#fyS<nJK5dU9&b zHJ~cZwa#1C*h&K@#>>0jSRJVTf%bMn-5D7U<>(ilaKl{5ttnpu2Ke)>Y5DncHV6E) zxEb;xCRQ`CXcZ^#l}}&)N~+U=$J9nF9euTKFuJL<YXW#Qg(#I2=bd0upwF)5KUckB zT#LOkj=xl-#WH2x*P(tup&={{!`YD9y=S5c#%*WBsKdNC<cw}xXNh^h3arZULEeCF zeyQuNz1gHzXGKB^vr1KGSjY@`Gq}x#0HfjYTw3k1xMl%Cv}yC11){>kNWM#75mli$ zSl%hG?<q-}taZifp)mb6J5<}CjfIxkbDpOC2TiQUQi=32?8iL&0(b%#*m#9V!AiO) zeak(5t4qhjK6kdfR-ZQbZ6=@H(0;+QH}Yjt3pZf2JA&#XUKuA$@|{@|H~<Y!!FJ9V zRH+9};*}<9^HUsb;-Y##ionrk@u}V=|IqQE7@ZIZhtd<nYHgeMGXjrx=SMuj$Ed*A zO&N+y1g9s$Ze)~ESNy4*)tT7umvr2U-`=(lDUSU?Hc}`ZX{rbE^4EX=IB_s_MPeEE zR%BJRMh4*2=V+B&$_6<*FE=mwX;hk?Z^EZ=q&<kat3rz!dS&tB_2_dlCt1HWM_sWX zzWTP$izC^!-<ByKcqm>xTXiu<XgWm2z1oa4^9O?ALxVdj(LdC}BOc-1X1iN2;?j52 zvp1Pmp1<<rpuqL;(lK(h#_O6eYcl_MKnc|qqZ>BTqd!cFyxgu_)yE8L@S+Dxatk+? zc;PekHu2&tBT8YMSq(=^m<W>bD!i?5|Fm3h+&<PB!<(4ak6@!9%!}Xz4w=ut#l}g% znYb+PRKDR)?^ZG^w9gltjJvt4kZN|w;rJs$dLon6z}eVs*(JB%49R%-iM_}VWwyuH z7p&gZK-GcTNFFW<50yjm6S5aY3=Yc5M)W4|G_9V+W+d4IxcxHct?Ie1&eIpZD#_1L z9QyvH%kxij;Da}zr|o#Xy3RIsU7xKM5h?Wi$9T;FQ#)6Lhr6+k$o8}1y^BsLymyly z8&RcpuybYR*?4he?&Rlfb%aZl#DVv_0k9qI2<Lf)ru_Grcf0u^E)0-{PSnnZdfkSd zyB*wBC^TkgHAISe^YhI&?-Cy?03tnkTU{L>HQ|Sy`;Uml5_R^d4Z;8KtlfO5S<;vR z_s^x$@35F>SG{JayeHXucObfU7uN51u~8nHqZOOmJ=POFaMMIv{S5WtITA(g+TO&n z!6T+RzD)FTq2CDH|H1qU_dg;A?e)RZ3V!P6^2{V<u{gM(VWYTS-3dA2kMg*^)S|)K zu4I~+{sta%9e~=vHVlJjD}<(Dmtq8yXaZK%`D|Zuy+4+u3@vsF!51U4bL;f|v6Qm8 z3;mfk0j7MVAG0bG7Dpy2fZ6Xp$q0E@T=<Co%oT8*F-j^)x1=huMLa+JwfJ1CBF#^? z-Zr@^enp^9=q9=2hCGh^U1F}r`Quggn-u>c&7x18nB=Ya=36v%YXbG<%rwxYw<0C# zXMF~BouYDIzM=2^Ycp`%(DDze8R-OK=b5fuxS92A4|_5dt5?^q{-EdQ5(Vk{_u1Y0 z0thLnX&KXQKDyL;XFMVPGK7EeNUbT=p6sE+OMozJr1ciNYw8A^4a}W$2l24RrkyH> zpeBxyg3g%675mBDDOi9P&KEIKPC0(9di(UQz!@de4wVce<Vnv&EH4CGKr*ADC`D8; zbk7*A*<AKFX&;Tb%qagb!(t5D?oA^?Fzj=ArK~G{9xeQE+GzKkW3v>6vP8}jyRrC1 z*3^c1i!VDU)l5}U&d-_{kGXG`;39NIsu{bM_$nl~QY|Mmz_+0r9Z1nZjN;*w6L|e< z6V;k<j-0AI(5axQ&YBt4RuDY8!ewW!2pG!o&(ud3jWW)4TBxx9LimCldoshz^bf@I zQs`lHUT$v$?T&Jw`Jk!P^lQ|W_}fP6`fyK3KmX2#U$?^%!1ConL~SIn$$h2VNDt5n zFW|^M>4dchRc3nXg)(f2k-MJU)`kNU9sl;(T%p_&Gud~-q1F!K0@7|Dv^(6j34OA$ z(RW7I`vdb?RbF3HU(<+Qa&^KMkKY~lo4R#?b$Fl>u!$B7dso|_&mS3rO{a!ilTp!x zpZm3}RbNS%ht!NWL3?Y0RPBWf0;A0oxow`t0e1e~fxwQ)eO+3)Zj0ehd+ZW;Cy&Xk zgKhESCN4z|ti|Z+8$yG@KlCDfd4fkF)T;_j9VV-q#ggNnhW4b|y;ozd6mZc1`tA&t zv(<>(beY*@-qF7aNm32&*C~&<E<ML5mUFk)Lir;uGOAJZrLR%k%(LDarc)KwHdflX zDyIBK#>^}B4?(dB>LRAMkD<Kf(Bce!qh+8uxV1M|yZ4*Nv;}(H5rP8s0b-cM`Ocu( z9FoRpU$Xp#ECS5FVjUcnJ+VR%kZ*tor3I<;V3!Q+_|R$ydn%r&$M0<+Uw(j(zUtjq zoe+a5wXr}dsxVB4+yXM&m9owpv-J<ve{wfyt_}8Rb!5Q$PNmSyob<{cikjA3R(att z@xfYAOtQG1a@HrLAS1$N&+&vU{I<Fm{fToaY^R4jW`TZ0x6LyHg-_K+?C%V&aYF*^ zl%fU}zhR08J4*oJlDd^oz!y{)i#7pgcLN=#(V4TXgpQ;4hbA)!at*Hem@;1#MmUT- zs2Q|!yVxag(v&lnoDK<-%k+0NopLta23v&aQsdiNcE9~cL^r&!K4)WVJZMNGQRVrq zFNnKG>axzHS{I7ri?;EIi5M8TV%>CtJW=5D9NVyMi`b(1*dix&gW+&4bFu(AhbC$p zI3BN+Saz_m^~Fn-Rc<f$71J?l$<^9k=N=q6jQ5i3Dm`C$i-y`RCsd$rF=i=KZCh=| zOYVGNfY5U}@Wu7-hzF;o66Lbae;}TI`RB$E1RM`eS1sQ%H12Y0(jIXtG4-l=tYw>T zbo|!nz1xq69g<UgvI2<D&O>|-2Vn>Rq0_;vE_9%kDF1V+oUEWwLFPt1s7#{-ZdQ8) zPJlq?{&c;TWIM~PGet<0!295CladqMS(>zq2|>`_Yd|z9Vz!>tTU>{a!+wvXIs~*h zZ+?=YCW~GE{xIUg)0NtnA4WRqt_8~Dxm50ISI&^9rX%FM$c_I;+j~bfwe)Sn9FM)A zf}o<HB1L)!>54&0C<l;W5(v@>p(s^CK#wRzq(i6)QbMF82q8iGQ9z`G5CWltbOHv1 zgerQzocnp#``qtZ&%M_7eQUk*NA~QQJ+s!HJ$q;7_q%@Abt&asvFFeQ*31A<7y<B( zNp?_@>|v(fvh?Xo5JH=6U95cKRT!Nhu%b2pRr|*cLSsvkf2caOG_kTBsb}I0?j6Xn zyBP67j}$vltv*cls#H$f8YMJ748DlZ;m#~hME=5QuQO@#h=OFdDr2Iaf>ynQz4p+! z;ytk<`q~PV5*48++ptBl8Y2p9EwAcCxXnG>`XTSd)d<)S9-XFHJH{p#U4Cs(0<xM* zBmJbY1C$!ZyWwj}L`-m}PgN$B+}B|RsZ)R@)e)1G$c<wTaXGC*G-58tqISlsrl+ta zG{C}lYgMBYkNbd;TgiCJrJ0<(SXr%)YTmv%f2k?%r4)&Y=qSmpAw^pvI#R$gp@?BP zRvuc~Vi}K<d)EyO9Gs|JnY!HoV;C5z(|LqT?_Pj27}xY|`CfDZbaa=75CvM;+}!!y z#Jwa{r75VEG0`HB<)JuAkg<y=3zb0wgO~pWf-1Tw)x20Agn&=$A5TcXS~K~LPKQfr z$K|RIusMX2HeS8142yD~f51>(fa6Hv-C1d)QP%bNziPwc0s%ob+FJu#oOd}c=F$Z` zKK9Um;85n*Q-*4TvuGISa)$h_m8z?{ef;|-joc?%emr`0IaK**ssa!DC7*HkMwv?g zRJNc$anDBLvhtu^d`&a5N8HJyjA-na2UV5)2g;Qe2d{|w%cI!NVzt*=(6Kf~SbS?1 z(LQkEg;b_z{=d*(|8FjdKSdHI92V%Q>$@B;C?NGh%DymK+^6JD?p7|#gC|GupVH5N zH`(wRDu#6ozrw|3;aF*Q!SXOgxRcy)Ax@{;<n8CE&IO(ruj<goS{3xKNNcs6W*Ik) zJ-?$omSblBLsprxN1&unAWiaRNBVsy$S(qRii*`g?cymrxZ4TC9-*Mfo-gIj0Y2Zk zJ}6<P42X_BD-UVrEl&5EZ;I*zZ}Wl)Wl2I(WRLV%2kJO$zS(h9v#%j2Z3`_~bmM4= zQQ<b2q2IixMQ$s{HP|CZaX%Q4tl=dF^a^Vs)KU-Mny^R+UEKXCpX(2(9I{<DkUT8x z6NATnjPQr6);4$)(|bbUNaa?%CN@Y|G|h$i6Fx>-*_aL!H8i|!@H`C=2jx31U}JnC zxRN`grUn0lL^&cAd8@ZJhH@)bUqxH@`F|S1|6G3I&VSb(vKjCd6+dp^k}4+=edp<! zs{nK5r=OJh<WGp7O+OO7c+<R4Amy0Z{g0;cF$v0pZG3#yH%?~Wvz_@87n~>X=P|P{ z?xxCVz{A-_$5Z$+?hcqrV2-3;XT`KX|2^jUi=->plYW~7T@i#R4#v^TYr4hnzN>xn z^Lr9Ks&v?5EQFC$<-1TiEG`{C5F{ZP|6`6nD!}86OurkB7#XgI6kp|Jl?K*RzI5W{ zpkX_6ob`LLNC}!Fj_?>6^{S_Mn}`_TI9RJtAVSmW#Jx!#uh$>!@8y}<X_98jD-~d7 zd@Il>=WRx-%B!N4`LB`k+WNu6b1U3$h+|rwVmvq#R*)IAy)>A+haW{5=fc&Uwra_( z){CLsCd|ae>czhj#b8<N*Jobpp~pLm)5p_|oIDL)HI?qu=THaG2qXMWJU`H}1P?uM zcC)i`R{i0e^e471^_v}|yO`~v;KgV%H2KY2O1_<keQqm=Qetj0@`&bmvXhUht78Zd z^f%u{`)e1cI7%gZ2~n+YHcfSaJojK2R*7U)*EXy}f;l6%C-&v{$dSIV9E6&2fw0X% zUf3^Z(uLdWh>qFFYX!|clP37|fv5=9CZz;xO^VfCi1g~T6walvn${hjceWZ9=apF3 zqNbY>vQM7bZPI7xidQ<v7dyx>`ODaO=x2SUL#B<h+cJbV``5s{HV`2mn@$e>OY`L? z+!g9_ThvJCWv{|4<F%-q`iS70dWLpitYGBY(uu^TV|~ak1}+;)2?ms0N}wkJ-{Yg1 z-{sJJ%_qQ1DgGFsOHdJcB6vV|Kxc9(%lp5l-2cDa)96J3iNiWJ?eAW^7Px-=_kVgp zy9jV)p@&?JE;O7L(|L4RVCJwmulNxBWqfekmsya@W=zdY@%%fR_&|}2mv?womdX-< zmo`f2r8g=YETiY&9lijd{3GS}n?%}4`5fLnzY7q(elGQT(P_Rz4}MQc3vOp%u=!Wx zt1?td)Q3_L!hI25l4YT)SaF+Z$wRdKQO)3wg0#J<k8<ke=2N3S@Fo8rEmAQP5fR_# zhU@Ydw!Yui_v7h<RFS&II}M&u@*MNWG#An>ROc%6={`?7TBAZE)u?)$`IZ46T=Z-* z1w^3oaP`yH(oVNMk(U-5HomXD$m2rXxQ1szpv)QFmN4_FzWdK^B*qK{&=tzm-43r> zVI0p!Z&wlADF|W9ddZf6CRt4ljz_b4gL40RPaci&CB&%|LBma9ov=}&dZ>e@+A5KH zrxDI|I7E{NQ=(tf?(W(y^j&f%0OzWo=^9Pc@2vh=&H^`#Mdpu)IT!UdRC4F5vBk9N zk3A#<SR0iV;*i*smCTKWN<$?9-|%k=DFbQ)UV*>-*eqb~XBaw&j<5CM23h)R29n(B z8+j^y%X6#2d+fD<iy|$tSqnRWwp8(4jX7bw-;zhkLa@8#Ox3;WEj2RLtMn8IT+B8x z2BF`ezh^QG&Ff5~bGu)-KEy3AKv=Lbs@_gMX@HAIa*8@;$nMSjyQH2sBg{*UQm*i* ziP~URb!q5c_%1T?`k|!XjtHGP40Pu^8C%Z#BBk@+IrJy!A9PQ%H+x?$NBu))e4SvX z&lk{5@{>JoPxn_|6>ln(d4EI7VKf>g;_JXYWOoZeA$m^YM)ik()$;jH=}=b-e5S4l z`jfJJz8I_g(bqka{lBL7m7SzKB%SP^7+?QS$0pwRliJYV3-0_^)A1%>mXHF_Oxzbh zCqM9!6N29!S^lr8iwmAxuWe5qYj0CNu5qrNfqVWB{D_y1@JU^Yk!%C-vhriN=kEk= zxZll4JDa{JARRi|q7V!9p2}cD3I)0+1SH>|`tjhNxRVs~t~k^b@UjLq#PU)1tX++4 z4lI-}9~Gw$nDX5yrk_H6CFFr$qfO75r=0MREb^9U#HjS(W}4h>14(q>2kHVT*H<NK zoMeRLMMUN>N$koZQAr6v>Wyk26`fp<UN3^k=%ZB0=S6&bF}Uk*%`}qG5;bYxYhxu% z5t;;1;StUyHlL*U;k4kqQ^+N2g~L3tHsiFBnW5Obsj9ZVV^RY-A+=9rB~tlPWsbZz zD&fJC1pa|1wYM!l)Pqn*%VB~RHLA-GbUvOYq?P>X{Wv}{4Mwa#I&gQVV*SA<R(?v& zL-G~mPy-RUI#$a7S(Z@JM$CB9Q?#po`Yce0MmZeNy)lQlSQKF2{XGzV#4FJC)PTOL zuIxfYNUjV(^YE1uY~a{JKUDur(2{g%>1TG@0&)Us`OtF%;bS*DCIa;@<+@|eL!{8c zF=$8uIL=h_9jD3eglff&0EMeSFzH0?>+KS?2ZZh^+}pInixv`b+A4`x6I+mj%o|M; zJw?r&)erhdC;>G8^i$5OJ<|S;Y!xqQ_uE@RKhIHAy@2=xHGk9Dej_IGuHe<Sq57Ug zg+(;=jTW4-vE6}^)mVL;v+s7(AM(TP+C@m<_SfKt<akU=tL`y;j1KI0w8Ay$=NzeA zN5{QpVcK#)5VuW(b^FIPyus0=HaU^iRC=c!ENo-Tq-!!OGSq=e-dCK~DqwTOiM47{ z4sz}ZJ!hs3^Nx{B!xATuB1F8BRmt4v;NfZ<@&3e8*qKNb7(edodhfL5mw`9X_gvHj zaoteFFAE#8w-u`|3Z>n;X%J2OM)H~638blzu^8ts`%^Akju|_1_Wn7PI7!!YM(XcL z;A(2Cv(wX7C~c&9dKT&Q3?mk_wg(v=xUK4RRI88X|2N-KR62Sqd_&*5pxT!;_JOW^ z<^17JGaly6!I(C*g8H!gj6gHk8r_I&+NTwUHyvDS<vh?Nq9P3M9N>#ro`z37nUB2o z^4Fh>F57$d67M7idV#aSw|~q{izP=n_1dvdQCqQ)FqHG#W!A#X{xiem(T-OEK4iia zCwwG#%RnQ9)6@LcUMgUK4$E>q7%H#Uo%pHT>%fre4bhtnyq`=1s|_;_2v4zzveOD; z5!}$W=i4oygjPBG3=rChW*L`wg79s70jb&;d%sf}bS&W1I?%hfvj_=C=r>>M=Kf6X z>sk7n&kjn@H{~QFI>_`lwUzblHcgt9AVCqK8d&{saFkb}f_evg#xti&xC+QKk+Orf zgPO0_mgYWP@7w;4414u0(4Z=_JLKzRO`32~yF}km0Q7O190@v{Q|P+_dsMp`{&Q8( zA<FMp6eddXZ$9IBTHnvB;jlN_zp(z%SrvKgnY3Jo;k3)OK}up7mEyJz2o-S&6E{JG zLS8BS7+`shLPn$qNy&}fVx?rpvmfxeLu%nhQkCym*$HF{SxHwt2QAyBD!)I~)I&IQ z9O%ood~lWkFG>(f$m4C<))aGtAmg<CT~5Q(#wo>V$k&zSkgu;b7_AECERfWcDAt2H ztIv<vPPXUlhvYjcS*y=p*8FfBroSh@{~ba9$d2-=qjj=oS3dmE&+28fwm370GQGjs zEmyyVp+$!Oy()f_*4UBn+=wK9KOz=B5c?6M5q$5CEkM8*SSq}A6wrJoL9>QmBwp#f zEv*@J0($=_{dC2h-+lT=Y|;6{&x$d1J#zZBY>SqtlD?fANJN5KbEzW?$(=;KAyj{# z7Otz)7$uP8U!TX6)^9_++BobimEyCu%{o|~)iS;(TxFW7y*~|wWphD}?zAS=z48z) ze~Y=vO)BH_z&@oilj7KJqk`=rMq)pNI~$s4oxn{YlB<IQ9}QbMC>&H|^^*jv9corP z7aWi;uve}i#Xb=H{+g@0r~ov6?W{ODkZ_C$BvD|I&_LVp<pz&6`OPBKxPDWy;$9(R zz~JR@bgw32U`k5|dGd{QE^{|Dsr&+mfgaZRzD#N@?G4tf!de7UD&KSOO;;zm!VJb^ zXf>0hZ$VZ4J9C>(p2+d;VC-5fU@tR+Ai5pYHEeYe6^Ge}(u;yqKd~&Jwr(GA&42Tu zr$WMK_V#P42%|kEZr`@sx`Q#t3zWx{nEv_ZP_J+k!HYB7T`5C^pW^9(S3~RPVCbY6 z^bQfR_iE{^ew7;|%qn7KUvzI*RN9;fe7NAJJCp=|x~N-Tp9{Z-QgfYj(EOnho_ycw zG&E)W$jNbh0&+?CfIJzaql56I)T5dzDwJHhC9^jY@##&W;gC~|7fhW#SYppoD|o}N z?3I#v-_P6}orPXPRS$h-*SUv_jm|1pP-z51O`I;XR$n^28QeoxDGl7n-k$I~-E_sr zDP~GHg15*vF=WK%a_2ry)i9lecX+aUs|jV?f#bOi3wp+55X$cIv|O%x&0EygFbuY_ zy331I-3_pcRA*$9R8Q9)-l`GFnVv@dBG#RG8&7L;%wMw|`@lM%Lk^)VcGsd}SAv2= zkRYu(;AG_iZM2W~Pc3jtx$N#AydBk*qr9`<T<;XUHgMsbX9Cjh&Ji5=<4~3fKzlP# zWykTNzlu%xPAQ)Sl-Ql{iN{)lOf}$wWk3jy{J0hDkQOrEzGR^xbFBOJq366lKvFH) zZT&&+pkI+Xo+Fe>N+m<U;z5(I+|^FMhuexzmvB|*H(H;W+YSfSnbLGd7rhu(gYYVF z6+wD+sjqK+TnnB99Gqpnp!hf{oBk&7y;4mf;+JJLg_h4uO^{O)nfTE|6#Ll0Xy1Ok z;V{-TjIhZ5qsP;zTXyVyZwK}zqkMUG{_%PRKen!pwdvn$*SFi$cqdV8?bQC<=kTb? zGy*za1?I9vDRIJFZ4}iT2nhmlBB5I(DJ|qCm=-&?ytXmiBb^sE!TGLdu<1tJLY=8H zq0Q?h;|U#81gLFCDa_Ju5P6lX*G&5HIN{WNcejM#3S@;B(P!@u)Avi1_4<#0&W6U? zvvx7Z%H}twOc=~r?$I*4qJfT5=FbNXXDfu=lSo!%TB!{yr)apmY>uyb;s>F~QvBB_ zvVf;ZCU|xFa&U<2?yro?PULfZ;((Op5Sln8siu1zSWwtF0~vC;dP$+kQm&8~#RKV2 z1L|AUmRH(0e%?~80pN^2l^uclbIWb|cAkvxRO)!ZB;wsa9!>C0H=iChwB_op7tQ6( z8DJ|7uMI@YNqStDv>hS7shq0Uh8M@Mmp|qI_Tun`f$0k?iwU$fmL9P|EK36cs8AKJ zg$W0JI`t8F_dL>u1wj)UCU@aE#0b@-x|q>6HGgLtr1K37y~m_Dn-a;dGsETBb@p#K zORqQsz3hBO5eCTMOMapOt5epvo&c;;K!K6^(l$-Yk;UWmtjZ29(Aak-Ee7ptm$CaO zrHj1X#LP#YSNUG|6J*`nKCy!Y@)O3p*)@9Gv&Wo}d1U>;sd0{Sa19kA$#S-sl#wFV zK3E#v(Dck=V*zk;358xCYLNIhQ2{cz)_Yo#5@^e|)Of!dnm$$Yso7U7*@{pZwi==L z%!R9GEkD22@^oq4{r)0(Z83*%C29Zi*w5;nvjKD4ei=iFFzb6afwl{4d%`WTS{U}2 zzSjUpZ@7EwQ7!e=tzL@DhIY+ws_hghIs1(|vno}u(wC4^AWVgZ<Gfg$o%)z8Tz(Am zuCm~el#94)w)?7oLpjEM6O>aJ%&Z`d*(jW@z?N=|Rpxt0#(57;5C$+qN^L^rUzqdW z?V*e=kej#y{(J$P^i=MtozD%aaNHkhH{w&U4H@hljdj}L%^CQ=;sAK>@IUE{h%8v$ zLO3?<db&%oibQ#wg&m=|3~g=qXiwR_Siz|MLY3;wVX@=BJQ{@tp8SiD1}+fdB=zow z=v#}SoLR5<#*;hc79K@g(7pQx-Jlrx_l@>fF3T~5Qm>i`>M`5P0rA22JP$qiB<`jq zK6GAVxcTJdawUp%QDQZafN%s_%Rt|w2$(aQIALaGuzmjES6EQR)1U!U%#o1uE6>VM z!x}?EUd8<f<A3b_TB}&vH}K)IGcTCu9F=;S`<`bF=>fEORVP&m+L>=oMBG)oDmkUO zuktLXGJIc;IQ96?TRD=R{a?;Mf>1B#{Z4@HjfspgKP)blRKx95ZyF;&3JJ}DdlGzN zhvN8dJ=X!8cxit3kNAIm;I5xdzy2aA{ZY;17jY6NB!q45@EOc(HhV`J3X53-b7|?s zguD98^Itd}4{1=u-U4TurX<gm7PvWn(2~SccuQ!`-pJi-{W6@G%jO2#uFs&Ee<jw0 z;zxJ_ZqFD#dKgTn7%CZIm{o)#FV-%Oeg7f11@8{s;D~+*T-_<(tZi)x9FD8A_QNvv z#hgZyVtc>!vF27wcSUToct)1<tj-~5JGH=s9}_5CbVWsDM#}Uq*ylL8;<LR}?{Iak z`zS<OmI9b^fCTjtHdZ4Q9#=qn6r3Iu-+sSJ&a$$~e?tKZdTx<x*<33JeNw%LY6EYT zg&1UQC0`tw{b`{0%%ryrr8t~RRq16BWLby0c&yGh&L|Y9cEztHoq(Q5^0{MVoSju} zNrVa1V%@wf1g=Uez5Um$`X7F-L<Bie0_Vsb@+`D1T{4)0vTPO+Js8z%WG-bSob&Mg z0g@fFbg%Eqbvivo;6y7Zbruv@R&?ZnM;&By9j<3m<*vd{-Y6rdS>0m`82d11<UgAE zl^S~h&=sXHlEhe-hMeM9=8XV|V<)PdW;eYQ+=9<&|GF6(`0H7jXJ+yhV-2h;5!oqt za-P}ueqx|k|1fdP7k)wMVpt{SLi<L;s+>Y$4>Gn2Xh7q~U$YPiM_o*1d2X=nWU9b- zAGMcQn{cl_-dd_2PMoUJ!f}4+@LP?4Xd0*OY-`f;8PT++#!2I;^3?$AyE{!6@0ZUH zGIBE47kBVVn2qpA-+)u)jtb)1Skb@!hr#)$==c7Xzxn!B^$i89IQx^<x;+Ztj6Y7T z-<+79Rx(REsXLd&QvjLY+=sK8^I@qUo74&{KjI}LNnw9*wZr}M3m4eiFxjAST`O2X zL35SE6>}fy{_ulmo}2Z0VH3+d;k3sX`&HG~w}ZmDY_|f~_CbU}EQXuhwa(e8SREQ$ zPzx*Tf{cdb*R3^;Pj}{d73f6~4bz*~@hh+ZYii84eRF^oP$Ar^8??-+@fw;aHLx!L znOv;R3I@$haeswrMxH*??DXs=;g{F5vt2`4AZNgM&rX2gpO<&51|FmQHm6<xxlKWf z6YhMM{>dFPCY*>72k2Nv<1X~Rb9K-0ZSxd+2`s(hCNAtjiTm6g;Wap{Ln%Fb%{%Sn z3G7g0;X?M^;E?Qf{_Myzf4XrKwBG#klg5?gfv#u2uDL6VwgsyX{XB25*COME*9zW* zu-ZV}(dICXwh047V<kt2$XSn{?pSKs$!pseq*?BbyzzMFP?U(2abrN|8t~U-Ufbt{ z7PCR4l9C$05?!<OQo>m3!qdHA{~*!x0I~{za`+MeBmWp%HxTbptc7}>5h_ud2OS_z ziT6=I_Yb(0#d~<9!sX<n50|CAX0D4z3Xs3#d1kXJP7YKi8cdmo5HW}Ve44)!RMbp$ z`8gf37*>U<hri({TE6&gEzT!sAyLp?V^*g7pt!|GRH>e$ycuS>@Z$-)i(iy%=}{}L z+kvw3eED8nwhIuuT$NMP{&v(v@FetBS4`rc(udp4X7}Oqm=Rm*axgMkc<Nab@|fmJ z;Qd_s>8mMxZywF62)q;gYkO`fGGzHXR?UJ5+gVyycZeOG3S9Xrq+<h0x+3t&?Ear> z;-_wquV=^KDo|nLQ}&x20$VLJegt5={T>dzZlEgf*0dj}^z-o-^%2*?MGrkKH}=Mk zt=Yb>>8>cI>jch{XI)<P+&>!n&qH2QoNVO3!ul#>Z;c4M@$gBygIUqa6IYpbZ6(z* zWxn595g*cA+U5ZrU^6`*0h_-rtJH~9_PL3o_9Ksd+Ic!{*Sn;%dy9E9S5R06*IZ+N z{&d-Jt&MwjYvkb@N94s->7oH)`dVttOz~T7hSPIn1Cv_PUVfeQXSW;k52}Zjz_krF zpHQ_qP>Ag-KLL;CM}+b7g@TY=SxrP0ux+}rV;S0G=3+FMi%xU9r~TLJ5=V)&cl@%> zSqNmRcPSv2-n;zih&yhMm`rm3$xdDWJb5(o{J24U%l-Ubtm0DFKEWVjZ3$KHIi?4l z-V1bbm8gwNs=+0EZZ!lMOsv&fKdmF^7|IPLC_F*dyDrZ)c8*q4hnBGcCC2rzKHqvm zgoB!+USnM+-*Bz9Y(G3w{;J0(YN2VNcR5(jNE>=x{MD@#KE7pzQ?e<xD-iul8(LB) zOircYPaT#t;>OwCV&2gY`n)}dTVX*b_WQ}fEdRy?f43s-wKs_>Ti7H+#hfKJG~CbH zbh>;B5>(eLx;LbdO+pi6&3bCYVofUq6EmByTs?@!TVk!64AxLTH-~3g1WkA9nQ#tL zTOYCXGxD@1=UG7SV#D6Ja+>d;5zgjnTTxUF#lC5(N)_R3)=X=u1aw|r4tnHl_y-Rr zX_dM3=T1|p)CE~NSeELzv~Od<mDZ%K+hy!G@%>9v=ns|F{d=8$_Avbq^2oq&9ae7# zk1EgE(4dzm<J3UR>|0r!C>hECTADSyi7;9qUbNzG2@M>8Ow*gL-K*bhi2VIqlr?PQ z6F3^^W=Rq(&`jyf{>Z%91h<4wT{erMjC2P8reB^{QePQwjx>7wspmeRi`%L%VG;ij zEq}0{*E8H681^KSr{mW*kU|Zxi4y%?(INN)7in#RVebD@970%m-qw^hs_jeET#1y2 zh&Ml7Q#>H9`JMb6X6SIHYkG8@n$tDh1qoht%<hL;pF#etM;f#kbXL7$5`tZ-zVwwL zVJ!wqA6Fcpjkvl!^-Z?ID*{r{s>v_#f+n7ERjulrnNU9krl3E<gL^7(D&~IA9l-AT z*t7HX4RT%%>ir%W>7Vn2;LFZaZMwZ09~xkM+_u@{rHC#{hEDf%#W;GVONCWtMyKsV z&A={tolrWh+w$!#H{RZk-m1N91@^nW$~92BZ%IMnpQV<aXB|XNh3nE8XO5SKaH{3b ztCY%^VOxC}3D-m)EBG4MM>wQ6tp$Z_LcQE{CvyD;c*O2Xgbm8;Trby}YW*tVJ<<HA zu;I>=1Tk_0?H;Z5@@RWJA6Qnh30w=FqA1)Saq*UufdYlg&dBzTJs_)c#`+vyRP)zU zYPwmrBSoJMH<-t(C#VVURFX_!H<y~8DDd1XF@m<t+6q7O-~o$uq0_^+i@JaV6r(%9 z6tHAP;D#4uj4WRN0V3N4HBf*F%Y^&c?hTbzmUMv=EWRd~0qZRMgJ*jw{`$g&K8nS& zo;r~#)f!Pwm!e&@6_dP+0H)Zbyz(@)Dva*J$w~moRx!l2SLX_vGV5nN#Ge4<PjKWa zq|Gs2tKQ6+#-^~&vBUS>Vmw$@yPqnKr|vxK_$frt&g3CJX98f%rpBp)tiK|rG$K5r zMz+8RgO<Qd(8s=AHKG&w+1UW+S>(?;gOm{0U$Dwn-InmuWb127`0;J%@Vsi-Dr@go zuc(3l{gBb|;%f#zaa={~djSPeKKl+{0}*;+VFh~Mt7zVy@*UZ+y&4LDRE7A}hGrdT zROFx5MU(UUitu@zjWFMN?%vJ0?VzXHnq~B5J^fMP0ZM3bm7&VYUK*!Y$js%Ct7-P) zd0{x-X_T#H-Mc3jshIeK^JKnyx)V}Ywy-Z!&viG^!fotBC&uS%3$AdQ^(K<5=82}O zs%P$bsGM#q49xn-S~_M<C6Rrh7h@VeEZg*n11-Oi$0=T#dueErP{oi;C*e$yjC#!J z>KZQ-<y-Tzj%Y~+c##Q;8F3swzTGX8;DB2u+}%UapM-e8oo-=|HmcXPY7nab+W0vn zZyDlup@h;Gl@vuH_0IF?V_~Pm##`*XqVVn9-2gXQOv7E&5_(<9uTracxZ_Pc0(U?u z(=>nIh#F<+6$lew#gn|3%jsKs{w96f8fxTT&6TDC+vWznAIyzH#_iI06mD3ye%a!8 zo2%gE*SuA0;GkT%D`$YiT$3n8ljyZ{SI629TYj6{tD9VFpn==9VtHb|+V&!$N;AM2 zlS5P<*U4H8Zchh$qN`|L7V?&8&9<erq^w9!brWyE@$(YrLr)0IcF7!aRon{aK;<re z20o~4B{*0E4L?tk$#EGk1y36Ze7sYAazlCKg+<HRbN$~oJ(`6nFMiy!iU|UQjJlb~ zzkiq`?vh(1ncI8kzR7j(!J-Gj8lf8m=UWxQV2M!y1%9&cY7+LK8I=F@(pC_vB@xx& z)rmylLjDYM0Ew$>JTSLd58XAr4iSBt%gwT=L?jWLFd9LPQ4wGs({Ij0B=|D74ZSfp zn8PLL+>D2Oj;wa2UcUGObMjVkEI|KkLQ8|0lUu7IA)MI$2wrKYB3W$wo4^Z;I6)iB zXb9o~(DsE}d@J$cQ~!7)AjlnD`P`cLG@I?u%{}>0T>&y?hgn)?H)x0Nuinp<usFw- z!km}d4QGe+(SQ!cKn_$$(-p{E2;l150rsrDq~C1pi#4JGY#Dg5y}e<*%y)+DNar z`BZq9+rX+xe>Z$JnR<!aqrT2|b}reCB2QPi4sPVGkMW2X{APDB50e&2OR8_)m%76z zi&eMQ5Z+s#^|n~+1xeC8OB<E6nP+UVweDr8PWT29rXX(*HQuiJU1YsaeU`bXDu-(D zuGw}9YD67Wi8dsvE?4*xYPKxa=Nr6^h7B}p<7#IkaH!n6Y%tN?InpA#_KBCJO3hd; z_(+PkWuzyU6U^0o69;KQ+Gq=kUbWIles!F@@C5B^nS(=))jX<PTzY#bK{Azp+;RU3 zBaiU5Ib<=ntk=X|u)zDCqI|VH`3b_S=y;}yO3do<w3It3GI*c;(2?({5op{ffuY9| zhns`nd_hY})grucmob=4)uHPnhYn{Lb?cu()xRT;_k+UiVm=zHjggC}@vmLpKB!z+ zBItb^;k#bLXKE?qDbeH&y`AoH@p@Obt4~Kcf2zjAT)MX$4-vx`UGiK)GJ_-lQ&-40 zd!KmRMD42OC9=w<RD~dj@|uT+;X4ODX5!N<fDVAFR{Jm%3oAU^bQHvuy1u)&FP>2} zO7t_T;gJ^U=-Mx53I_;#xDJ&%-2+i$f*}Cs^sim<y&{gUM8;mZ^9Yg<R7W!vjUqTN zx>`;dZlhiSR}eP&m@d$!T6Y5^MQ|7RXCe4MrfcQT|E>Jk!mxwxd`2}m7(9@w=9}kD zBKRYmbnY+6wVoex@NZ2Y92=+2h{Yy`KIRD0>@Hm8@CRM65X$xqc}FQ<3SIJuf0)(& z#oP*vu0f))S-=S517_gRu$Vc<PzT!2>8mn$15i;0e0m*P1i<-P$PXr*m%X)V8@Qrr zeYfOClt`FHX^AbIpnLmhfj(F77nhp-yeG$IR#N<muxS>g>^Iq4v*3i2tJKiop33EU zp8R=#coiw5q+aZe0eBTJ)Wvcee*5PkNpVLV0MH&#VotSJh(~V)%lp0Veu~Q>4m;%G ze1E`bYW?924W}u)&b|B3O?kI}?ik?3^>ciIW`bw4$wPf04~AZ{?*DSk{@dvM-_8Ec zP(f!@ex`#qaJeW-4qvMBm_obPY98HH+Muyb#J+ZzEN_Rfane}`4NO!8M6#$Bk>Wo= z71!f@U>+S!oqi~XfgXlR=_@(B5E;F-r;F(LQCZlqnpaRf-@rOkZO#p(jNh!wTI09Q zFn)Rayd8h}guXnhZ^!GJ=y2A(S6hMk-?kQXzAtE&dayOGY$PS47VtN%8i!s&WMP?{ z=CjtzoBa>8Wn;40Y6=L`vDXqetX#Po)SCg?<7rTjA>%FaNiBoSnlYk7?{o~_O|x$< z4|tiSE@l4(@K;X%{IT;xw2y3WGj@_Fe)*af@c^LhXA)Z@dJ|fe6sZ>Y_G)CQ{+?eK zJq$E3Y&PpoAT9m^)2*I7T_o`I!~M@R%A3nykSNO7YY6(#=stZ4x{$XVjxH;yMhKBA zJnrZLYB`gH`5(YwS`>HZZ$72_&x=!P4js>L)g1_N>;5?{`?NMQr$XuQbqR58C+Sy1 zu#I6`{bT3{HhgzyRD^ZiH;`K7rM(^I3`&$If5&%EmZLrVI$bMs;`5yghxsfnuauz} z-TVIvtNOn?5B_uSCo+LoD{uz&9T?`&<2nLCHAYFEo}lA8`Mvd$xlzuey-GW^_PgGu zMlIKlz27wx@=K?xYs~j=9qglitnP#_R_9TNg*2s_!|-2QpRz6?rKK~Au}w=>ItSx( zTsN8%a%8WK<ye)CvYxay%{<FQH)s>blkwXqQH2lW(8b=w(TkjE=~Yi=uG7_@)DQc< z$c-=#5_Z-B!;OL}T9HYlaodUEL3j9!q4fT}%-o=KIbfYUMlXF@3(|09^C7#mCo7l6 zblNNy6^qBm+VNKs4P7l;o;fJ#$aC@f{I$>|Z$F$lH@q%=C+L0fk}Ej@(&7#A$fu}t zh=>F~MJBS!gxX$JNb?)(6D^>UZ;>$@{hcxXdXjInu<oP`1-;^Qu2-K`F0M@8%P-+( zVO=K#^~2(wHSnU5)RIMT^RK993I$yj@3_mIfL!-o;(WN1sGfOsYrfm|8u>&;CRP=# z_Im6K%_<{zLXdPl2bn{fJi-AbP8ZxGWzY5K8s0NPjk2wxB6By2L7w5|SGA$%6N+w7 z(mE7XQEo07ey5wwb(ZwnFSfy#d^$ysS(-7|MkuMN^kr4wZ%gR;?K>C#;Ja|{?RkZ? z_L6p<_a;>#Cs63@9d*JL-kjs5TYSg=b^QNwa_IT<|8DbNxm*7_6!8n4F}>B#LoRic zpX3vk|9H3(XO;fST>Kj^kk=-{+ym4lz?Wj0p|}c4x&WyBbT<RdG=e7xSBNvEbTKMC z{2E(xg!l1Q%*+nzkN3MHBC6qfqoju7{UBB5oCJUgR5{}(e!X(M7S^nzANX}|Uldt# z1uDTO?-TsV5-gDF`B${7?fc?yk4LhMZrms?3I5^I9<*lq8{nMHro6cAO*cFmxDeg8 z{Cj2K6>yqlbZVf;MM53}U0QPfWZIp>@sfA=?wruEy8D1kVmovr6<DCrXy7@4KPAsG zc<k#TJp0utaVw+2F|d@ng7DYLAYUs@<ZUzY!#Gog=WhjU?vRilg|R+kR|NK{^_Y_b zmNEtK)4R2HGDktSho8rRGt=2eUY<jJ^ys42PYIx^^uXKQ>>_dzf>}<N*71;$$EEl` zt^w<GDe*T+q}9|!)z)hhq)H&>@KAIzZ_Setz8Yk~k@7L-oErmYpa<MKO%?bh#DTNa zJGasWI*N1OMi0y$am<pq6H{{OIqNYIw4JIsE2~~d8=&v>J*@Tt6FA(@mo2h+s%Zv$ zdYP*2nnA?cKayO~iCAR+*eBm%^ToPr!6ZRI<-l5|YhcJn8KjPlD@P57q^gNfW_z?X zl`!g$MiY~~smp>MG<P!6P<H^F@PNEqHl8jAK|bo${4y3d#7R`R#ftO8G<<vGnW#p{ zzv-#IH(OdQ#P$+<JxnX({FIi9&<_oCVz&wJ(uc7I{tYD5_(Y3FZAsndTwi$F0z%HS z@5yPNiaQDL(Z``Wg(N6(ljc{>eK7pG{qu#6GW(kn@o&tj`N4H-9FyfI4Oy|BEUt6P z&IhH!4OyQXq*%MhY<#QK&c$L}4?XkS?yK)@*~P~RB7dyQ6x>8}@ui*CYEcE$n5_`? zu=s&#r7Frsv!coLW*EML=XdSLo^_x*8U!Tnwz_OqEw`$fk5XKp2%eNs0=Xy3dXfL; z117jleQjs=DM^<q6|C{NO{SiT?qcy-iPMXQhIYS0f`{e`aRiYqid3e%EF?tA8!-Q8 zkiMqMGOa~rDosK&Xr&IF^`1q-u*Rebj~H3M<1;aO=*<Ca1~Y+Sr@6v`&-j2rx2NV; zLm|9v8^u#;EK_ajGNBi#uhg}r3p=BSA6|@x`HB(soND@~Z>_3<C`FITD6g5doZHMw zx_@#4(Q&(ddBJ0~Pz56Wwv))z4b-1<1g{ckjLhMW#hILS^9_<ty&IwG?qJh#sS@g! zG`JtCi*Q+Ax5=qrJZS{6R0ZrB*O0!5=SNh%xJ=!+fHx)-w(9yOc@)o@9+z@DK|c@c zG_Lfh3@zf_M5XPfQBp>Xch}1+s({dqlfT1}R2fKpx{8G*)DoPD$h7udus@2c_UzT^ zH?|j~dZpahnhFgTI<XYWp^q+13bwN^LzZ}EvT9m{Ld2B!GE$GN%c+q&5?Utupb855 zjQFZHJbY&Iq^6rN^Fh6^UQ3_R_@2Q}^?)qhT0{^VPpe?#3pY*7=u7ZvOzJrYh|N$k zE=Y5J_&zy^K3sr!cohE?mTmg{u1VrKqoEbjd8S9&-AqzvQG>^IQDv6N(e{|$^3+c% zk~nW#Wx2R@7*XG&W=XEf{7tvBVjkF`ka10&h`HK%0}Ag&2nqJx6|5G_@iw*7l?hqd z6M)6>zuo_({B?1%!}X+J_smdpm6maxQZI+Wr0PK$xL?*+@M=rKi9UU&p#obkPV4hi zmS^T0Kt~`M))RWZjh7H^b=REssZX~9vS@j*y}3HL?c@O<^l@F49i~3KP8YfKk^gT# zg~(HKPm@8HIrbJ_W51$CDQ*yTm2m;)Dx0cbHm7T`ovhpdp;>~8p0a}&xK+>uv9|M7 z15e^$XCiLnR|}H#0O+z^mBZ*pILeVXnT7r1(h#2RnGs^4(O6_`qSHCEp0JsuXd9j= zXD;PkV6iYssmc$YIXqPMu%NQ(=bor(!uLPbK9y!HfwCN%ewcP9Xp1Fe);DkV5V)@4 z70i681Z17`eNYBxD*w8DanZEJckUy&z)%zk;!xP<hYbejd3}a`IP#_7{^yC|`wvyZ zOW%v*)Y%)1vc6w#jD+(h7R#c)bjD5u*N>WqU{15UxL!6gNDr3fz3cQ&V{OZdF=HRV zOnaXyg`3ar*$UcB^@EHr8|oIh{mG(1MRiUuo=ALcEy&2<YL%mB8BiiwmqCNWgtx;6 zI$6P;W-(LgG3oa@BKEv{4FrsvNeRWJ-Ce-RyFN7{$}<gW*xbO#%kv0qNO5uBMAY7c z_)z2$1nufVmbK7)WX@#D`Nt~gH0Vx6UMFHiU5ObM-ylr}d&>-%G+uV!j-Q_Bvoq+~ zEerq1;+b#%cRCW!cdIBtIYppQ+Tu0<dCWka5as44?6OICAYmgT!1wl5t)+KTO$tVV z>=rL6E^)8O5B37i+*hxAkR&ceetR?i?kPbb*FPSAy<h{ppD5+6+K;Z>j4Wh0Q2i{B z<e+U7B2(dZ;O2mq?5-TXnsdIL>cf^x6s)V9Te{-777?C!q;LS7=%)%97u3gPJidE4 z9+Lk;GRN6L`(;_MoghStS=Ig1(ZsK-RD-in+oD+iIfr2Dvx1L*QMt<)X<DP{e_LFn zP~%<3`tsSE6;Nm?CUnG`O~n!Qj}^~99j5)X;=y2D6$FGo7si%`KJi6H-FHr2b8mO$ zgdt|=G~`wOzQOklgORm}7H7km{lksd96oMipG73?1-y^VvwazV1i1c8{pZcuhO-%K zJ*%H^W$8)E9fxQ&1=zvx75@iHM;lw#b9jQgFM30;_*nMnkE^lWktJ8hGSGvmisXFk z?_9&=iM`414I4c)9iguB=%3jGofduOB4}VoL$AR`n0eSF&-!#fbkA9nRfT;z)e8n+ zH-3Kn{K>p5m2<X}*UmzPmVVTO>@4nrAJs%<HX{Fr>jCjRC}^GXrhF}{=~s*Oz)Tul z#kQu#_neeOlhXiZ$J&q{*<#%%60j7dRm~4FJtutKXmZw6$zZ2UI}*jY;A(%!_68F| z0U@<#mR1@q^VDgTBWbu)#3`Ggnl2K$S5v`9A<xIz(wh_j1^fX7n9_5$rx7z+q+w}1 zI_4nV(vO6Rx=7oHU5lP@!NlI*F_9Fxf=$gWn}7U`(ZjRbEx%`gNY>_ivBf?7IrYx| zTP<3ixgNoRL*qHjgvxIAVvF_gk{bh-6|3JUmLwJ?D!sJw?eVzOw>LU(vpimHy_@5i zm%I=dCmG=!PFP8*A|UVvsDIO^dx~fQhhX7yc=b1JdBZsm?;e(T8K2~m#(kp`7DT7e z3`SSHo~g6Cy4WNtGRV!Ro?VEE<PY43{c<gmvs-H17c*qkcxXJ~MRa-FPFgr?L1tF7 zY&v1C{#|jUK_%5P-dLOkCFw=~xL5SW3Kg7_jt-L-Ssm6w^c~NK3k72|h9avyd|B~t zxy+0w&AF?33&YdNhc<932^Y)JJdVl%?<D`t6glYeT$lJW4_g$FE<tzQc^9r&>V(f# zg5}3<prbN*%zxbre$^n0wjz1)3<x}7iy^F2Qrc@v%zp~;{NL{@59m~E48)amJjK}O z#7OpIU7-M1$!ejZ?%yjE!OK44*}j$bH(W0)!VU?Xje8B0j0ZApZ}B8y$ExDd=epiH zmCZ^Xwa`!*t2kvG_j>yd`r{|F6X!->NZA>cDL~B1YvU66&Q~t{v5cr!{)tc=d>B_= zjiCgU<l6ZRZu&MvAQ?1vXzv=8w>?2u=Xo#X8BoeX{gJTB<)J9C<o&AdM_W@4_b<jz z4xqHGfAdm_Fn(AkguQIzPQQ0WLlds$XWpEuG3SQA8ldZQ$@^p4c#9vdDB(_g>2Vu# zfnKXP*S;4Q2KG!7mK|&TM;8ay;+rZ{A}uq|%<5lI{<lH+KeEThngv5g>2s`}#buVx z0nhwc_i^}7Gz&5|ZWSc_`JlzG<cXbVtCC3-Xw0dp9)o%xZh*coh#;XC`|#0Gkl~L5 z%}OP$i%7>#t*|Ena`DI<=AwUULT-WNmd4k`X8zMW72w`wSf&jA-Au_ygvgH|*47i& z0>M{lh}Bl#f@)#XR~C0WMW!gW)L{Abn<>N(=<&P(1aow6^1VF-bLHIwBj9;0DLG?| z%A~be`)$xcvj&5qbAg<o&i2``_|}_v%gESS=8sfF&}m3ZXquEP+%*^6Nn)a&LDRT< z$_=~YLmjv*(QUmfC)qj13H_DKJdF!B4dp#DO6LI|g{x6tag`P(!mn#ON-}@GDTSY} zLitvF3fy`Ae+<-rpB!b@doz=x2a|YG?!t6t$R?LZFJMMn3HkXeKq<emJXc>Ye<yME z(e6|wLye`fP&=u&u~f;Uhh^%kq1p#ID;`6~-_;#wp%%)!2GC28Y7pH+woEgS;%A=G z2tvEc_NIa3hfJ-#ll(vw(sA|~z>2*kTQalOHZ<Fe@?@?g^Y!SetbmlCYO+3pVIn8c zrQ*MJ%wDn(SC&h8nCeNMJC@*+h1+*_UcUYK0NXM=xG<2YR*yHl-L=$=w6NDf90`t* z0>JkVwj;iCVU-G7yr`tQrxUrC0%mn0*%krRRch~JR&U_FQXPXV@T#R)!(DoEQD?kY z)-z)cr9MDzaXJ8YYU$StrU>rT!}+FP|7oQ7b^_`*h+}nIGbMqb^>1+6GR!1WBqX$& zb4__W!trxt)|1xK03ZdI-FD?O&+%$la=T&8XJqGB0C@}LRA5ND2HDgPS=()Bsu=f0 z%(=n+i?f^`at@SoqmujSv#Se!tPr8LYl;ST`c?GRRBAK@TelGG%3WP*u17jOogKa! zzFdWAIL_H$yBd*vlm2C;ZJ{b`tkvHD`^yQOs~i5q@~3WRL4M@le9wlSq9T2r^^m%A zE@KDl5qhBw;Xh@uS{Uw6MOyr50fQF*^+ztM1>YQkDj<bV2n;(LZXYN;M_H5pduIGY zV4QqK`IOJQ`Gy;mTk+uMAw|6%h!f8fuhS1Vs|Un12hH#Pl#xZ&d`T0qFq5n-m$Y;e zFrtbB0Rqn~1*(rpaXM;?%^_ZQFU(Q_;NE$rp*eLRq)aiRjvzYPiHP!px{=8`2(Puj z`Q%o%unq`6Q#MR)Z1Vs=)rqd10qvI2Xn0M`gUzYruHf;Pxa`kD*-a^)DHMY<W5U)A zRz&Yb#3q+Qx*#qfpCZn49p3hJ$q^2&aQtEaM~{)&+#<-u^FdnrLnRE&Bw4p_Jwa4d z;G--3hT!GxUr%O*!w1Kf<6VvmjER<p78<#k=Xw|uhhPej%2z(dF1#&)+4Z7pca2fA zekuZP(TCF$!f+4kjE5KP<14y&RK~CK1V*q(bg}l`;Gokv?!Q^LHciE+%%`3Kx_`MX zQFd;yQX=~uRu0)0{wzRK$<y%eE;a^CUyx5TSM9Jm_jKb+AVlTRU6Uj=d9!5Il}>7; z*fZP#Y!y5myW9iGn&|7j^f2z+Y032d_fKa8{)&H4q$f8zzfjjD!xM19vKK<Ho4qql zk^FuQ_xazS*uUpRC5bFE<yqN(LQM%WjIoH!rm$PZ`5#qeLme2UACN)F48LB^)_m~y z{=QvOLfW`ZDK=%>9ds*$oOkiHlz0cz!%o}vkC8;-2ZQlqjhtyS4Gt%nyyqu+r72RZ z>uZGQS&i=zdr^Mh78ml<#vHAo_Hift1bOR&BmT=~Kohy+B*8%sMhsy}EKitGxUinz z-^cEr*tu^Iv{fKNA&lSS3=NT7tV}aY+JF(US;N#R6o+*Dcu}*pp=DVfcq=688QuY( z#@`nefR8SG?Y(EPu2)yE-}1YHNk`5@Gq`cp{VY%I{W5qqn6TJvT8G~g>(c^hGYWL4 z7ei2DbrFkUtASh-oZ2?+Bu_%RRsF}`JUh~VNMge?KVl#p(WgE<;Yu8`F9Ke^_NJz< z_|)DSm)f+n3RW-=O$hhtF@96qyRul9^c|542*Eyc)*eDXvsQW+E|w@eUa+!+cB)Dp z?LazmV3N444-NH(_hQwGkB+NKI}{Z6qXO>r{9Kp4eO*B~=lbZY$`46&u5$ssW1;C% zfVFw)-e})JY?vIU?(LrF$Q2X0mGG^wPws7Y^4-fzrr7n*TZ-;qe?}b|GD5;3dz#MB z$E%Bu`lyyY5Q|pwb&Z-gx4p@IIBp_}`cYm@RT^tP?H~xL6Rnua+GObZO7x9hS@Nj^ zgo>FwE8W%qWw|!PO)lgl$cSr`_m3wg*rtIsJ8BtmX>LofFG*WlC{e8DAWz3Fh>}T4 z@?-`<92bIpW!kyUcfZyvWY4=r*7s#tU+iFQ=ByskdYv~n=3%Q{WuK`Q(ubL~*k)D5 zQuf8v!>125+T(`Jec05ji=*X#^A$|uOF`<LSxgP>h9{bxFEN3;KO)u6Gy#im`FQRv zT|r^ASP{qR;{}Wn6C{|KbHs7|ez()*J*TQ(hy?B7q8ujnYzRCaj+2|qqbHYgrYBUp zdxt3aYbD_d`x;XEfAi&COaI{|FzDVcV&|Y(_3pz>bGexxYhQv>1z4EZ&T86AQU}}V z{^E&qFcF?ab#y+|78m0S6<^3WcS=RDM__~IXSIOV)(EB&$z_%AnRc*U)&PRA7#Zvt zng$0#*d7$21!>vsFSQ0zy}%+T!OT#!Zls%)frv(b?1_><$YsG+D!mb%zc^}NQ)xlY z_Au}7qFANNYK?fRQ}aBhQm9Ix5Y^YYc5hfqJVTvnc5vz`nZ=v&DUWW@<)3HXi<>o* z7cmy#J9(WY5d2qc*QT#Uc}b4I1IZU@7Wbe)WqP&pU%vr<`>4En$Sj_49^{^FlOhg1 zDg};duaN@tTJt>J#C-eH@yU5LOr&FiwMM_@B591M{o&1zP7UHI>}yM8h+bs1coVa^ z3<ei1x^T~f_y**X*@T)5lZnWz>4l-^nezkC;j_APQ%%eX7CJ!{f(es$H?7jBQm^tc z@o5v}Y9+5QvwNDu`|^WX2GI*)&J06iEJ9={*-v@julr}f;+4r~N>c|_D~=a04ooe! z>_`@tOn%~uKhY#w&`yjB%}#o#?LC|16lVu_gZ#((DvDNGRj8SOu&V|yy9&gT<m#xf zHx*O4!Of1Ir)+~;q_kzF2stOW3D7*8du2-q8RbdwU;eZ>YWJ0^rp?A<C%v?s4s<p> zn;Z(~TOHYMNDgR9ija9iGJ5vWOHm!%hc!R&{*x#{H;Z)qRV@Dxz41RjkJodzuSUgO zW#bcXC*SLhF2+u2mMNp-i|kKGgKS+8K9i_ah^Wtb9)3h4Z76U&GszM$#Do)>2bc4) ziSOPllXH@ilAKK|fSMMUrOZmSic8PS#!E>yOJ*#;@Yu?Wbkrg*)X`u0jBOtTK~LE; z$eTZt^~aj|wKxziy|YMmL{g3uq5&_hD;4#jl{yXAaVkl#H-9eQ-j9gj3@xrOH=57t zY=00|sL$tyL-`xWUJ8oFX0B3TPgeGl2unRM;J~K51y6md=sO=5Hf{*q{spC?tlv#8 zwF1$YfP`;*)AoC?zxi}1A0+6MirT*0s(hm+zeyntTpx_q%ER0Wrwdx@3^O;7p_@#$ zdOyuFS(j29vc3_z?|Hiiv*8wXuc)cjUn8W{|KI}#>*?ii1iEmvDGjRaSrz9BhPE_F zhQ!b{LtmmPWu<T)R9Vu)cH`aq+&RGr{GX3Tss%`=Brz^D5THil#o<q{6E5%&vr-jK zw^$DY&PEqr?XmOnS0_9-l>jGR1E*@rm1L4nc^xU|>ba+$5O^+bnt~RFtA&IMSZJQk z@%ckOxV?_LP233+g=c=sahx3DOwde=P3#<oZ5u!TDI~3FQ52$c@GAR(0S|nPuFS$E zK4G)Ft~m=m?2>b>ysEErX=|7ky3mqrSSYG<J+3$k$;cD`mZ0Gc?=Q}@{f6*V%F$bq zb&M~~tL@IoioBU%qMC9SV17K!{ZOS>s4KVKJ9n#4@P00zrBAen9^n0>St=_T&6py! z%cwlo=)txX*DWtB!pY{7;x4hyKE43waj`=hG#V7LIPeXG{L~HYcs;%1W8sy|<ve{R z9e_u?wso~UWtY_hi{XB5x(i(I3!JJIq%E}$qVeETn1AxE+BGkH6-bYNgM5Av^8fJm z-ce0$@49eg;}%2_0i#l+2%$zg(t=1)AOWNWl0ewfNhnGY2}MQe(jh=-QUX!}LI_9~ z0g+w;p$RBR2N4oL5Ir~hoO`}+|L!-=7-x)c+%x~knk$)^Yt6alT5HbtectEE6E{ux zEmek~%b<|g!vu^`>?EcJ)-3X^#X`)~q;z`wZG}E$GW>V8EY$J^>3G&Mnz))7PF9Zt zezHj|X@>Wed%lnGx+7cok;!&HElV@1q;eVHN2bzZ;-w?F&qEz8*jd=bfI64uP=O?Y z9UtT9Mt6N}SBnkNtTJx$MQc;pskEzB)`a~eLnFu7h>W`>54+m>;l!*MQ5Tan2kG<| zQZtR|O?`^FZW1!J=Z!CR=-&2r9Ow>~n@MDUfmq9Qv=xpnL&+9Zb|9(|tl><`yfiAi zONIGI|4jVAMM+T$&a?-fP*H@Xs0HAuB-<ZE@xtyhvCjCSrf6S}oW)NV2d0e8SUSE# zIEnR{_$h#YzB?IXB)??4^ZAlXf7hOj_Wc?Kq6|3vwlF)3@#$Ikzyy!V;&xf7Otj;~ zz+*z$oZi=QJ(M$iINIMt&4u<ZN$iz9#dFYH34LRR;QKZbY}XT0o;$8>qOVeK;Q1p; zpBicJ$*f8QGeNk|!#tacM~?6L>h2B4yr2UAx=tc5+G&)p7a>@m{ugr!z?qF#|M=<D zQ2;f(E6Fg!AkRo*U2z+z630*b3g33py$q75s)4O|*crtl1_ag=GNok8CF^kJGv;G3 zqEaJ@D+KZNMe%YO28oMk!!PfAt62Gg|CN6ITv)!`htjGXGq1t*hsa%c$*1`fc5e74 zhP3hZCWKAe&d|{IMlM*R^|_E)-G^Z8<DUVYn#ji`8G9tBl(DR@*7cCjDKV^-^$j3F z47fnbKZXf<Hq$4gRO9)nlShY)iu?0#z2@`ouRVC2i~C{fqj$EIL##LnfKX+HN(BHJ z2yy19FpiA?-lwB1(TNpNV;U!k#-!h>du;{IQ(OQ9m(Ek!r`(0IFdkOpu2%pK1;M{r z?*1ne6F!jX64fd*!#ap)NMDW9sO9RjwW8h>#mwGl{?HmK+H`}88a2sW&2tYI3Z&~i zJIn6LYsopeTWyoigm>4ko%}jj=R0ZjTwVV#dm|1Eo}V^fI|A2B@R8fj`@i2={`n+h zc}$-x$R@vnCv{{Ua_bTu@G32OrCQr>q}^z-^;}Rwi^|dA)`^)z@rN-{*@nSM-d2d8 znF7#C)Gp#mTEtbdp?JPh*5w`=h1NmXPp?c_EAx=iP^ltBOTJfbWI<|ieHpv`ak(y0 zYZh&cd<d-X9Q|>y<r`hIkVJ2-su=&iy&%B?G`5Um5nnUc7d6ZA2}@}Fv2xgs3P{HR zZ8yfhaEYJRd+Bp)V)?=LR_HD6x!q^ZTsi`h#jlGzmVLDFl^nx<IXE8`psBzM!wA02 z+F6caMiBDAE!aV8{HZ!XoNEb0edI?EYogz5c)jOP{^1%A2aB<WNkmBC%2D&z`mmep zLGMmSC!du}x2~It{o-ZUT)#(klRTY#8o)wP(U%?0VEjAA{(thy|MOTp=+yZ{LM!)n z?lteInR=C8`bCp09!K}7%nG;ps@OG$JV|n8vLO;xe}j<B-I+`Om7W%RImRo8QuovK zXV;AR%ooyHkiWwE$K`KpkXtg^zXXA8J|(Et`-IOu4))q%92JGsRE^0}je9-S@5AI6 zy;uYWYOvk7Gs~gflkdR6K<6idk}>j2O!Gv+1od2$nakSalE&@TsN!9}@!3SVBIWG8 ziwljV`S0jITTAlpMx2<f4^k@OahSP{FL{lghetSwRv=+)tuI2uuWa%fd^j(!v!ZL~ z`|4+>(E__;!IoHcMhE{q^$bde=jy|W)hBWXbTf_a*%EAt;(S7#tihbRSSF?Vme1PJ zTS5T+CgVJc@+Izh^X0@QW*7%`$+k1OZ|iQp*eZva;?mFcE4?h!sWyZBs(HS&hJ2U! zE9=#oOuT22AZO0eRw$5WneE(fd|0v3poT>at@(Y&FlR5?6SRtzi-@a87hdoB9_vmm zH)9-MEl7I5TmC0AFvvmNXk(;5K`Ut%L#CozFI7BVvAlvZH_)%isj(#$C#V1D^H{;$ z9-n91A(d*4P`m{Z^j<3}G1mrd?Ci1D$!COfe0UuGDm+%WFdX=o5kkNCo%#iH?ulov zwXew+yEi|)`;TjWR`@@*|Ni;vzqj*`fBf(4tG~CBfbgfBe+PxwQmj~?%EqxhlhRKK z=?cgy(U74cJ$fv$H%so|#L}&dS)un`zt@^m*|}>`y4HfS=_Z&$1iR>c!SjMrtyOjm z6XcABy*?DfPKk`+URNz<!;ha*DdZa<pNsM2qPVY7`UTY)%~HZ_QcrNiit{ct?(0$j z;}_9{?{J!o@;xKd$kDPAH3iR?bzqj;(q|CjiLFk=Byz~ca)pis7H-_{fuZwX1V7*J zHy*XH`-bEKS&6Zqnc+5Y;ox&)s>noj&Tuw4%ZgMEx_=^Akg8|uTpeWXzKuF_@=0G5 z4u5K8DCnBLm(bu$!`YvgCH*<|iF{}OO@b2mwSJ+_O`Q7o#$(otVlUWHyy<*67c(%w z0tk7RCrosu(P2_!6Ejme^!P1}=)xVj@^;asjN1^{4Rj11&!pD-S3F)6i$Ax8&4-5M zp6)DtJ;`Y-H#{w1B0c>kC0Wop<zq^(bA242HTklfF*y*W5X^%b1>PNFR0JoppKluG zaFI5KW0zj(N3q;{42br1(h)`fagP(m%<;ybze%ox69R|a6<jZ%11!X#i_*xKnYzoK zU6T~HENUS$))TRLukGRBqnbJskv8wl7=M^cM|yhd7vyw@{95jnv8KA6yEHmzrjkIs zF-~n2C2TEm4UNt;@RspQj~008;Oq06EZZ)^L?{2EYB0#CA=?P7>&C{oCB=!bL;rwo zYJ!)klz6(dz$?6RYFv@2-J2+ovGQyT;VPdCrpY);B)0eRiwc#5iN?sCxbBdmEPu1W z4(ia3p-OMv<U`_l^>sas{dgYz7k`YT<zlyXO83fwW_wn)X+ic=d6DYW$av+}s4xk$ ze8-G$Oy;4$mfyqRpK|fe<rRF~Ze^2sJKC9-HWSg0<u0o%=uwxuzkM!U+MlB1g5_i; zzCwJYK(vkH{?7K-^an>a`P(N!2W|eAR+&}>3SxJDxu&}TkH6J2UTVJ0FWalZ9br$Z zOUHW9)!J{XWaHm%^jHPdHTyQ22-Nu_)d~F0`{g_qTNGzf32{E7u(dp?6}YCfp>KxY zy)J_eX$>N8n-~t|G9+XgXC9N8Ah_PzmU>v1A_ax$$G%;UYvaspL>arxXP<;6dUa2q zrZ4_H*@}NNT?IBd|HW~1Y?7W?;zZSi=U9kogM$T2NrjZZ2yGH52+o~pLW$m_yNE@2 z<mF{4R%XpNn92&G?1&p(+L-kh=#wHFNw!oc$PE{gm#>}=nBqIhQIx@Nw`JgC(Rfgk zcho8{b}sFKFT55e2GsA;dl5s(0A0__14CRn^nryiuG<!ZgMR^Hm=n<Z$V=%!FT+I? z5O;}9_5R0@iLWUSUa<(>ce!zDYF-;P8m};yX*uc|)C6gyd*FU};l}Y32@?@_QJOO@ z-i!trsx&|()%TfO-l__H2^Qtb%0TAXZy(X=b!z_Z$W&w{<$g{taZoYuXu9?*-k3#? z{`0lIFz2blQxAdSwzZOlr*y@OjP5?;ifoZKK4rvy_W4~XF^c5;nUO$O&l3?FQ?E`# ze>xfPosXQbuC{Y7hK*HO3Tti!bdROqk0A=g)%d(=`4uu-p8IbA$l*q{{H%@Y=;zrM zx*<l>Fl$`{UM=W~^oQ-0*)hCB$0k;HOdX8b8i2<)6OkIUbTDm9cT1tJI)5gFTqJ&T zQ`t3GvQ*}gzL|-vBwQ*tL8BK#53F)22Ns4#Wn(W#OHNi&Q$^w^!o-%<A`rnS)UDR7 z2ko~QxcvOA%i9JcsCldUdbBGmDh~H&V2$g6Qoom><M;p*Kmw6hX2zqyu@G5mMpm(> z#91zUYBifH)30_4BT*hRmNhdtw0TMTL!D)2GipT7Jj{|7u!HACXSL-#cKy33ND^kw zGHwRT-kU5U(9+91`}I#Z%{+ZgQE-&782=b|F9Qbioyh%|)A*8X0k<wuka71!IY;oW z@Po!MU30YoxV8LS(EFb}U`@z@VXzSuSv*#bQ?K$>T*P_go}KyH!-Yfp^?TULsNak} z&t{XBM&odqm4KivTytQ_ayGB}ZB>SHKEU25MwHK-pzb&li(U@}ZOaIlXzFvN#omA2 z2;7wM#=?%uXDuPM${&`!*NN=Hr?gBdK4_<^zNw#XWJG^@kfLKHbX4F&t6T(8DH&5A z(ogBREco}k=RcFIA%OQD?`d|f)0tunL`(?O5Oh85fnge#xd9<OwGR=QULhmVTL4dJ zoKf(jExXYq<oN7+QTo<o{cynZ2;S4Y%^csI3o=3Cb%rJ?`;Ysl$fZ!*4=VlNKUXEK z$R26WRmg94=SmKI6V4PlXD<p!0?2mJq8%-CZjVY?k#9torZ2F-u9-XzEi@iR5Tq&; zC;5?`Ri-5=gpAb>Rn#JQO|OmDfXYByK(+0b$DC=4z0A1}k#F~ZetB)w#_Rg{$<5Ko z`bfv$X$|fL)>dS&YPFzE!K!@^O!g72#W%>GKGp9S5F3XHJrfi0<&b-;)hB-q;vj+l za;W6{%{7$U*T1y-u}^Y`3rW1PI=Ky=vlUw`v~XF4qWxI&%kMOaywvyKCXX*%{-bjT zq_JT0e*Krv<uv-QldWc_QvIAciK60Q=ZDbingR_&pKT^Zi_3l`2iA}O_@YtpyYlAK zwwp%G=4Ve<%*qu&<RtpGc87&#y;Tj9g{@Ax-WNUe$vsEO1D|~}AFE+O!@{@&HeDGT z2g7T(pda^|wE}w%`QuYq`dL~0-Hl%&q}&WD93&D1fst5Ovc(8YWB30p+;5if`1kC? zS{>UmBk^Y3qFVrITE(mU2NdXU0==gZFO^+yWIa*TU!<rsN=tu86BC>7LQ;<I$C+Fd z5wMSmEt5N6IjrK}2@LSMRDm1TJ8ajUB7Ln>J#yLBZ@n=qctU!XSTT5iA$xej@;S8~ zvo|p&JyRd7*kD-8S*KbL5)!@d3b{4+!z6YMUx0J<GN9ZT(y$Hi%bBlNg#_iyRrJob zdIqUd$}kf&Nqkq#bmf?7Jre5_wv%BfIxn{sG<5xXW(r8=_L*LvI~HTGWCdN1VF!!_ zseH8%ao#MM9jnj_x)LmR%Ou(vsQ|W@F2i1>8y(WK2dmo6U_bm<ECd^}cb-^(x9_>o z{%-S{I9<qrwC2)xADevR#x6!rsVc2Hm-F$1Mb?qj#bH7l*uz10ZDr{)C3nx~;(!Jj z;#yA$xibSA`f+u?!!+jQ&%aQFD=l<{DD^r-)d{OmU$->HIBNOBcvs1d2$p0>+balY z%v#9Sl^LyBE%Uj8zM^x3xj$L0c-^5++F!}0Ee+L&Mb!&{Ny7%!7G6}?w%?mL_4Vwk zP>t*?RAf~RXxV?L+L=L<aWgZOg(&{#{rLB`!O9}#T&@2dWM%)^b$iU>l@#(>ewj;m zIJhxD5xkLA63!{D=+(58KrVYyzus0dmq8XH;jhZKp4q3<XY%gcmbh&$ICL$Z*8pXm z9wf;$L|}E@#gHe~;7cIHX(-n?h5M|C{p$z>7lUoirqJ>cqkw17;Fqr7E|OuTnsxwE zuE0#>sRkzAh<m-FQi2gpy~q&S5K_q+oc#FXSCfN6yTZ8&6Du&hKv@?GqD4uG2$uRu ze%y=<_^>JP&BX7)Xb}_`&jJ4sSQR-_)4}7yJz#GzZV@M{PxnZxk06!}z~i(f8sFz$ zld18>+S0#Gxs3ly`~TS&XJ%|R-fb=q^gsm!`GCc=7WKy8rpq~`{pF1Q(fo6*jc>k8 z&=37_OCvZf#HIQtS(BU)b$czEGD(KYjDs7``x&8%92qurm8K%<I;c1me3wP5nvmJB z9feqhvl$@OKUmv*teN7YtXFMP{3zGX{*v9QN$J+tBaOFZT+_9>h^S6I!#?6H&pCq# zQPc=n;KT_n_jI~!s+Aq>GG}&!BTTn>#bVcL{8eGNxPIz+SYMOr^>A>};{>uE*aqUY z-2VFU?_rU3-_iB=*LI|DJf_wQ{GLFfJ)#SZ;?Leb=Ya<s%lR0i)<{@`-@ilJl}K;< zW!y!FOyce&q+lb6jzty<^xtMW|Ll~1<~8CQ>#(+#TJXw#(zR^HHHq>;_sJ*Pxexbf z#F@~Rkk}?vP~CdF1pSG*x0lMIcQr&S-_Me>Wms<@>ioC;hkrfnqtQyz7e^%A)XLm@ z5yi)Yc4GsTV|@LN-wa4nNW3T7s6v?Ac3Z43)hMPxB`k0tZL$JuTVk);NRhD^9Y?AD zO|whT5b<K?5tI`Z%M1r!^)Zy;9*{pBlgvG>vWm2O#Al>3HKUo(vRkI^A6H+VHEkNE zVWwOG)dQX>yi)f|WprP?m4BSxe4_S?C!=ea)^>IDP%d85-|xGS(nRiX$$|;SO`Ejt zb~!j}z2^y7qwPk8D!q}3LhTxO88W=uR`nIxpxl#27ifO^&%XIb{>*5*%d+#qQR_|Z zR)_rAAc21a6s;QY^+Rog!t6_nKAr5$f;3$Yf->!u1AWqluTL(XESOdcuCC((YnC>c z0n&U+5%t`rbq&<<mK_sKZ4_Z=`zxJ+!v&2CPRR6Ec!zA^9w&sw9t?X=AKP4=S>P|L zNe}u~WoGpu)d9S7eQG6GP3f4tsjl#?#ms3yQ{%CjSvG%#x@J&?TeX6Z&8)}b(YJ4| zxdiKJui>HlV*_f3xF51dzcj)U1l?}QnGd!yamIU9iD)f#deeS`aj<=u&;5?Y`Gem= zN2`<nY_;d6eoV-FnD)ejSE`nxti6AUb(1_UhF${M5x$SYV=>~&!;Zf1=|A&K+_N}S z&m_i43$cSQdDd8sK;K)9SMqa{Z~D>dlL;iNJLy9X@|*d^(8t-h=~ghZVz%Fhi7S99 z2Xwv~%WGWR54>guW8|O*v^GC2E;TWqbhT0;z4dTN)=4X6lWB~|T+6HRNEi>AGT&^f zO_4P+lAkln1fNfJo=SsCCzx=v;k#<tfvxF4u}se-U*LV`qT<vWb*g96QoVBKPTo8S z=)i{?5Dfl|hb&$xqs4$QSAj&wPh%@tVyN6Kit;3JuL2A8%|gkkK;Y6O$;xP*KgKO< zVR!0HDy$JJ*WxC7IJ0M|r{it}7ygmGI(ZiJOZr%<pn<UG{ycHSL8;)gaut5SFkSbo zg0wbkx59b?T4`f9h>0DWqwlOUotZW-%dT8@cmLudEx_(6l5+l<vE-Mi+(%!&<h5V$ zNN8JM#PN#THFJ+EsIH$?H5CxMDh@3KT{Army*t!4EJtKIQFCo=Xzd0+=Jxd4&ZV*% z7kysP`zJ8+9|IHs(1@F>kvdHnRI<0fM)-9aUk?!sYCDrg&Cl<Lsxv;t+PAI}*Rg{& zp$Z;`jLM@&9!I~cfWMiTyVX`~_R29Ws86N9LkwN4Z=D7k<Kflu02kAW>COX(*L*70 z=7q>zzb?nW{}njAvFEkzaBG{<_+dqfzEjq}!t?H@evP65(|T@|f*<9DTEP8z92*jj ztm|z1(fQ9udKoSCPMQM0(tS5va*MsU{OK2-ta$E(qthSI)bRSfimB&FMMF5W*HQdl zEGAh@MW(?f5q5-KyLR)fiR%lTrNsE>uE}d*N?)5!eyr5e=FZ5W1MjM^Yfsb^8>rkH zn)ICjNzG?p^_o1IZ@Y7H(jJ(FnQY`~T>8m3<&PPgyQAS+y8NX0=wEv4pF4+%xyNi+ zPwkvK^}v;;?@;~Gn~FJuWX3JI`f7)pDioR7hMcWEpD&{hFxq8>`Km^-{!PuC=0$(H z)vVe|Tf`F6AMCPE_coCDx?UE<j0m1zT3^;Yx{7)0IXSi$xf`%F*r@%@#?q*)m@(E$ zckcAMh<r1Xe$YSGVg@y)eQo75(Z0dtF8ib6T<$Kl$3DR{&u8>YN=EE>oZVhS2V?Sj zX{uRvDK+E*s_%E)hZ?9hi2ojvV-@T+ebV+@(IaZMpWHo5G4a(nT3KDdMpcCG|F~$6 znK!&+M;L=;p*;iozb(_2srYZpMsaVwHri#reK~M@|8xG<L`%!dYgWeZ2P#UORblH) zQ)pv|S$>sz)wmhuSlbhQxy<LhpmiPB%SdaNiwNzExsF>7;>sz_k@HWeX7co3o?q#Z zt9O-0d%~hlDOeiX)(Z>`YtO-!*N=B6<17lV5-i5nJBt<wrs&2^%%h(Csu_Hx|5!v0 zEqx&E>gEb+jJUob(Dd-w%*JT6(+=aInt3dz6(Fe9%wu+`)D=_%H9nZ}`%#k7Kb9Af zkduazXPm40eQkQZ<gyP)oSx^j9#UHqLI^Ugr-S7fOmw$xNHeuQEVFjn|LV-P-29UE zCjJ`4dnm#0bxxdyw5hevF#J<weOkzemb*=6x3ZdK#+u7%6s^0sFJ7k9>`>`pM0#Uy zgH)a0>=$DO!_KP!+0D1U>J2}PtglNLN}J0hsn9hCohMtFf(&c(SvZ$Vn~rcLN)x(r z+(d@9g8XHVzZQt4PYz#mRcm>qfnS$rii+({a>`{r_A0Etb7>ns<bkt7+8y&~$EsGA z-}Vk15bF`54o#(<VzLbb#7qp+jaZW^#`-=2B-dHpZJFz+Gls0(r-aY4a7*`1p9TmD z$DS2FD_r=3Nq8)5#8svvmMVQ)N34)wuLi||3yMU5$o?oBvx|kfGRu%M)8+@7bTgHY zg6zg)w3yHvS!ljaw#pY7AuD5X@?&au6At9p)<$3D^1ES<^h^`A7qaTBe2bB`(csI4 z2lUY_*aJtATCu=Pe_7;&7v#pQn|fINPSB%e$c;Mze*5!*uD6=^`Wd$}B?f+X*rbkr zq^c<_a2`CeB=?723pIYLy`^C^ba?Y_^szv6>>l0=<62t{wq{zb#(N4Q=w&5}-Ndmb zs}|+hgP6skN~R7H*kTZ7I6zff0iyUPd|oOUg8f(L?Y0HM7Fcqk>EtaN$Y_6dgUS@8 z4@oKSH~7SG?y|JLv5Y%-nXA+=!L%trhoUmzOH|PG)NCH-wYA2BYNHB;xm_H8PHxWK zz%%L-osYl;&<P4crP<`FO2S_zCp#9S*^@o8<3McLXt#Jkwanpg-Rk5(b`xREt2b+S zibAds6C?`ZY>3lLUpl+;{YwS+HuXl<qx5?p&rarF%XZkJ*HsT^XW0MFyD{vbG^&1l zb+jk=TD#`P=jP7MqqdB9Ul|xbMtwd0-q>Jgp;}8S3Ro4HmRNM*;X#{b*U8T7=W&(8 zrueDN2Z08|?cx*owwn!{4IE1z=Sbfh`fr$3z43_PpCqj;gl{bqu&yrR=k;@p+}E2= zi1oH%Pe@>YMztJS=GNU9hSra|4l;ZuqI?!E{ZaXLvSV$Wtt_mVX2}$4EM6F13~9%C z27Dqm%hq)*Gc<-}8gQ-Xj)|r1$@~O*Yqh{+vrNb@9_=UcTZy;!Lp<AtHHhTr-ioY< zQ5kMD(YtR-2w|I^`P_3>thh3l{jX#N@plT6s;=GNeR=iEdBLu<L4>q>_*8k@C<Lqu zC&(a`V;%Wp%76gx%-4mSx&~t|7WyQYBIl%lLZe6+FoKxHtzQff;_%P#KYD4%CL2&* z8(Pju7$mulo!j#QLvN&&Bv0P4fhtexX=lO*+b*rJ){SiJ<+}R{VVXu@MmV#Q;9p@F zMlPStd%RO#Bm{AEVA)xywNH+6k|7z95QXr;xMC<UGWV>ywcglQ3Y(FN{{)p!naEKX zSLj5VVZRML#iAqq;Zcb!OaVwjVl9d9fI7fS$!w>aCxyVSt*+7R9P8d$Uz{3H?YA^d z3S$fvB}xdGB526t*JF`5GxukzR(TgP5pfDW#n>BK4Mq9gN5PuE6x$K6;FKWP{tThJ zDyR`l@m!G@%XtL3rMsTt@0KSKvT0*xZqru+idhFch!2Mi=5?9ncGs;aCs^QP@6iT% zb$CMyjl{A6p#?R<;kWf;m~LZ$&NE@aX|WclyR)J2`ioO6Vi%=Y%UGWZ>m&hKQs#x6 z{$kV6iRMmXHNGvJWXQr~S_VjoFGBSkZ!;etOt*E6p&0l7Q;CuMc=&}({cv^wQzMQ2 zKPy3tWnylhfdT%d^u2#SBr>R~u7hn^fgLHKAuf8)P?hx*3+qz=Z^|yXAQ{VJA5-b^ zBAo@Jzp7to!T#sFzt4&_N)P7>pFvu5eXv5NA-iZ_GtK0al?&0aHC~teHiOyvD#Mv) zY3P5m#Knt9l!dt%lo?c-cpIhiL=&tt3M)|tcE|JY6)S|FvFKb-sW!Hz%*jYgc30^4 zD>!==>w;QM(-c%!C^8<#DoKX_e4YPG{{QrI`_vmt*8CMD)=BaRs3df?UUbBIAXY%( zTmv){;~CkKb6}uhnL<aIcOyO`Mur{A+tgw4BkN2mkMUe79G#mVNT&NQ`5hd!KN*_% zwhPl#Gv5C6;E|W59Ata8@8)7ad9svBK!iAxT3NEFmpz7Bz=xgmt|tU%T=p?HJu@uv z?D&%a&HhTf`p?PN-+$ebIXsyl6dI;y8m3?xBKUJtWRrzo`*$YGcK2%l^Oic+4^fYU zA!slD$<F%HQ^V`u(>D+i+~P9gubu%6Yvdcs<B8cQQJqsCne_DN25_kMe4zPSP`ku~ zP;SGgTw=8>fFuM!911iFA1SmlcnV+&NdC{J3$Q+YVbIm60pk}i1?L!&;>^IK=xUTz zy@7^Eb_cFoAq+oNf&_Md{4+n$_dSP#C@;XhfV<Z~VVNI0vy2MbNN-T!OQSj}e{3&Z zR@=W@3gKWbaG2aWw;uSNkV|+CRpkBreRJCKUDke7wQ%`&j>Hg^mQfC`2TAJmpPf8Z z7kQ^Pn_JesFKx$&WgGlKUBJJff7SX5JOlGua-@=ne;)1mXJH}p4@co?pu_34E>#Zk z7aVsWoT-tql8iq@{kF9&>vO!*w;xiAW4Fh0wcMcD)q`(Chjke(=LHo`rzS;)*e{KI z=lc^(;;lB(@+*H(4OvyqYm8(*@``vLjF5f|3$4}G1<qFwqw5hhK~aSs(WwH^D3Q`z z!MD&)__v2M$L2|^`?v-b*5@l?x)%*z`2F@FKkHtf-dbG!^@RPE<X00+0WY!^GeB)a zKb%bvB(0waLaMA0FN^^Gosn*(;N_ohRjI9vwkNB<bKU`JFy>xd`n_!1S8!DA!H~L{ zfwKSryua`zI@qnC>Y7>Q|LhR>*Q1@@{*GrDnGj`cY}M<?^>F20ren$xIpFdqt~+;* zh&o*-W;`P#pW@#=s339<-G0W74!!vS{j&OC&*?}zeZDHFq4%JQ>8buo|MWYd>XUzC zu+r@8Lf+i>b(~fl?tYZuuRHT_p#7ZO-9HB((^Z?v)z3n1ZH&Rod3cZ+0UfREis@9z z{R&F)v72aPW<cQYp8h3N^Q-oZt+zp1Laup<ol%;kBd@>--v<GQ;32fpZhiqo24m)V zTwQRq<-^a!QS4mMJ@MUSSE>%XrWrTCTEkdyvz%V?>S0x(=5&rPEDVgbgMN`$mTDnN zH9UM;PZrztQA<wza(ARcJh240pgXxrDyX?swz*rzAN%NmUP*4%y!Oo)#$!I`Va>^k z>MXx=;GIDqm=IBh>itL8&#U0Lb@v^Mi4=w>@=oCP$0O;N*$hYve^@D}3^{Fee{pHz zaeaX7$E;0_pmiS~B?Mi*j(!q03O3L!=!2LCc}0?kbMrz1Y&?-D1ajNM>j}1d`3EFM z#(hN)rO}X(5k4}Vxf_1}Ho~!1@(!_f?4h=3<<>;D<dS}z2_p2U&a1}>_U)15w%m~K zu}bYsizgy`a0Vc(!_M`Y3!uY$Mp!3}7w;!7Fwf`yuUGs3&mMEoGLvL@3TN6qRxSX5 zgXf+h3nv%q)L%!DaHQIODHSH@-<Gh?oFoIt#gg#b&iE+UMcD!wr5WMMeg$4b5sVWG zw%IS;AdOHJ7uGdllLV02x%;@qz-XfDpj-wf3E_WO%r&yslRj)nZqiTEkz>%*qRU+M zi8|@*T%h^11iXu@x*?JhxY13nTwDFJJ1>c+8L|KaWGBK6vj3#%iy3hh(+m(CbUqC? z&PTDMvJO6WjdnZ6vS)>FyE3gGoib89Wut@n38QYl7AF1-B67y4qR=k;s)zB!M&K&- zu9-4@!{_62r3b(`|1rjp^{^!4uBzPSzwF2G)yShYGK#k?)D2ly-|5(Q7@=vP#q^uK zDcpCwcbbpQ>Y4n7^x2g?Y2=ki8zWKp#0W*BEx{9p6UzOWm*9<s1mWh>1`V^ejgQu% ztx{QxqL5;BCYY&K?4-qXoSmhs2gJL#!lQ)mSOp7bhGc9kq-4!7=Q)ETNvD&=YiLm( z=mt->)*$ven+&9QDm3Yt%I8!bYjLkl<(0iy|J5%PQ?GlNYsyxyUa47#0VHGY>7{&C zc4yAB9KuUl*R`%+mGPetV}jM{nL6w$XEVCfK%|%kdzYNd*nUJz8Kzr>3>~0g&FSpG zaI9}r8^|_N96yv>K58Vo$X?;-WrI@6zK8~ky&}*u8=>fuEP}b04Q;{;nl}GQpABS= z#210M2o3((%JHfdL_7u_r*Ut<ny}?WwzN3HN05rrYCMvrGFL#-D7BS~s#5-`;5+!u zU}<FKib<{l8Vh&w17}|j$DX@EHGMwJkk>ppoKMod(r_Cc+t8EWrUd^;Si>`XDVtcZ z+;NU|qek&+bgFM_vJ+w(s=l2u+KX%WL~p%`tkZ1SvfebgP7&g$G2W-TZq3rf2JMU2 z`n+>wf_|=B$e@}*zeCGiZyqM{lhf8qWU-xxyR{zYh=hZSFih8_);Lq1!r#+(ZO2x( zqN=lwb^ZKrs|~AD0*119iu_vV9^l>Unn0Q~O^eFdnSD7k<7r}*#VE{Uxg;#BLkg?O zBR^PZ09`i5o+BtvS5hgSBk-@?CQ7~@18-`f&>jWvjMnt;2Yvf;j`%?u;iNScn`ioo zvT{9>>%}3dZk)Jf0e1|g_f_^l6&)vhAYKAJ<~@^lVe9jREHBsnxT5@wdOv-g3|)Vl ztPlf1(O(-gXe64AC&#zO!?WAi7TQB|%FN5agYa2Q$<4I3u#-_^LoEvLa22DzgD&5p zgY4sQO1?63YM=Z;_*!f9i!>hF6)s!ZW&)GNCmh5^UaTR;INCB<(fHs)V}IZB+8_FE zzZ2s(?5TP?jrGpD7iSSKjbxM>Pc(Zo&<UJ{M;Ao}l9-IcmN!P2s50S=J0>ba!&sGm zZL+a)1=ccG#>UWl2d9P$RbYKyTnG@mbqgo*+Fa-1mFF?Ne*)hDJgi=LhzNH)WzJWT zpomO@A722)BUXto>5ad95zm-~%QagiV*iZ%4)1cY0sD$fA6xdD0vV#;>!BYR%s_%4 zklkd6Y2bWj52+Q!zN#8!jg-ix#hIuN*7m5ROxY8xYt?erlHTa#*0};<WiOOP0}U-V zuAmZT>h8xWSnQJUS@k7$bze6sO|aAFOs=HsQO^df)TK%*eJI>Ql}bt!MX#t-$f!6c z;Tt?{G?2B(5<-WIRU6r^($?fC)+yEybHkwNYOF^E5&nAYwKEj!A)@PqG~!XLK`Jed z=@v(4^-Gq^R*1ZA1}@-X1+A!@6oR8#EzLF3^Fwh8sP7F@(vVod?fAImV|f(foSyk3 zFiCbyrqkm_Cf=k>bkflmMDEuG1z?eqh>5OcYZLj~XFm`t3M)a(AXZ1?fsE))#X%Q- z?y1^A?^3i=M$E(ME?*uE-{BVq?iv!l6P2+SHK<^`#Z~q#V^}Ie*2U$;Ytiqp0F}J3 zQFFdX1Gz__<s$8g5%%as5oEE6vRx_%Fmlxc1j>w1c<-woojT%D3NCqs4SwheUG^n_ z$wgx9QST?b3N8<{DwEqPO;wMG;&foLsf!~>`OPd(Nco_5cRtFXO-=37-{a?hCzh_K zfK%@z3unquDl85X`iPhc%s|G#Z8nRkB!D@U)p)?j9e?hH-f}C>)4a2rQEfb`Qb>nC z0=<=TueFtYua*Hg%kq?1K12d53)ku43?8p-=a=6>C8PV2%g&ZUFA`BfkCH<La!Z$G z9)S}%IvpJ@O%5qkgKfhB1>!eB4_9i$GKFK1&(>-b^aKTj_Y{_ji=*@uVvMHi;8gAE zR8wzS4=qVN$<d0UzzY=-2=7AN+v{FxTl@M&Vg3A^(&`>f>)TIwqw7Sxg2gC}>R}oM zdni+CU&SZAXBSq_N*6PUQB)Z@zHs4k_qNFNG4tK9)`)AlaAtg$y!0r{teIHpE9AEq z6sp;|jDB)s{@I@3r$dS<wmChOqxeQdAHw3GvlW-a9u_>ttc2%s_m*wIeD$*hkIAm1 zcGSn7RO(UQ#KBt!kG;pgPzI|rJ|Jclp)H5iXt&X?o*9Pd=Z&r!oUflWSia1MjC0@y zaaf-WCaWhLH2wHV%uY{aY}#vpGU$4G@5_xD$qfD4zw};-li672Yu8OeYY&C)_I6F) z;@S=U@qMK7>7R97sxRWqUjumA9R~<a^^p^&TU}dK4*O?+2}xY`JkjeqoQ{le0Zi51 zmaI?_erj9U=}tk-5LS@<>?Hoykm^iQ9!0(BD!YGiz^G^~>>~x`2PfghM{l&;g=&au za*KXQGoDd1QUrRgLE7<NUu#jTu16*zE)*5JCe_8-2|7eh^>_N$<FNA$Zt+3$gCV%9 zsM-eOJ{YNhl3|$naN=jaJi*ABHWa)JsSPcAy)u#qRVpf(lhB@jzKjdI)NY0k${Sbr z9@CgkmIQC4*NCSSFw)X^PKk246ubhP*mC9G=`+-jJ+gu7*s5BbgZQPE;3vNRZ2abH z?4a?JZbQ(MQLC+3P(RhGRY}o+E>nVf7I%6)Y>X-|W!2OvUEYuOLaD*)2E$|hKyZ8w zuC|_xx#fxTh*P*0$fwreK0#P58PkY~w+%{^D6SzzQ)E8R?$zV-FzGGzvF2_c_PV#$ z2em(?K&goD{l3<tdz;&N1oepebA7Wn1;IrcV1W-2fl=BU$3b<p5HBtF$TYf9waT1d zVO?1|8r>w~=tLnnNqA%LWUMGoj5X#%J!r2zSM|_Z(3StZ<(S)3-nG3^xADfx4Z2*$ z-Jh@Px)mi&N9lLVci@%JaF*-3-&K4iyru|M(BgL@A!3tdc+MGj0F3@5vV$&mK@||P zO}EV*dEnn2RC(e_d3v}?;cM;%%*dMTKa*k+y3tNUpP$D}jK0`l*bLVY)tV7y`!PMM z8~Y2DNI1iE-?q%tBc3m%LS=xeDpFc}ti})+YB<}I!^ok+g|u<_;dC|1>k3PVlOjIW z8H_BjasBqTBfci+z@15niaiI@O+iT4JAbv;`;v9pR;)G^gH>lm=0Lf>U<G@W-o6)U zdAu6ZU6}CKKN|cm*+U2Ztp_-*VC(&c>yg`Tx;~}V>46ywpH-J<)>jvQw0hl0{6qA| z;oE6fS!9#jWkFA(GI?#~Fy=;e1LWtH!!3s|%RN^w=)F8i)Xs^Q?pNKkt1F)Z#;TIm z;-_N`9_MPHr!|^*xRGLG37OQH>`>c~AO!)@80Rb5_^O;G<p|&PkhgOyX{-5s7}KES zLg0!Zrd)II`&gYXV^TuKGNuTsX8vdVGa03GF*TmJt4opo!wK1v0o$dIp|s*$gq!xb zN3jvqP1X(LS5RU>lI}KN3S}R9IjHiw`drtX%Em9BTcgKXm5Fx~`?Y;G{{{o*(rA>R zfC`+K>W`V8lKPxStNFtx3;O@kEC1NhXr^m(wy0ms&2L!72Dh2y-)bM(Yk&1%c^SeV z*pi{4L}!xcd!@&}RnS^+6B^jBL|p}&+>)4KLY&tzaI6jFTqBCDB9y~IOAb?+9cOZ- zrAg0`k8FP4bFBi{SQ1d?9FyXxMh0dZo3)TnH?7p-xyPpQ8A!^eqNypNX}0#_d$qE^ zxXzp>E$1x9R9`m#7@FKQsFE`7Y?4*9_zwA<#^6eZ2$|xVXnb8{o|&vG>-p(fOgYc{ zyfA!);~=R%G~|AtSHN=PLg&bmceb6{+<w<^3GsWumt#Z-eC>Bpf<VpY_T21p;)S&! ztq<8>d~q`hJ^2w^Uu;i?`hJ*XzlR5*A@BatCI8I+u_jl)yS;AT=GCBH_gRC<jMK29 z`Cz?vWvQX3ZaLv@)LP)tX5aCr(Dvt_yz<lTZ~nE^_iq53sFBtua#JmzT5eJu$HwdW z$3qtG(oU+XFCPAAt?u7@+iug|(_Gg&9JJ$kc74pxt>2RK3A7u7rt;ez<3eXL{eK)1 zSAt8gp`$t?Z{7*v{FOT?s7l{lId)CFK#UXA%CA}dg3}HO@af4Xn$G)S%!a*bQ`5to zX1JiOUtl@a)PRSG)vfJcW}w6Kb&a@35BdCdQ3t!n2m6Bm1`vc#2ezoSwN>{C@f-;M zqqTf9qg|=z^|o2;<wv<;k{z^&%ty&m)#rYWJ%*cXkUfXuuPTVYe&~H6jgCmFbv87H zg4nV^vL+TE#w<p84Gonb!lVr@>F(T%${kMM0yaT4+UXSB;Anha9`=~N<~3N+CMc#M zD^5oS=7idMd?1p`+8{V3`g&AGi3aNCO4AMbwTflGVMN*#)Q8EBZ(5_G%9$+x+|eAY zlXgXg8Lq>l9dO(E%^6`JXXELV^Wh&;4E03K6%u0NWlxpXEm5*<?u>_9t%zjaXHnWV zbj5-Kyx<<)-zz-X{1I=6=rwV5D|3DA7cbVzRGA=KN98+iAR^hzA7!DIUX}ePOHiLa z;sZPtV;yN!1h_DguT-Efay|7a?n>qhSgK7|SGsTpWI8eR(H<Sw)xb19{IU-O%{I>I zD=SGB#$RJIx}%fXucLKwkU{N$gz>!|n$KJQ8hEH>&&n?ex(*&2d_IwRn#)6&t3P71 zdm`^lk@oQU&_4*jFKs=182UC?B70)3%?+6xqxeQYL}bnP=|8T_KeK17iM`Pqj{F># z+w$SpC=;Ut-__9`9rr$LWrY^@4Mi8hiE`)H9f~xq+AUX(Lk??}T*oj@m2<XW$K{&X zT+XT_6GxG7U4yKPXH~F8i@!ouzRC?}mpp<W2<0BbdI^CEmp9t5b7~L>&c?LvNTy;K zWlg<c%9JltP=Ay_mcH@=%I<;1?yIzltN#jGqWlv2aM1Kkdk8wUyW8Aya>M5?GS|e< zugQ0A`)ib)9k(+Ai({zbG5+$@d9A$m++S57LZ+9fJDLpJ@!Kxwotu7ejGXpBk5h~1 z4P<Oq^UIG+1gZ&oBJ3EVa~7HC<r4IOc3!3cN@c3QZTapWSDzs+wKc?LEOac;alAhu z=ceeYN{oO;2ph?P?I7&Gj2eRYd^l)$*zj=GKgh?^(SJEC6}~-hA2gryNWDpPeWkC_ z4ei&^&$u8#WljR3vxBhd6a6Z3f!E@cUHtDe@x#QQJ2DOF>mLODsvEQvJY<41H%o`x zA#)$1jciNsjO8I@F#Lli`ZFW&t%g%AL?&W7@~#grun4TP|8D?}$*-D03^IWLPai+% zHj$;2;>_|I4@&OZfWm&*v}$k)=_wVZE@<Cf_&!{=yMcXCBgOr?Jz<DM)(C3;H^BAr z&Toqi3BP(`*7w><1@qcG*{G_!snnhdD0Zo3YSYZFG`iaV9&K@>cYC?Qvt-z-3e5Z) z$2h(E6<r}X2rgu~yT~w9_E3<OO@V2TB0TNt21(`i#5Tw^qmjNrM*=1}$@q$*+h`~! zXBc6#8%@z<f<hpP4iLT@jjq@{yY3m1=nCItHr4j-E5FtSQ%<OMf+Hc?B`<Zfx3HR> zSO9fxyfjKj(v?&DXM#v&)GuLrAq&8LEw|*+QroE));UJ4#fZUAQo8jYn}|y$LYn&) zd6~zTFL=QY-mR}5p0g`GQ}Br3c8m@bZIxMFI~qWJ@vdKSWs;_RvpZ?_^lE(YsN{oJ zW!-Av(Bf~V7HeG|Ui9TKVSZ*mcVK655*9bB+MjA>K74K2EO)7>EW^Z8bz(0U?bjCI zgQ&P!7^r@%-ddJk@&Ja*P$B7d!7fp<9%|lz&rv)~B{EStv{aaFWvjr!^c=CUHX&;+ zrWqfPh%UpFDMKu;uBZ%-0!24bw^ft*R1Bh^SR7eCk>X6fdOy*9h+NuJlskIoe&5}Y zzbK*<e<^Pva%K!le605UOq}cqLu@@pO04^rRD9&CBUSM`c;#q%N`t>3k6;C7Rxz|P zWk1x$%dik*@ikwbk|sM-r!*oc3K$FS@~@@oB4^a2ReDA3opv}3ep*x_r4eFBk?)`@ zBE>O)2UA%-aEpF!&KRTks^1c@iPscl)Ot>ni&F+UIJ?LK>%AY4lX!>MobypHaRIDJ zJII<Qm34n!&G}SvHIp{6(Pi?`wNkG-C!_Ktw-u<d0AERKRqFQlqZ%L`Ze$?hQYNWV zqT~3AVN8|?3>$2gwML~0%iTM&Zm}iSHu?4MEM>!HnNdQMiyp@dxzwZKiPZi>EK1|Z z-xqSVUDH1&+hn+bf3BaD^E3Z?cQcuOW2^jL7x87;pYOklngl&%xe()3WC4Qhm@@L} zJ+y%J1Q4a*d+(%FU3^=PpXeLfR=@4KLMjkbASM=fS3bIx$G5&J5-riU`M4%`o-1-R zqh2E{|Ej0--u@@j#!958i$AHPLSy7d?zuo>$pZ(7^vs+W5-V6Zj|9JpvB33<r_OeO z*9+Qt4~FoeJewJJM_0V9^P_weG77Sontke0dx0G&Ri<MO6njeE=+BD-l1U+*E1*^; zC+2I*p!)YHr_(pdqx}>9k7qUL!5L=?=8xth(I=mTT+!F3J3rEYa;`4qFEO&9g$SeP zoTbvW_)$m3ER%(KxPA4cv-5Z?qc#R?|8l43>v2eRpbW^Ur0r3Gdznfb$(^>(OS)9; zVDPm)_0iWad(DobY<Nx(CHR8h@=?3Q8t$9d>vdF{LqqSQ2dd*P<xEo>_edW>_&GdE zb5JE@piE!9Vic!sUDlsRhYV_|Hb&yHRf(62Mtye*qFnmCh`7bElXf)Xr{kK7zn^1Z z5O0&ZaJ>~NNke>}oP>W7!(3NsfW<CeoaeqTHf_X?v3h@3aV@g4R|G;1;g>hMS7wwJ z$3laH)FbMQs=S8wCRA;Zndy9yQxrU`?NWWO{xwCN%?_Y(pZ+VIWO?#g+4u0l7~!X^ z$%@vXPevlF?`LGaUi#O<;Uhn-={Cr6<Ds@-rZ!;SsExS`X&U&FJN)u-%Ns-#Qc!-= zn#%0~JtQXH&8ll&L=6vFpAI0|Z_pXH^J?I`-5;Cay+CJUIl-H^?=9QQzmkN>0w*4& zrG|(suNx_5czKJn8Ulnb6>0MDz(m3Gk~A!BjRgP%B^rxBZ&sm^y()zJo&D^g^zMG| zR9K2*sML_l=p~6Tk8<saRM?kH6!qoG7MUrtWDPfq3y!JaS=FQ;U6yljstOLs8BIm= zgN*<zaT2yktjzhx3vPWb;oAV6r>BGg=FXd3tYywdx~wUzT+CC@VfuU}YXhQLtZKzx zvFI?pyR2-?VyA(ob)vVWQM>@wr()ayHZB$&z**T`M?ktPUI)OeRp%57zz}fCAhlA5 zo0#$u@HfHi|ED&l^Y}k&s}T|F{?aAsnWqTKF=G8kjkmjtwap9FvqY}4{>S$Ku~Qhw zt!}GLbj~k-j*C14+V^y8KZ@N1W$j|gcI8OkVgMlNbXgqvk|hb}w?87QZzg|q`)t2( z(kFsjch#V8nY+a^005BZI9SL#Pw_2#kcPici!Quh`HBxtvdv~IKsZ`3fB!Gi|4Eeo zVM<y*PF6^McQ16zhjSh@Mn=}o3t8wYcjmq#Wxec7>xosXdvIHMutHi8lQmt}G`=ni ziwP2uavb$_Gxb^5nlHIy&v#|-P?@fQ^4%4@pjF=%v*OSP5e%U=$9sEn7mBf^$d+*} z>gxB|mVcVHkeCSBDcCA|nRS$Bz8$1Z>bV5gW*=?P>uFEHT}fr*3V6{eCG*e{>l~y1 zx^O^R3?78N(>AyqD&*zEU$DLV;Ac>XU#V6CdPli)1QC%GaT`-?+~LKVZSg5Bjg-Zm zES7d!FD7;B%k-LErhiye#@=%CJ3!?#c@9zb(>2oEWL9pdqfVKqwJ_l0f6+z%*S^Mi zNdv@m4e%KKRJQb(i;2#DH{B~tiwy)X_U&V<uR^)l#M*Y3%UF$JJe*7+1)Knj{?UzN z|2lvFs+ZPmi+;Y_9k_X;{`Juz#lSqj(1#i=3r*yspo^mHdOUYCia0piGD;J6%#=iX z#hyo9?|(GgKvZ5wN&3H26jNNE_(=8KZ<TR?l(F1*)HebpcM~(MT{2hHnp>8dC2#iE zFtq|S6r7*02#E4}LM;W-MY(PZ$8hl2T<4yo=PJ`%*Edg^{3l9qb1IU34nq$ZnkPpT z2<H|2gCvAi%mX$Ru)uu}2q@tD1&64F83oV%VY#t`A!9T7=*areLPPyDV);_Ti>1w< zz&r=&ba(FMWFYu_v_3`d1sQoU%nv%>esf4W4@PQ@8s1>cV_w&?my}6*xEUwjGLu*h zz6PPrE#UI6D;Mjha>d8^^WFzn3~ycw9?ezxB^2i!{$}^%Jr<*v^XMU);X`L?T=CYI z@3-_~oOdx$UHv3;=cI(u=M<^ZCo)N`79Yc-Mg4-BrI<@!U-aw+@sa;)7yQ3bG2fhB z;}3sL!|agHt4(kpe|k68C<kcK88|~4>H>ae?Mk&U0UB!B8bf6~f~tc(RgcwdD)PW? z7kc&sAr6|;zY<@p1VIw`+Gv;a*Y>YPrKb1J25MT(@2|vHD!!+y)}h4aTW|R!^$k{j zrwhgYEEEw&h}P=bmro(;Zo$5^xHBHCx=^uUVTohAjE3bhd)0u?A3LjOC3-&NMAJ2c z8^1Sh2e(l3Hy*dYJnnTAZ85>DdGw!$wiu1}j|R6vWy0|D*0W!h(PmShwmS95=QSSo zq?3=1{YgCyv#Si7FDt8LmbO&Kecy%DA3G(UgM$jK4O#@JJ57P}3;jJE(}`idH&-87 z4*DKzX!=c7C1D%P7M4aztwIRejjqcJ)z$eKJ+sx*-DT4&_c|+LnX*u2R&8n3g`vL8 z7sap<h&+3`vN3y`KP-{c>-h6960tQiGb6k-Jv}c&o5z`jh1v{vXzYDrE}di%R!o>F z2d*h2WGU>#JK7W3Y#lBBN2qrdzx@<F=h|D<20Jftmx&f&1;~-et@GMfkSkSb$i^<k z0MiibUF3)Y;>E$ajVsMnGLyjLpxTEFcfSC5r_H=l<MBIy)g@5@HvLzHfEp?J&pPa< z39aX|BAfmjL*Tzzgyreq1z!ojk}PBs1^|Hf09}8)bFW2637WD}0E-^l6J<~U;B@x; z7sfik?`Qu|vLCC_@5hgOWtqDUWl^hIy+5_wfpAv{WCK~tyb*syb~vw#T_4h2VS03p z2Oqj<4eMQcr(s%UC$L{?!q0tMI3m8F=6sxF-_vmY=P`^*^=V>O!gEg)qR51MzZo}L zxwKpW&@oLkK&V8fd?d?A0i?P1wkyt}<7_~FMttyuo{+0NQx0ky--p6zFW9uH;Lmk; z5u%8D!c3MA3?mA16*Jd-r|X?$r^$R$!7+bT-5Rifac_hW853OY{B^yvr8wFpe! za<Nk;jQYTqWh^Et0<C$8Bw|}AGdx|ux-B4J%}x9F$#0I~1yk2_*>sKXOghyjrzg#E zxr^Hkxb>MNU6L2X#T8WfZ8M#z+aiaTxaD%qyJ~~7DoSS({XUc*JnFO7&l2U86|0ZC zX>IKTBwg}SWC5CzazXE9^he=FjsulS>ZV@$!e_Zrx^vpe2k<udKK6U5Tj88^L$Y<W zQEj*&Yf<IP-(U8Qep~PR?hfCa9$1>|G?$FI6aG@aSU39VZJpDXZs@TBSo*+l24m<w zh_sMTytG&5&F+e_jP}%LA&wY5&1*6pVmhKUb&K`Wb79Ads;dN%+D6m2t}m^3?-(Pj z2nuJVyM*N5cl$^u8&~Ft>YH#_(Q?;iCu*GaeH-$s2(|j%9z}o<TW-vY{jt6z6D+LK z*yy4xY!}yOrojEb=z7bjwt}v0n6^-$xVw8HPzX+e7Kb3kAy{#D_m<-B9$Fj<f#MD= z9^7dNQk(#xc#HPSeZTLs*0bKVzWwK%vu5_$Cvzq<XZE${+E%%EfhX|N5j1}`?MHzG zai1mjpHNh_fiwBo((Ht?U|0^=xeUSaNpRNCURk8@>d1RJ8d0Ru_Ldgp<XwBn2TvGH zCZVKkjhVE;)H4=baUNQ%LeQp#N+L>1WyXNu4004<*$BA_sA68jj@V}~O^7sAVKF}q zzZp3=ClVOk=(iWYpqdmoY`PEe5enicgo|I&Ad^}N<JeOj@dxZM$4v~3<L2Y#Ll95j zlUF*nKxVRlOYS<yink8%I)lt?u5Yb=P{E}~`wH&dk>cuAXcIt{H90R*r)=ELJdUL} z``b$APn28E<owI?*{MYUhj8}nr+JtkXJ$WsWLtSGiNB(mLjibqyO>m6hRdA*X<o4U zAm-goHPusU(6)%WxbL;=qyW$+a3B2i7G0m{U%JqlDQkVFwzdValbk^B;!^`xv^q-A zZAy#GjGGbg=$eQ5Qtnm?R}|X7xPP5hgJG|3q6y-N(?e~Q0kqXz3X_!CSJ4dw#TdFB z#cwe1v$M9wjhtr7pHQJRj7w)eprbfGFj?*Me^R7p*=fF#xOKNLp!G$_+=}2j`BCj& zoutUj(ejNAvM|GBa7i<046<T5b%@@4=B|V$6=lB~gZO=E_T#8tGWopJ88WWpu=zeN z-%1dsz%DBjq%N281e4Z?S=bT-$-Jc_)ImK%{*KnER0RE2C`V&$?dSw0nrMZKTDhJN zmy+uJHX(1E(8=^@He${VEm^c?31*d7n^hv4(55f=76BIN?WxIgTC8g5*VS;Smwvei zbE7e+q13Y<TxAtOndY`23?<8i$@Ilo4K6V`nQMCiVbt^Flbw?YLryD-bPA9HPqU$7 zUc9_^pa@ye`({N|kiym*=*fVnv!ax?C}*=BZ$&^M63yhruV51w?X+N;pvMJrHPGXn zjE`Ab+LUuvl&tPeyr~s!`P%U1axFsrjf}Q}kktaXxw3W$O?$-YY11H?I@N3|ufwHe z)x9j@Dv|hNqP)3-IDvbXlwa{nZiBJyVS1<zyBe2WZGl0eiu;5h^{hW@u}`c1%SxTa zXiHYs1cPQXG^}OL&Rz@SwlZ-@Zi3oj8CFQCdT8@SjT*PSPmuFnt^?52u#l&bE}fg# z%Ox|s8qHLUKXP(RBjX!F#&H50mzAaF5B6&)r#|p_aSW*@kdghY4%Hy{{aP9sDbi+= z+-=_BXlO<e$U7Ib0*5%YT9&020eZ4?^Y?|J2D4xi1BGh7#nw1oZ-%CN2<}Iz*K4E` zUQ!qT9s2(>{G-JvmH7*LQG=9mrZ;BZ(hX~xHcwAvvJDz%eS<--7CX<rs4}89*l8wI zS7;UBOQuOCjW7<$k4(T>GHmQMHS?W>ma3rVl5LQ*B){ud^L8_8pqk5MFz)n<V=~mb zsdkP{>6rfW%g!hWyNn1D$w}E(&y#t}HUZ1EzxanyGpn;A+DJ%lEJ|w-kLk(7fl<Zu zirCgedmBSem3xx_mXE&}a+~V#<rxZ7A^jtN)XzLy=9?HWx%M0;4s!{bp5s$VKaFu> zG6`p`Qf1f9RsdwDOUq(E$fYOz_2$*f4FXLjdkgs1HhP2?-p#&Q5>77Ill1;mXQ-t8 z!v>{Lpk3{brQ_jVeR5+|#1&Ne?dmbOeE@!;CA(BSJJhis3}Fg0_q|%DlTbf9KKWyP zCLPGovF&Hgpa3a$(*PaxTVo3s`M&{tec%mtkp?ZEHDA_82ZYNr(o&>qW58Ry({*Mi zl!%R)i!m|MSL%D*e#d+bDiY1kI-MpvVB24a!yt^lnW@WS!PxxbxE(Ty=KFQyD(rQL zP^{t1>S|@IJPcR~G8}lV^(BQsZ4|RL2{-W;p86KU$amFjKnB#8Mf|rYqb*Y*c3}5d zu%Ww2JY=84xB6A5O%wWCgdQw8aR8+(y6IE^Ioj0K7j6U{1QqeRTdVkHU+y<lh}tuR ziVIuERKS!SZENrBe_M!MT5wK7f1KTt7@(kY>98EtRO4s69mfGld3<KP{^}gPqLl!X z(*rFg`OLW`tCq^x>w4_f8!`)drs*rTas=sMD?x4$9i<7m@4E^13U$gae5$WLVkTh3 zFsH}nus+x&j$?QVk{lF5Ubo)(I(svO*@EmjgoEC<n7zpJV>KbGsibjI)p#PZkCc$6 zGr6UAZO<U%4z;h*eBQk9BM<0EF`p)s=A2QeUF_6l8Wz(hDG#HynLs&ejMht;Y!4l$ zv*D#II!!4C>+qgSw)U0>9T@BL*EKB%itJ1+e?|yQFDM2ibc`M0kJ!50e(mNLn}W6! z*JM?8vlOV7=af{JhtUEZ*^H5$gGh^HhCn2ea!)!v@S=9h>aXx}ORo%ip4}_N@|}-e zi)IJ+$(9NmUl>7)G;U6Rzd`?({zve9*gs~YW8<P#8+)9-3)h<%p|dqmD_f~XBuA#P z%V$`jw{T&SyA&m1IZT$d=*0tGzEsR)jwojJbEdF~!yB8|02T6x*iC4d?EP)dYAoTE zTd9xoLN(>{r3pf5OWsA2SrSnvN-TbtkQDI=r8zMK#HMhLhs*bR4Ep&^e?M9*e$l|d zN9x>^b;tL6=hm4ZuXU=YYL?{SA4ce&<4u>XZAHvyS1nPoK-8X@!S0^xK+}F5m#y=z zTeviO1U@wB7?E)<@osKSz5#M_$;^~-mAN^pzgXK!;gFxDu@y3SqU%>@VI0sH-87@E zcV$jJ*tFDvMA7J`nrx@otA{Rl|4&Q&zent^flS`==3<i-kvBd+TP0}&+HY>bz9Z6z zgl6BXi$C-fvyz;7Dv5(Tx@*-Hn#&{8b3Oh<Q0U~9x&L8^>=OCr#lf;J&tV9v+kIi0 z7i?JFB$$BL0LU)`Rq*AceRI&@SAdbto5*OXc8FYJ`CW})EZ0jmx7ajm52j{Y2@eYE zX!jHHsk4yO1UZ3u2Nx3LUo7U&k{0WHB4s)6a;P!Xs83j(&N|R*OEc-3mk4?#>FC52 z-B%3)Z_mx>%<8DBSnmfLenk{LcAr_oMRb2@@T$!l0Mz)+Y0Auhk2uf$8o21nC{PPQ ztbxHt0!o5|Kh2tqQA+Dcx!c`SAO7F=_@8SeYMQU~qhL))7ZLPkjQ(LQRN%0~{-6jr z73yaGXZ)n5=XLnn^eA8k)vYV##Yi>pxC{<lG1(33bPlw5o3S`PaeY%TO(sPo*DI~F zFL^nIo9k9AR&Fv~!X2T#WRqKO@|Dj#Z7_{nnT&QSF2}*Qrdr+DI9kB!tEfUjTRGqE zg)%~^79P7-Hp^?ti<N8ZrU0;Q5@JzaX`B#bMQ@>qSeh;{EYMHrbdvj{#4znIAiX%Q zJ9MQ3C`dxQGMJ2wX9p|VG%IRwtmiWbN7!pE?4&TTo9GCnB{r$nQy-o>FF(Xg2JRK* zd^wvxaA!Fe^Y@n?nCJIHxqk*mwE|2h0G1?n#USt3!T*14gx&YxPxRKbqPeZWIpjeG zc)ZcMKY*>706#lgf-m^Ip6a3t@UPscya+A&1Rs*0KNpdD-Px(;?SoEYR^++{tF8QU zc0HZr6~u(gq)a6MzZB2xGuyxQl_tXL+Z-QdY;(@;m2x)RU?2#jqrDV9y86vjKM@+v zw%Xpkp?kBTH5Hc7e;)R5`xx2-8a)_Dt|vZ3K_%spo|jSqtID!X%HdLdfkgwGw*jH6 z+9osG`#*PD`xGlD0yP;c+@vnMHjxZ6){T`UDLr}hTwNZ4jNXff-qb;BT;<z7WmnsK zEqgcHzhrj)r$?ZV&rHAyGM2cwoU9GAnB&^gH55=``B5Kemn2xxd0EC;PPmflgNsqb z1ZdipUOeCFR6c__JvAFEd9IE$gQ7TsM12G##=8{h&9C6oI3Y8GPGHM9D_t^l*dyH2 zDtf)w*CrF)0YCcHTOjB_qEesTkzg}l1C$xNU(-HcYtCn+?D@1G=yZ2hYw&~lAV*!f z_O;FU@SA2<wLC6dOxn!2x9qq5c%-{V*<()qaqMYac(^Kj9;1;UI~`7AXh0(lcG+&L zg0L$C>b%VRTDXB2Sqmh}Qz`JIHb#ybEI>7?S|pb$GSoECUaZQVX*3b$K}B9PLlS=u zXQmae`kY1p#0f!YpHZujJixQJ3sS)9r!gcanyCl+b5>mr%2>kcU!F$Mk>TR1Y%Nr< z=ACOP=Oi8sMJJk+^^coe{&k(P4=A45!HFSa;;~}QtBX`qt9Bv+{<e5_)gggun)%wA zcCc#3_<8?IxSo6bRRaiwsW4ilWX?hZpnmlsGelut7-dn|(<ha7ypO!tSPNm&-1FAa zsaSlU({FbF<$t}X|9y(i9B$Oml5GdyKPXVwt?0Te3YPwMwa>{Jmmno+XPnTf&;(BP z0e61}p@+1xTzANoEZ-F1+wT&d%6bNMsY87$JMR2N627R2CCN!Mg2ox=6zcH+x7nFf z|D*G3dqv=Fpy!?V<A?G3;@BIpw#js7XQQk2UN?~RO>(G%*Wn-!ftm{^Zl63zr}UYN z&TQK_{16?rc4_8Ex%-gJ#DB6mc=9W}Z4W%6o{VR)Qr4fY@nv^C*)DA|ctc=jdFs*R z@Kj!8eIHp`5qN9Au-%R6ZQjJ+lrVcGz_m0zk6$wsDs=Yw%T0_1I_#OK+i=P<&P5>u zxHJZZcaSYu_A$(kZ7<ySIj3HA7a3}X=KGGvs6Uv4_d{x>?h2*4f%V`2cWeFcb0VvA z=_(1opQXu1u$)?5+8bv~C0R|GjSKUQ{JStT*Y>9)@rRHHCMp{eyA}5Gra$}1v;GXw z{c?te`jCC-)!#p32Lqa|GrGCU>`9VtMDls4E!Qf*T;OAj?Am~{c}R^;Z@W=lfw_CN zH6T=K@MvtM8@mPe3Gp3G1dv;=8)L<W7iQKSRP7qA*?zR$lh}%ON7u>E3_wmU7LA}r z0;)CcCTNF|{>@SUZK3HOfA*}#uks6z?ud&%|LKvVEmZg8!)SM}g^#p^mH&C0nzvt_ zy%xt;lP`M*>GNh3?vQ)m(mKD!rG3$s)_PuK;KM(RxWl(%Bgfm(3-wL|L8110pmCu# z67~vCb_Np6iN#mOd_RQFv-CHO>hzlj^j<~J(@PW0UbNRrq6QtWEYS_+as>V?ifA+c zxm�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�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⋘T#PpSZXy8RFDW<9qwBzB@J<sTLW3#20aVjh3v@ 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Ó_w6_*@g3XM7f@=Q&B!7gskpBSwI7|!t4vaaw4$M;M z@sg}+2L}=-&K%-8E9)nfEI7qPTKdBL8iCGi>+HdEHHxRZmu{Q_21>AL!;Uy`Jm9#K zcs&z5Gut-??-7ue*rnX}F$hliMOwnbU2?h1Q!lR7RcG~i$fZwvx5#<cXlk05+r!o{ z#~{o8StGAo;ONP!PbZ8(Vr(`TjQ9{4{v2u+P-;S{^NQnRlYF-f(XsDKng*s2YojW6 zg!prwaCrVg=AC1`<8w?U<UVc`Q13Yp6NAd}ghdstQb9HZYkSDXqJ@>W4hLo)g7A}m zF!Ru^aZOGchs5q>fP~t)$S{>dD0tFq2-pTG5qiMf$v73n&UvPBJI?t26ImPy{29rJ z9AYu?fCiQGk4Cdxz?}*O34YAi+!E0SCe3&8;|I_Spml<?B`2o!h26pD(MMavXQ+0g zuALj&Ze`j~bw12Abcj7U7dc+=W(vr>=AB`QGEaZ_o4GgqAjYg9rzQp54+g&(qIm0C z#}{i2TXK`E0vb~WG`o8H`NqyAEd%~B@r(k;$NmnF{006FGlM#~xBmc1fs7NzY1S=Q z&O!eG{fQ3Wj9Jb&2APXejhetZJH+!07qdF$FrfI&Ua-(G6AE=L#60puK+0!iJiHh> zgR1W~JkBOD0h4(W1_8>l-d`V_Ve76Q{vcwza8>Ip3L&0yynAKII()oFL+rrp$dJ5} zd^O57hib2wbIwlW4H-ABp0WuRL8ObPDu@V^vllfmzyn5@XVcZjQ}MGbZ9Sx(z2xS4 zcr5S6T{vP@Mg%;lec}|uTIp2a°7lp!~)8yE-?$2TnClYBZ}u{%_`+J(#f`WXZy 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 TKk;*pmpR9u;p6`R`5*t;_Sq0i literal 0 HcmV?d00001 diff --git a/client/fluid-player/test/static/thumbnails.vtt b/client/fluid-player/test/static/thumbnails.vtt new file mode 100644 index 0000000..8b95e4c --- /dev/null +++ b/client/fluid-player/test/static/thumbnails.vtt @@ -0,0 +1,607 @@ +WEBVTT + +00:00:00.000 --> 00:00:00.500 +/static/thumbnails.jpg#xywh=0,0,200,84 + +00:00:00.500 --> 00:00:01.000 +/static/thumbnails.jpg#xywh=200,0,200,84 + +00:00:01.000 --> 00:00:01.500 +/static/thumbnails.jpg#xywh=400,0,200,84 + +00:00:01.500 --> 00:00:02.000 +/static/thumbnails.jpg#xywh=600,0,200,84 + +00:00:02.000 --> 00:00:02.500 +/static/thumbnails.jpg#xywh=800,0,200,84 + +00:00:02.500 --> 00:00:03.000 +/static/thumbnails.jpg#xywh=1000,0,200,84 + +00:00:03.000 --> 00:00:03.500 +/static/thumbnails.jpg#xywh=1200,0,200,84 + +00:00:03.500 --> 00:00:04.000 +/static/thumbnails.jpg#xywh=1400,0,200,84 + +00:00:04.000 --> 00:00:04.500 +/static/thumbnails.jpg#xywh=1600,0,200,84 + +00:00:04.500 --> 00:00:05.000 +/static/thumbnails.jpg#xywh=1800,0,200,84 + +00:00:05.000 --> 00:00:05.500 +/static/thumbnails.jpg#xywh=2000,0,200,84 + +00:00:05.500 --> 00:00:06.000 +/static/thumbnails.jpg#xywh=2200,0,200,84 + +00:00:06.000 --> 00:00:06.500 +/static/thumbnails.jpg#xywh=2400,0,200,84 + +00:00:06.500 --> 00:00:07.000 +/static/thumbnails.jpg#xywh=2600,0,200,84 + +00:00:07.000 --> 00:00:07.500 +/static/thumbnails.jpg#xywh=2800,0,200,84 + +00:00:07.500 --> 00:00:08.000 +/static/thumbnails.jpg#xywh=3000,0,200,84 + +00:00:08.000 --> 00:00:08.500 +/static/thumbnails.jpg#xywh=3200,0,200,84 + +00:00:08.500 --> 00:00:09.000 +/static/thumbnails.jpg#xywh=3400,0,200,84 + +00:00:09.000 --> 00:00:09.500 +/static/thumbnails.jpg#xywh=3600,0,200,84 + +00:00:09.500 --> 00:00:10.000 +/static/thumbnails.jpg#xywh=3800,0,200,84 + +00:00:10.000 --> 00:00:10.500 +/static/thumbnails.jpg#xywh=4000,0,200,84 + +00:00:10.500 --> 00:00:11.000 +/static/thumbnails.jpg#xywh=4200,0,200,84 + +00:00:11.000 --> 00:00:11.500 +/static/thumbnails.jpg#xywh=4400,0,200,84 + +00:00:11.500 --> 00:00:12.000 +/static/thumbnails.jpg#xywh=4600,0,200,84 + +00:00:12.000 --> 00:00:12.500 +/static/thumbnails.jpg#xywh=4800,0,200,84 + +00:00:12.500 --> 00:00:13.000 +/static/thumbnails.jpg#xywh=5000,0,200,84 + +00:00:13.000 --> 00:00:13.500 +/static/thumbnails.jpg#xywh=5200,0,200,84 + +00:00:13.500 --> 00:00:14.000 +/static/thumbnails.jpg#xywh=5400,0,200,84 + +00:00:14.000 --> 00:00:14.500 +/static/thumbnails.jpg#xywh=5600,0,200,84 + +00:00:14.500 --> 00:00:15.000 +/static/thumbnails.jpg#xywh=5800,0,200,84 + +00:00:15.000 --> 00:00:15.500 +/static/thumbnails.jpg#xywh=6000,0,200,84 + +00:00:15.500 --> 00:00:16.000 +/static/thumbnails.jpg#xywh=6200,0,200,84 + +00:00:16.000 --> 00:00:16.500 +/static/thumbnails.jpg#xywh=6400,0,200,84 + +00:00:16.500 --> 00:00:17.000 +/static/thumbnails.jpg#xywh=6600,0,200,84 + +00:00:17.000 --> 00:00:17.500 +/static/thumbnails.jpg#xywh=6800,0,200,84 + +00:00:17.500 --> 00:00:18.000 +/static/thumbnails.jpg#xywh=7000,0,200,84 + +00:00:18.000 --> 00:00:18.500 +/static/thumbnails.jpg#xywh=7200,0,200,84 + +00:00:18.500 --> 00:00:19.000 +/static/thumbnails.jpg#xywh=7400,0,200,84 + +00:00:19.000 --> 00:00:19.500 +/static/thumbnails.jpg#xywh=7600,0,200,84 + +00:00:19.500 --> 00:00:20.000 +/static/thumbnails.jpg#xywh=7800,0,200,84 + +00:00:20.000 --> 00:00:20.500 +/static/thumbnails.jpg#xywh=8000,0,200,84 + +00:00:20.500 --> 00:00:21.000 +/static/thumbnails.jpg#xywh=8200,0,200,84 + +00:00:21.000 --> 00:00:21.500 +/static/thumbnails.jpg#xywh=8400,0,200,84 + +00:00:21.500 --> 00:00:22.000 +/static/thumbnails.jpg#xywh=8600,0,200,84 + +00:00:22.000 --> 00:00:22.500 +/static/thumbnails.jpg#xywh=8800,0,200,84 + +00:00:22.500 --> 00:00:23.000 +/static/thumbnails.jpg#xywh=9000,0,200,84 + +00:00:23.000 --> 00:00:23.500 +/static/thumbnails.jpg#xywh=9200,0,200,84 + +00:00:23.500 --> 00:00:24.000 +/static/thumbnails.jpg#xywh=9400,0,200,84 + +00:00:24.000 --> 00:00:24.500 +/static/thumbnails.jpg#xywh=9600,0,200,84 + +00:00:24.500 --> 00:00:25.000 +/static/thumbnails.jpg#xywh=9800,0,200,84 + +00:00:25.000 --> 00:00:25.500 +/static/thumbnails.jpg#xywh=10000,0,200,84 + +00:00:25.500 --> 00:00:26.000 +/static/thumbnails.jpg#xywh=10200,0,200,84 + +00:00:26.000 --> 00:00:26.500 +/static/thumbnails.jpg#xywh=10400,0,200,84 + +00:00:26.500 --> 00:00:27.000 +/static/thumbnails.jpg#xywh=10600,0,200,84 + +00:00:27.000 --> 00:00:27.500 +/static/thumbnails.jpg#xywh=10800,0,200,84 + +00:00:27.500 --> 00:00:28.000 +/static/thumbnails.jpg#xywh=11000,0,200,84 + +00:00:28.000 --> 00:00:28.500 +/static/thumbnails.jpg#xywh=11200,0,200,84 + +00:00:28.500 --> 00:00:29.000 +/static/thumbnails.jpg#xywh=11400,0,200,84 + +00:00:29.000 --> 00:00:29.500 +/static/thumbnails.jpg#xywh=11600,0,200,84 + +00:00:29.500 --> 00:00:30.000 +/static/thumbnails.jpg#xywh=11800,0,200,84 + +00:00:30.000 --> 00:00:30.500 +/static/thumbnails.jpg#xywh=12000,0,200,84 + +00:00:30.500 --> 00:00:31.000 +/static/thumbnails.jpg#xywh=12200,0,200,84 + +00:00:31.000 --> 00:00:31.500 +/static/thumbnails.jpg#xywh=12400,0,200,84 + +00:00:31.500 --> 00:00:32.000 +/static/thumbnails.jpg#xywh=12600,0,200,84 + +00:00:32.000 --> 00:00:32.500 +/static/thumbnails.jpg#xywh=12800,0,200,84 + +00:00:32.500 --> 00:00:33.000 +/static/thumbnails.jpg#xywh=13000,0,200,84 + +00:00:33.000 --> 00:00:33.500 +/static/thumbnails.jpg#xywh=13200,0,200,84 + +00:00:33.500 --> 00:00:34.000 +/static/thumbnails.jpg#xywh=13400,0,200,84 + +00:00:34.000 --> 00:00:34.500 +/static/thumbnails.jpg#xywh=13600,0,200,84 + +00:00:34.500 --> 00:00:35.000 +/static/thumbnails.jpg#xywh=13800,0,200,84 + +00:00:35.000 --> 00:00:35.500 +/static/thumbnails.jpg#xywh=14000,0,200,84 + +00:00:35.500 --> 00:00:36.000 +/static/thumbnails.jpg#xywh=14200,0,200,84 + +00:00:36.000 --> 00:00:36.500 +/static/thumbnails.jpg#xywh=14400,0,200,84 + +00:00:36.500 --> 00:00:37.000 +/static/thumbnails.jpg#xywh=14600,0,200,84 + +00:00:37.000 --> 00:00:37.500 +/static/thumbnails.jpg#xywh=14800,0,200,84 + +00:00:37.500 --> 00:00:38.000 +/static/thumbnails.jpg#xywh=15000,0,200,84 + +00:00:38.000 --> 00:00:38.500 +/static/thumbnails.jpg#xywh=15200,0,200,84 + +00:00:38.500 --> 00:00:39.000 +/static/thumbnails.jpg#xywh=15400,0,200,84 + +00:00:39.000 --> 00:00:39.500 +/static/thumbnails.jpg#xywh=15600,0,200,84 + +00:00:39.500 --> 00:00:40.000 +/static/thumbnails.jpg#xywh=15800,0,200,84 + +00:00:40.000 --> 00:00:40.500 +/static/thumbnails.jpg#xywh=16000,0,200,84 + +00:00:40.500 --> 00:00:41.000 +/static/thumbnails.jpg#xywh=16200,0,200,84 + +00:00:41.000 --> 00:00:41.500 +/static/thumbnails.jpg#xywh=16400,0,200,84 + +00:00:41.500 --> 00:00:42.000 +/static/thumbnails.jpg#xywh=16600,0,200,84 + +00:00:42.000 --> 00:00:42.500 +/static/thumbnails.jpg#xywh=16800,0,200,84 + +00:00:42.500 --> 00:00:43.000 +/static/thumbnails.jpg#xywh=17000,0,200,84 + +00:00:43.000 --> 00:00:43.500 +/static/thumbnails.jpg#xywh=17200,0,200,84 + +00:00:43.500 --> 00:00:44.000 +/static/thumbnails.jpg#xywh=17400,0,200,84 + +00:00:44.000 --> 00:00:44.500 +/static/thumbnails.jpg#xywh=17600,0,200,84 + +00:00:44.500 --> 00:00:45.000 +/static/thumbnails.jpg#xywh=17800,0,200,84 + +00:00:45.000 --> 00:00:45.500 +/static/thumbnails.jpg#xywh=18000,0,200,84 + +00:00:45.500 --> 00:00:46.000 +/static/thumbnails.jpg#xywh=18200,0,200,84 + +00:00:46.000 --> 00:00:46.500 +/static/thumbnails.jpg#xywh=18400,0,200,84 + +00:00:46.500 --> 00:00:47.000 +/static/thumbnails.jpg#xywh=18600,0,200,84 + +00:00:47.000 --> 00:00:47.500 +/static/thumbnails.jpg#xywh=18800,0,200,84 + +00:00:47.500 --> 00:00:48.000 +/static/thumbnails.jpg#xywh=19000,0,200,84 + +00:00:48.000 --> 00:00:48.500 +/static/thumbnails.jpg#xywh=19200,0,200,84 + +00:00:48.500 --> 00:00:49.000 +/static/thumbnails.jpg#xywh=19400,0,200,84 + +00:00:49.000 --> 00:00:49.500 +/static/thumbnails.jpg#xywh=19600,0,200,84 + +00:00:49.500 --> 00:00:50.000 +/static/thumbnails.jpg#xywh=19800,0,200,84 + +00:00:50.000 --> 00:00:50.500 +/static/thumbnails.jpg#xywh=20000,0,200,84 + +00:00:50.500 --> 00:00:51.000 +/static/thumbnails.jpg#xywh=20200,0,200,84 + +00:00:51.000 --> 00:00:51.500 +/static/thumbnails.jpg#xywh=20400,0,200,84 + +00:00:51.500 --> 00:00:52.000 +/static/thumbnails.jpg#xywh=20600,0,200,84 + +00:00:52.000 --> 00:00:52.500 +/static/thumbnails.jpg#xywh=20800,0,200,84 + +00:00:52.500 --> 00:00:53.000 +/static/thumbnails.jpg#xywh=21000,0,200,84 + +00:00:53.000 --> 00:00:53.500 +/static/thumbnails.jpg#xywh=21200,0,200,84 + +00:00:53.500 --> 00:00:54.000 +/static/thumbnails.jpg#xywh=21400,0,200,84 + +00:00:54.000 --> 00:00:54.500 +/static/thumbnails.jpg#xywh=21600,0,200,84 + +00:00:54.500 --> 00:00:55.000 +/static/thumbnails.jpg#xywh=21800,0,200,84 + +00:00:55.000 --> 00:00:55.500 +/static/thumbnails.jpg#xywh=22000,0,200,84 + +00:00:55.500 --> 00:00:56.000 +/static/thumbnails.jpg#xywh=22200,0,200,84 + +00:00:56.000 --> 00:00:56.500 +/static/thumbnails.jpg#xywh=22400,0,200,84 + +00:00:56.500 --> 00:00:57.000 +/static/thumbnails.jpg#xywh=22600,0,200,84 + +00:00:57.000 --> 00:00:57.500 +/static/thumbnails.jpg#xywh=22800,0,200,84 + +00:00:57.500 --> 00:00:58.000 +/static/thumbnails.jpg#xywh=23000,0,200,84 + +00:00:58.000 --> 00:00:58.500 +/static/thumbnails.jpg#xywh=23200,0,200,84 + +00:00:58.500 --> 00:00:59.000 +/static/thumbnails.jpg#xywh=23400,0,200,84 + +00:00:59.000 --> 00:00:59.500 +/static/thumbnails.jpg#xywh=23600,0,200,84 + +00:00:59.500 --> 00:01:00.000 +/static/thumbnails.jpg#xywh=23800,0,200,84 + +00:01:00.000 --> 00:01:00.500 +/static/thumbnails.jpg#xywh=24000,0,200,84 + +00:01:00.500 --> 00:01:01.000 +/static/thumbnails.jpg#xywh=24200,0,200,84 + +00:01:01.000 --> 00:01:01.500 +/static/thumbnails.jpg#xywh=24400,0,200,84 + +00:01:01.500 --> 00:01:02.000 +/static/thumbnails.jpg#xywh=24600,0,200,84 + +00:01:02.000 --> 00:01:02.500 +/static/thumbnails.jpg#xywh=24800,0,200,84 + +00:01:02.500 --> 00:01:03.000 +/static/thumbnails.jpg#xywh=25000,0,200,84 + +00:01:03.000 --> 00:01:03.500 +/static/thumbnails.jpg#xywh=25200,0,200,84 + +00:01:03.500 --> 00:01:04.000 +/static/thumbnails.jpg#xywh=25400,0,200,84 + +00:01:04.000 --> 00:01:04.500 +/static/thumbnails.jpg#xywh=25600,0,200,84 + +00:01:04.500 --> 00:01:05.000 +/static/thumbnails.jpg#xywh=25800,0,200,84 + +00:01:05.000 --> 00:01:05.500 +/static/thumbnails.jpg#xywh=26000,0,200,84 + +00:01:05.500 --> 00:01:06.000 +/static/thumbnails.jpg#xywh=26200,0,200,84 + +00:01:06.000 --> 00:01:06.500 +/static/thumbnails.jpg#xywh=26400,0,200,84 + +00:01:06.500 --> 00:01:07.000 +/static/thumbnails.jpg#xywh=26600,0,200,84 + +00:01:07.000 --> 00:01:07.500 +/static/thumbnails.jpg#xywh=26800,0,200,84 + +00:01:07.500 --> 00:01:08.000 +/static/thumbnails.jpg#xywh=27000,0,200,84 + +00:01:08.000 --> 00:01:08.500 +/static/thumbnails.jpg#xywh=27200,0,200,84 + +00:01:08.500 --> 00:01:09.000 +/static/thumbnails.jpg#xywh=27400,0,200,84 + +00:01:09.000 --> 00:01:09.500 +/static/thumbnails.jpg#xywh=27600,0,200,84 + +00:01:09.500 --> 00:01:10.000 +/static/thumbnails.jpg#xywh=27800,0,200,84 + +00:01:10.000 --> 00:01:10.500 +/static/thumbnails.jpg#xywh=28000,0,200,84 + +00:01:10.500 --> 00:01:10.000 +/static/thumbnails.jpg#xywh=28200,0,200,84 + +00:01:11.000 --> 00:01:11.500 +/static/thumbnails.jpg#xywh=28400,0,200,84 + +00:01:11.500 --> 00:01:12.000 +/static/thumbnails.jpg#xywh=28600,0,200,84 + +00:01:12.000 --> 00:01:12.500 +/static/thumbnails.jpg#xywh=28800,0,200,84 + +00:01:12.500 --> 00:01:13.000 +/static/thumbnails.jpg#xywh=29000,0,200,84 + +00:01:13.000 --> 00:01:13.500 +/static/thumbnails.jpg#xywh=29200,0,200,84 + +00:01:13.500 --> 00:01:14.000 +/static/thumbnails.jpg#xywh=29400,0,200,84 + +00:01:14.000 --> 00:01:14.500 +/static/thumbnails.jpg#xywh=29600,0,200,84 + +00:01:14.500 --> 00:01:15.000 +/static/thumbnails.jpg#xywh=29800,0,200,84 + +00:01:15.000 --> 00:01:15.500 +/static/thumbnails.jpg#xywh=30000,0,200,84 + +00:01:15.500 --> 00:01:16.000 +/static/thumbnails.jpg#xywh=30200,0,200,84 + +00:01:16.000 --> 00:01:16.500 +/static/thumbnails.jpg#xywh=30400,0,200,84 + +00:01:16.500 --> 00:01:17.000 +/static/thumbnails.jpg#xywh=30600,0,200,84 + +00:01:17.000 --> 00:01:17.500 +/static/thumbnails.jpg#xywh=30800,0,200,84 + +00:01:17.500 --> 00:01:18.000 +/static/thumbnails.jpg#xywh=31000,0,200,84 + +00:01:18.000 --> 00:01:18.500 +/static/thumbnails.jpg#xywh=31200,0,200,84 + +00:01:18.500 --> 00:01:19.000 +/static/thumbnails.jpg#xywh=31400,0,200,84 + +00:01:19.000 --> 00:01:19.500 +/static/thumbnails.jpg#xywh=31600,0,200,84 + +00:01:19.500 --> 00:01:20.000 +/static/thumbnails.jpg#xywh=31800,0,200,84 + +00:01:20.000 --> 00:01:20.500 +/static/thumbnails.jpg#xywh=32000,0,200,84 + +00:01:20.500 --> 00:01:21.000 +/static/thumbnails.jpg#xywh=32200,0,200,84 + +00:01:21.000 --> 00:01:21.500 +/static/thumbnails.jpg#xywh=32400,0,200,84 + +00:01:21.500 --> 00:01:22.000 +/static/thumbnails.jpg#xywh=32600,0,200,84 + +00:01:22.000 --> 00:01:22.500 +/static/thumbnails.jpg#xywh=32800,0,200,84 + +00:01:22.500 --> 00:01:23.000 +/static/thumbnails.jpg#xywh=33000,0,200,84 + +00:01:23.000 --> 00:01:23.500 +/static/thumbnails.jpg#xywh=33200,0,200,84 + +00:01:23.500 --> 00:01:24.000 +/static/thumbnails.jpg#xywh=33400,0,200,84 + +00:01:24.000 --> 00:01:24.500 +/static/thumbnails.jpg#xywh=33600,0,200,84 + +00:01:24.500 --> 00:01:25.000 +/static/thumbnails.jpg#xywh=33800,0,200,84 + +00:01:25.000 --> 00:01:25.500 +/static/thumbnails.jpg#xywh=34000,0,200,84 + +00:01:25.500 --> 00:01:26.000 +/static/thumbnails.jpg#xywh=34200,0,200,84 + +00:01:26.000 --> 00:01:26.500 +/static/thumbnails.jpg#xywh=34400,0,200,84 + +00:01:26.500 --> 00:01:27.000 +/static/thumbnails.jpg#xywh=34600,0,200,84 + +00:01:27.000 --> 00:01:27.500 +/static/thumbnails.jpg#xywh=34800,0,200,84 + +00:01:27.500 --> 00:01:28.000 +/static/thumbnails.jpg#xywh=35000,0,200,84 + +00:01:28.000 --> 00:01:28.500 +/static/thumbnails.jpg#xywh=35200,0,200,84 + +00:01:28.500 --> 00:01:29.000 +/static/thumbnails.jpg#xywh=35400,0,200,84 + +00:01:29.000 --> 00:01:29.500 +/static/thumbnails.jpg#xywh=35600,0,200,84 + +00:01:29.500 --> 00:01:30.000 +/static/thumbnails.jpg#xywh=35800,0,200,84 + +00:01:30.000 --> 00:01:30.500 +/static/thumbnails.jpg#xywh=36000,0,200,84 + +00:01:30.500 --> 00:01:31.000 +/static/thumbnails.jpg#xywh=36200,0,200,84 + +00:01:31.000 --> 00:01:31.500 +/static/thumbnails.jpg#xywh=36400,0,200,84 + +00:01:31.500 --> 00:01:32.000 +/static/thumbnails.jpg#xywh=36600,0,200,84 + +00:01:32.000 --> 00:01:32.500 +/static/thumbnails.jpg#xywh=36800,0,200,84 + +00:01:32.500 --> 00:01:33.000 +/static/thumbnails.jpg#xywh=37000,0,200,84 + +00:01:33.000 --> 00:01:33.500 +/static/thumbnails.jpg#xywh=37200,0,200,84 + +00:01:33.500 --> 00:01:34.000 +/static/thumbnails.jpg#xywh=37400,0,200,84 + +00:01:34.000 --> 00:01:34.500 +/static/thumbnails.jpg#xywh=37600,0,200,84 + +00:01:34.500 --> 00:01:35.000 +/static/thumbnails.jpg#xywh=37800,0,200,84 + +00:01:35.000 --> 00:01:35.500 +/static/thumbnails.jpg#xywh=38000,0,200,84 + +00:01:35.500 --> 00:01:36.000 +/static/thumbnails.jpg#xywh=38200,0,200,84 + +00:01:36.000 --> 00:01:36.500 +/static/thumbnails.jpg#xywh=38400,0,200,84 + +00:01:36.500 --> 00:01:37.000 +/static/thumbnails.jpg#xywh=38600,0,200,84 + +00:01:37.000 --> 00:01:37.500 +/static/thumbnails.jpg#xywh=38800,0,200,84 + +00:01:37.500 --> 00:01:38.000 +/static/thumbnails.jpg#xywh=39000,0,200,84 + +00:01:38.000 --> 00:01:38.500 +/static/thumbnails.jpg#xywh=39200,0,200,84 + +00:01:38.500 --> 00:01:39.000 +/static/thumbnails.jpg#xywh=39400,0,200,84 + +00:01:39.000 --> 00:01:39.500 +/static/thumbnails.jpg#xywh=39600,0,200,84 + +00:01:39.500 --> 00:01:40.000 +/static/thumbnails.jpg#xywh=39800,0,200,84 + +00:01:40.000 --> 00:01:40.500 +/static/thumbnails.jpg#xywh=40000,0,200,84 + +00:01:40.500 --> 00:01:41.000 +/static/thumbnails.jpg#xywh=40200,0,200,84 diff --git a/client/fluid-player/test/static/vast4.xsd b/client/fluid-player/test/static/vast4.xsd new file mode 100644 index 0000000..64203c7 --- /dev/null +++ b/client/fluid-player/test/static/vast4.xsd @@ -0,0 +1,1284 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vast="http://www.iab.com/VAST" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.iab.com/VAST" version="4.2.0"> + <!-- =================== Begin root VAST document structure ============= --> + <xs:element name="VAST" > + <xs:annotation> + <xs:documentation>IAB VAST (Video Ad Serving Template), Version 4.2</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:choice> + <xs:element name="Ad" minOccurs="0" maxOccurs="unbounded" > + <xs:annotation> + <xs:documentation>Top-level element, wraps each ad in the response or ad unit in an ad pod. This MUST be present unless an Error element is present.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:choice minOccurs="1" maxOccurs="1"> + <xs:element name="InLine" minOccurs="0" maxOccurs="1" type="vast:Inline_type"> + <xs:annotation> + <xs:documentation>Second-level element surrounding complete ad data for a single ad</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Wrapper" minOccurs="0" maxOccurs="1" type="vast:Wrapper_type"> + <xs:annotation> + <xs:documentation>Second-level element surrounding wrapper ad pointing to Secondary ad server.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:choice> + <xs:attribute name="id" type="xs:string" use="optional" /> + <xs:attribute name="sequence" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Identifies the sequence of multiple Ads that are part of an Ad Pod.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="conditionalAd" type="xs:boolean" use="optional"> + <xs:annotation> + <xs:documentation>[@Deprecated in VAST 4.1 with apiFramework] A Boolean value that identifies a conditional ad.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="adType" use="optional"> + <xs:annotation> + <xs:documentation>An optional string that identifies the type of ad. This allows VAST to support audio ad scenarios. The default value is video.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="video" /> + <xs:enumeration value="audio" /> + <xs:enumeration value="hybrid" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + </xs:element> + <xs:element name="Error" minOccurs="0" maxOccurs="unbounded" type="xs:anyURI" > + <xs:annotation> + <xs:documentation>Used when there is no ad response. When the ad server does not or cannot return an Ad. If included the video player must send a request to the URI provided (Sec 3.2.1).</xs:documentation> + </xs:annotation> + </xs:element> + </xs:choice> + <xs:attribute name="version" type="xs:string" use="required"> + <xs:annotation> + <xs:documentation>Current version is 4.1</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:complexType> + </xs:element> + <!-- =================== End root VAST document structure ============= --> + <!-- ================= VAST internal type definitions ==================== --> + <xs:complexType name="IconClickTracking_type"> + <xs:annotation> + <xs:documentation>URLs to ping when icon action occurs.</xs:documentation> + </xs:annotation> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:complexType name="TrackingEvents_Verification_type" > + <xs:sequence> + <xs:element name="Tracking" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Each <Tracking> element is used to define a single event to be tracked by the verification vendor. Multiple tracking elements may be used to define multiple events to be tracked, but may also be used to track events of the same type for multiple parties.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="event" type="xs:string" use="required"> + <xs:annotation> + <xs:documentation>A string that defines the event being tracked. One event type is currently supported: verificationNotExecuted: the player did not or was not able to execute the provided verification code</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="TrackingEvents_type" > + <xs:sequence> + <xs:element name="Tracking" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>The name of the event to track for the element. The creativeView should always be requested when present.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="event" use="required"> + <xs:annotation> + <xs:documentation>The name of the event to track. For nonlinear ads these events should be recorded on the video within the ad.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="mute" /> + <xs:enumeration value="unmute" /> + <xs:enumeration value="pause" /> + <xs:enumeration value="resume" /> + <xs:enumeration value="rewind" /> + <xs:enumeration value="skip" /> + <xs:enumeration value="playerExpand" /> + <xs:enumeration value="playerCollapse" /> + <xs:enumeration value="loaded" /> + <xs:enumeration value="start" /> + <xs:enumeration value="firstQuartile" /> + <xs:enumeration value="midpoint" /> + <xs:enumeration value="thirdQuartile" /> + <xs:enumeration value="complete" /> + <xs:enumeration value="progress" /> + <xs:enumeration value="closeLinear" /> + <xs:enumeration value="creativeView" /> + <xs:enumeration value="acceptInvitation" /> + <xs:enumeration value="adExpand" /> + <xs:enumeration value="adCollapse" /> + <xs:enumeration value="minimize" /> + <xs:enumeration value="close" /> + <xs:enumeration value="overlayViewDuration" /> + <xs:enumeration value="otherAdInteraction" /> + <xs:enumeration value="interactiveStart" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="offset" use="optional"> + <xs:annotation> + <xs:documentation>The time during the video at which this url should be pinged. Must be present for progress event.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:pattern value="(\d{2}:[0-5]\d:[0-5]\d(\.\d\d\d)?|1?\d?\d(\.?\d)*%)" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="VideoClicks_type" > + <xs:sequence> + <xs:element name="ClickTracking" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>URL to request for tracking purposes when user clicks on the video.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="optional" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="ClickThrough" minOccurs="0" maxOccurs="1"> + <xs:annotation> + <xs:documentation>URL to open as destination page when user clicks on the video. This can occur zero to many times. The XSD syntax can't represent that.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="optional" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="CustomClick" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>URLs to request on custom events such as hotspotted video.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="optional" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="Impression_type" > + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Ad server ID for the impression</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:complexType name="CreativeResource_type"> + <xs:annotation> + <xs:documentation>A base creative resource type (sec 3.13) for non-video creative content. This specifies static, IFrame, or HTML content, or a combination thereof</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="HTMLResource" minOccurs="0" maxOccurs="unbounded" type="vast:HTMLResource_type"> + <xs:annotation> + <xs:documentation>HTML to display the companion element. This can occur zero to many times, but order should not be important.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="IFrameResource" minOccurs="0" maxOccurs="unbounded" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>URI source for an IFrame to display the companion element. This can occur zero to many times, but order should not be important.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="StaticResource" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>URI to a static file, such as an image. This can occur zero to many times, but order should not be important.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="creativeType" type="xs:string" use="required"> + <xs:annotation> + <xs:documentation>MIME type of static resource</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="Icon_type"> + <xs:complexContent> + <xs:extension base="vast:CreativeResource_type"> + <xs:sequence> + <xs:element name="IconClicks" minOccurs="0" maxOccurs="1"> + <xs:complexType> + <xs:sequence> + <xs:element name="IconClickFallbackImages" minOccurs="0" maxOccurs="1"> + <xs:complexType> + <xs:sequence> + <xs:element name="IconClickFallbackImage" minOccurs="1" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Element used to display information when an icon click occurs.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element name="AltText" minOccurs="0" maxOccurs="1" type="xs:string" > + </xs:element> + <xs:element name="StaticResource" minOccurs="0" maxOccurs="1" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>URI to a static file, such as an image.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + <xs:attribute name="height" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Pixel height of the image asset</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="width" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Pixel width of the image asset</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="IconClickThrough" minOccurs="0" maxOccurs="1" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>URL to open as destination page when user clicks on the icon.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="IconClickTracking" minOccurs="0" maxOccurs="unbounded" type="vast:IconClickTracking_type"> + <xs:annotation> + <xs:documentation>URLs to ping when user clicks on the the icon.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="IconViewTracking" minOccurs="0" maxOccurs="unbounded" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>A URI for the tracking resource file to be called when the icon creative is displayed.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + <xs:attribute name="program" type="xs:string"> + <xs:annotation> + <xs:documentation>Program represented in the Icon.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="width" type="xs:integer"> + <xs:annotation> + <xs:documentation>Pixel dimensions of icon.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="height" type="xs:integer"> + <xs:annotation> + <xs:documentation>Pixel dimensions of icon.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="xPosition"> + <xs:annotation> + <xs:documentation>The x-cooridinate of the top, left corner of the icon asset relative to the ad display area</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:pattern value="([0-9]*|left|right)" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="yPosition"> + <xs:annotation> + <xs:documentation>The y-cooridinate of the top left corner of the icon asset relative to the ad display area.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:pattern value="([0-9]*|top|bottom)" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="duration" type="xs:time"> + <xs:annotation> + <xs:documentation>The duration for which the player must display the icon. Expressed in standard time format hh:mm:ss.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="offset" type="xs:time"> + <xs:annotation> + <xs:documentation>Start time at which the player should display the icon. Expressed in standard time format hh:mm:ss.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="apiFramework" type="xs:string"> + <xs:annotation> + <xs:documentation>The apiFramework defines the method to use for communication with the icon element</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="pxratio" type="xs:decimal"> + <xs:annotation> + <xs:documentation>The pixel ratio for which the icon creative is intended. The pixel ratio is the ratio of physical pixels on the device to the device-independent pixels. An ad intended for display on a device with a pixel ratio that is twice that of a standard 1:1 pixel ratio would use the value "2" Default value is "1"</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="CreativeExtensions_type"> + <xs:sequence> + <xs:element name="CreativeExtension" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>Any valid XML may be included in the Extensions node. This can occur zero to many times.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="skip" /> + </xs:sequence> + <xs:attribute name="type" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>The MIME type of any code that might be included in the extension.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:anyAttribute namespace="##any" processContents="skip" /> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:complexType name="AdParameters_type"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="xmlEncoded" type="xs:boolean" use="optional"> + <xs:annotation> + <xs:documentation>Specifies whether the parameters are XML-encoded</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:complexType name="HTMLResource_type"> + <xs:annotation> + <xs:documentation>The URI to a static creative file to be used for the ad component identified in the parent element, which is either: <NonLinear>, <Companion>, or <Icon>.</xs:documentation> + </xs:annotation> + <xs:simpleContent> + <xs:extension base="xs:string" /> + </xs:simpleContent> + </xs:complexType> + <!-- ============= Linear, NonLinear, Companion - Child content classes for Inline and Wrapper========= --> + <xs:complexType name="Linear_Base_type"> + <xs:annotation> + <xs:documentation>Video formatted ad that plays linearly</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Icons" minOccurs="0" maxOccurs="1"> + <xs:complexType> + <xs:sequence> + <xs:element name="Icon" minOccurs="1" maxOccurs="unbounded" type="vast:Icon_type"> + <xs:annotation> + <xs:documentation>Any number of icons representing advertising industry initiatives.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="TrackingEvents" minOccurs="0" maxOccurs="1" type="vast:TrackingEvents_type" /> + </xs:sequence> + <xs:attribute name="skipoffset" use="optional"> + <xs:annotation> + <xs:documentation>The time at which the ad becomes skippable, if absent, the ad is not skippable.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:pattern value="(\d{2}:[0-5]\d:[0-5]\d(\.\d\d\d)?|1?\d?\d(\.?\d)*%)" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + <xs:complexType name="Linear_Wrapper_type"> + <xs:annotation> + <xs:documentation>Video formatted ad that plays linearly</xs:documentation> + </xs:annotation> + <xs:complexContent> + <xs:extension base="vast:Linear_Base_type"> + <xs:sequence> + <xs:element name="VideoClicks" minOccurs="0" maxOccurs="1" type="vast:VideoClicks_type" /> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="Linear_Inline_type"> + <xs:annotation> + <xs:documentation>Video formatted ad that plays linearly</xs:documentation> + </xs:annotation> + <xs:complexContent> + <xs:extension base="vast:Linear_Base_type"> + <xs:sequence> + <xs:element name="AdParameters" minOccurs="0" maxOccurs="1" type="vast:AdParameters_type"> + <xs:annotation> + <xs:documentation>[Note: SIMID is set to replace VPAID] [Note: VPAID has been deprecated in VAST 4.1 ] Data to be passed into the video ad. Used to pass VAST info to VPAID object. When a VAST response is used to serve a VPAID ad unit, the <AdParameters> element is currently the only way to pass information from the VAST response into the VPAID object; no other mechanism is provided.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Duration" minOccurs="1" maxOccurs="1" type="xs:time"> + <xs:annotation> + <xs:documentation>Duration in standard time format, hh:mm:ss</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="MediaFiles" minOccurs="1" maxOccurs="1"> + <xs:complexType> + <xs:sequence> + <xs:element name="ClosedCaptionFiles" minOccurs="0" maxOccurs="1"> + <xs:complexType> + <xs:sequence> + <xs:element name="ClosedCaptionFile" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>A CDATA-wrapped URI to a file providing Closed Caption info for the media file.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="type" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Identifies the MIME type of the file provided.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="language" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Language of the Closed Caption File using ISO 631-1 codes. An optional locale suffix can also be provided.</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="MediaFile" minOccurs="1" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>URI location of linear file. Content must be wrapped in CDATA tag.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Optional identifier</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="delivery" use="required"> + <xs:annotation> + <xs:documentation>Either "progressive" for progressive download protocols (such as HTTP) or "streaming" for streaming protocols.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="streaming" /> + <xs:enumeration value="progressive" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="type" type="xs:string" use="required"> + <xs:annotation> + <xs:documentation>MIME type. Popular MIME types include, but are not limited to "video/x-ms-wmv" for Windows Media, and "video/x-flv" for Flash Video. Image ads or interactive ads can be included in the MediaFiles section with appropriate Mime types. Flash support was deprecated in January 2017 and is now being removed.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="width" type="xs:integer" use="required"> + <xs:annotation> + <xs:documentation>Pixel dimensions of video, or 0 for audio ads</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="height" type="xs:integer" use="required"> + <xs:annotation> + <xs:documentation>Pixel dimensions of video, or 0 for audio ads</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="codec" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>The codec used to produce the media file as specified in RFC 4281.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="bitrate" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Bitrate of encoded video in Kbps. If bitrate is supplied, minBitrate and maxBitrate should not be supplied.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="minBitrate" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Minimum bitrate of an adaptive stream in Kbps. If minBitrate is supplied, maxBitrate must be supplied and bitrate should not be supplied.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="maxBitrate" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Maximum bitrate of an adaptive stream in Kbps. If maxBitrate is supplied, minBitrate must be supplied and bitrate should not be supplied.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="scalable" type="xs:boolean" use="optional"> + <xs:annotation> + <xs:documentation>Whether it is acceptable to scale the image.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="maintainAspectRatio" type="xs:boolean" use="optional"> + <xs:annotation> + <xs:documentation>Whether the ad must have its aspect ratio maintained when scales</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="fileSize" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Optional field that helps eliminate the need to calculate the size based on bitrate and duration. Units - Bytes</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="mediaType" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Type of media file (2D / 3D / 360 / etc). Default value = 2D</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="apiFramework" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>[@Deprecated in 4.1 in preparation for VPAID being phased out]. identifies the API needed to execute an interactive media file, but current support is for backward compatibility. Please use the <InteractiveCreativeFile> element to include files that require an API for execution.</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="Mezzanine" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>URI location to raw, high-quality media file for high-resolution environments or to transcode video or audio files at quality levels specific to the needs of certain environments. Content must be wrapped in CDATA tag.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Optional identifier</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="delivery" use="required"> + <xs:annotation> + <xs:documentation>Either "progressive" for progressive download protocols (such as HTTP) or "streaming" for streaming protocols.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="streaming" /> + <xs:enumeration value="progressive" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="type" type="xs:string" use="required"> + <xs:annotation> + <xs:documentation>MIME type. Popular MIME types include, but are not limited to "video/x-ms-wmv" for Windows Media, and "video/x-flv" for Flash Video. Image ads or interactive ads can be included in the MediaFiles section with appropriate Mime types. Flash support was deprecated in January 2017 and is now being removed.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="width" type="xs:integer" use="required"> + <xs:annotation> + <xs:documentation>Pixel dimensions of video, or 0 for audio ads</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="height" type="xs:integer" use="required"> + <xs:annotation> + <xs:documentation>Pixel dimensions of video, or 0 for audio ads</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="codec" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>The codec used to produce the media file as specified in RFC 4281.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="fileSize" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Optional field that helps eliminate the need to calculate the size based on bitrate and duration. Units - Bytes</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="mediaType" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Type of media file (2D / 3D / 360 / etc). Default value = 2D</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="InteractiveCreativeFile" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>For any media file that uses APIs for advanced creative functionality, the InteractivityCreativeFile element is used to identify the file and framework needed to execute advanced functions for the ad.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="type" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Identifies the MIME type of the file provided.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="apiFramework" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>identifies the API needed to execute the Creative file if applicable</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="variableDuration" type="xs:boolean" use="optional"> + <xs:annotation> + <xs:documentation>Useful for interactive use cases. Identifies whether the ad always drops when the duration is reached, or if it can potentially extend the duration by pausing the underlying video or delaying the adStopped call after adVideoComplete. If it set to true the extension of the duration should be user-initiated (typically by engaging with an interactive element to view additional content).</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="VideoClicks" minOccurs="0" maxOccurs="1" type="vast:VideoClicks_type" /> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="NonLinearAd_Base_type"> + <xs:annotation> + <xs:documentation>An ad that is overlain on top of video content during playback</xs:documentation> + </xs:annotation> + <xs:all> + <xs:element name="NonLinearClickTracking" minOccurs="0" maxOccurs="1"> + <xs:annotation> + <xs:documentation>URLs to ping when user clicks on the the non-linear ad unit. This can occur zero to many times (unbounded). The XSD syntax can't represent that.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Identifier provided to ad server for click reports</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:all> + </xs:complexType> + <xs:complexType name="NonLinearAd_Inline_type"> + <xs:annotation> + <xs:documentation>An ad that is overlain on top of video content during playback</xs:documentation> + </xs:annotation> + <xs:complexContent> + <xs:extension base="vast:CreativeResource_type"> + <xs:sequence> + <xs:element name="AdParameters" minOccurs="0" maxOccurs="1" type="vast:AdParameters_type"> + <xs:annotation> + <xs:documentation>Custom content used to pass information to ad unit</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NonLinearClickThrough" minOccurs="0" maxOccurs="1" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>URI to advertiser page opened on viewer clicks through.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NonLinearClickTracking" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>URLs to ping when user clicks on the the non-linear ad unit.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Identifier provided to ad server for click reports</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Optional identifier</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="width" type="xs:integer" use="required"> + <xs:annotation> + <xs:documentation>Pixel dimensions of companion</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="height" type="xs:integer" use="required"> + <xs:annotation> + <xs:documentation>Pixel dimensions of companion</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="expandedWidth" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Pixel dimensions of expanding nonlinear ad when in expanded state</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="expandedHeight" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Pixel dimensions of expanding nonlinear ad when in expanded state</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="scalable" type="xs:boolean" use="optional"> + <xs:annotation> + <xs:documentation>Whether it is acceptable to scale the image.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="maintainAspectRatio" type="xs:boolean" use="optional"> + <xs:annotation> + <xs:documentation>Whether the ad must have its aspect ratio maintained when scales</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="minSuggestedDuration" type="xs:time" use="optional"> + <xs:annotation> + <xs:documentation>Suggested duration to display non-linear ad, typically for animation to complete. Expressed in standard time format hh:mm:ss</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="apiFramework" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>The apiFramework defines the method to use for communication with the nonlinear element</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="CompanionAd_type"> + <xs:complexContent> + <xs:extension base="vast:CreativeResource_type"> + <xs:sequence> + <xs:element name="AdParameters" minOccurs="0" maxOccurs="1" type="vast:AdParameters_type"> + <xs:annotation> + <xs:documentation>Data to be passed into the companion ads. The apiFramework defines the method to use for communication.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AltText" minOccurs="0" maxOccurs="1" type="xs:string"> + <xs:annotation> + <xs:documentation>Alt text to be displayed when companion is rendered in HTML environment.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CompanionClickThrough" minOccurs="0" maxOccurs="1" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>URL to open as destination page when user clicks on the the companion banner ad.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="CompanionClickTracking" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>A URI to a tracking resource file used to track a companion clickthrough.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="id" type="xs:string" use="required"> + <xs:annotation> + <xs:documentation>An id provided by the ad server to track the click in reports.</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="CreativeExtensions" minOccurs="0" maxOccurs="1" type="vast:CreativeExtensions_type" /> + <xs:element name="TrackingEvents" minOccurs="0" maxOccurs="1" type="vast:TrackingEvents_type"> + <xs:annotation> + <xs:documentation>The creativeView should always be requested when present. For Companions creativeView is the only supported event.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Optional identifier</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="width" type="xs:integer" use="required"> + <xs:annotation> + <xs:documentation>Pixel dimensions of companion slot</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="height" type="xs:integer" use="required"> + <xs:annotation> + <xs:documentation>Pixel dimensions of companion slot</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="assetWidth" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Pixel dimensions of the companion asset</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="assetHeight" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Pixel dimensions of the companion asset</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="expandedWidth" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Pixel dimensions of expanding companion ad when in expanded state</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="expandedHeight" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>Pixel dimensions of expanding companion ad when in expanded state</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="apiFramework" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>The apiFramework defines the method to use for communication with the companion</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="adSlotId" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Used to match companion creative to publisher placement areas on the page.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="pxratio" type="xs:decimal"> + <xs:annotation> + <xs:documentation>The pixel ratio for which the icon creative is intended. The pixel ratio is the ratio of physical pixels on the device to the device-independent pixels. An ad intended for display on a device with a pixel ratio that is twice that of a standard 1:1 pixel ratio would use the value "2" Default value is "1"</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="renderingMode" use="optional"> + <xs:annotation> + <xs:documentation>Used to indicate when and where to use this companion ad. If this field is empty or not given, default will be used.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="default" /> + <xs:enumeration value="end-card" /> + <xs:enumeration value="concurrent" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="CompanionAds_Collection_type"> + <xs:sequence> + <xs:element name="Companion" minOccurs="0" maxOccurs="unbounded" type="vast:CompanionAd_type"> + <xs:annotation> + <xs:documentation>General subclass type for Companion Ad elements. This can occur zero to many times.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + <xs:attribute name="required" use="optional"> + <xs:annotation> + <xs:documentation>How the player should treat a companion ad when multiple are supplied</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="all" /> + <xs:enumeration value="any" /> + <xs:enumeration value="none" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:complexType> + <!-- ============= Creative Element for under a Wrapper or Inline Element ========= --> + <xs:complexType name="Creative_Base_type"> + <xs:attribute name="sequence" type="xs:integer" use="optional"> + <xs:annotation> + <xs:documentation>The preferred order in which multiple Creatives should be displayed</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="apiFramework" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Identifies an API needed to execute the creative</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>A string used to identify the ad server that provides the creative.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="adId" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>To be deprecated in future version of VAST. Ad-ID for the creative (formerly ISCI)</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:complexType> + <xs:complexType name="Creative_Wrapper_type"> + <xs:complexContent> + <xs:extension base="vast:Creative_Base_type"> + <xs:sequence> + <xs:element name="CompanionAds" minOccurs="0" maxOccurs="1" type="vast:CompanionAds_Collection_type" /> + <xs:element name="Linear" minOccurs="0" maxOccurs="1" type="vast:Linear_Wrapper_type" /> + <xs:element name="NonLinearAds" minOccurs="0" maxOccurs="1"> + <xs:complexType> + <xs:sequence> + <xs:element name="TrackingEvents" minOccurs="0" maxOccurs="1" type="vast:TrackingEvents_type" /> + <xs:element name="NonLinear" minOccurs="0" maxOccurs="unbounded" type="vast:NonLinearAd_Base_type"> + <xs:annotation> + <xs:documentation>Any number of companions in any desired pixel dimensions.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="Creative_Inline_type"> + <xs:complexContent> + <xs:extension base="vast:Creative_Base_type"> + <xs:sequence> + <xs:element name="CompanionAds" minOccurs="0" maxOccurs="1" type="vast:CompanionAds_Collection_type" /> + <xs:element name="CreativeExtensions" minOccurs="0" maxOccurs="1" type="vast:CreativeExtensions_type" /> + <xs:element name="Linear" minOccurs="0" maxOccurs="1" type="vast:Linear_Inline_type" /> + <xs:element name="NonLinearAds" minOccurs="0" maxOccurs="1"> + <xs:complexType> + <xs:sequence> + <xs:element name="TrackingEvents" minOccurs="0" maxOccurs="1" type="vast:TrackingEvents_type" /> + <xs:element name="NonLinear" minOccurs="0" maxOccurs="unbounded" type="vast:NonLinearAd_Inline_type"> + <xs:annotation> + <xs:documentation>Any number of companions in any desired pixel dimensions.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="UniversalAdId" minOccurs="1" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>The UniversalAdId is used to provide a unique creative identifier for the purposes of tracking ad creative. This is used for AD-ID(r) for ads served in the United States. Default value is "unknown"</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="idRegistry" type="xs:string" use="required" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <!-- ============ Base Definition of Shared Inline or Wrapper ad structure ============ --> + <xs:complexType name="AdDefinitionBase_type"> + <xs:annotation> + <xs:documentation>Base type structure used by Inline or Wrapper ad content element types</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="AdSystem" minOccurs="1" maxOccurs="1"> + <xs:annotation> + <xs:documentation>Indicates source ad server</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="version" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>Internal version used by ad system</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="Error" minOccurs="0" maxOccurs="unbounded" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>URL to request if ad does not play due to error</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Extensions" minOccurs="0" maxOccurs="1"> + <xs:annotation> + <xs:documentation>XML node for custom extensions, as defined by the ad server. When used, a custom element should be nested under <Extensions> to help separa + te custom XML elements from VAST elements.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element name="Extension" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>One instance of <Extension> should be used for each custom extension. The type attribute identifies the MIME type of any code provided in the extension.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" /> + </xs:sequence> + <xs:attribute name="type" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>The MIME type of any code that might be included in the extension.</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="Impression" minOccurs="1" maxOccurs="unbounded" type="vast:Impression_type"> + <xs:annotation> + <xs:documentation>A URI that directs the media player to a tracking resource file that the media player must + use to notify the ad server when the impression occurs. If there is no reason to include + an Impression element, the placeholder "about:blank" should be used instead of a + tracking URL</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Pricing" minOccurs="0" maxOccurs="1"> + <xs:annotation> + <xs:documentation>The price of the ad that can be used in real time bidding systems.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:decimal"> + <xs:attribute name="model" use="required"> + <xs:annotation> + <xs:documentation>The pricing model used.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="CPC" /> + <xs:enumeration value="CPM" /> + <xs:enumeration value="CPE" /> + <xs:enumeration value="CPV" /> + <xs:enumeration value="cpc" /> + <xs:enumeration value="cpm" /> + <xs:enumeration value="cpe" /> + <xs:enumeration value="cpv" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="currency" use="required"> + <xs:annotation> + <xs:documentation>Three letter ISO-4217 currency symbol that identifies the currency of the value provied. Ex: USD, GBP, etc.</xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:pattern value="[a-zA-Z]{3}" /> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="ViewableImpression" minOccurs="0" maxOccurs="1" type="vast:ViewableImpression_type" /> + </xs:sequence> + </xs:complexType> + <xs:complexType name="ViewableImpression_type" > + <xs:annotation> + <xs:documentation>The ViewableImpression element allows for tracking URIs to report viewability</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Viewable" minOccurs="0" maxOccurs="unbounded" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>A URI that directs the video player to a tracking resource file that the video player should request at the time that criteria is met for a viewable impression. This can occur zero to many times.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="NotViewable" minOccurs="0" maxOccurs="unbounded" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>A URI that directs the video player to a tracking resource file that the video player should request if the ad is executed but never meets criteria for a viewable impression.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="ViewUndetermined" minOccurs="0" maxOccurs="unbounded" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>A URI that directs the video player to a tracking resource file that the video player should request if the player cannot determine whether criteria is met for a viewable impression. This can occur zero to many times.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + <xs:attribute name="id" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>An ad server id for the impression. Impression resources of the same id should be requested at the same time or as close in time as possible to help prevent discrepancies.</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:complexType> + <!-- ============ Verification type used under Inline elements =============== --> + <xs:complexType name="Verification_type"> + <xs:annotation> + <xs:documentation>Verification elements are nested under AdVerifications. The Verification element is used to contain the executable and bootstrapping required to run the measurement code for a single verification vendor. Multiple Verification elements may be used in cases where more than one verification vendor needs to collect data or when different API frameworks are used. At lease one JavaScriptResource or ExecutableResource should be provided. At most one of these resources should selected for execution, as best matches the technology available in the current environment. If the player is willing and able to run one of these resources, it should execute them BEFORE creative playback begins. Otherwise, if no resource can be executed, any appropriate tracking events listed under the <Verification> element must be fired.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="ExecutableResource" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="apiFramework" type="xs:string" use="optional" /> + <xs:attribute name="type" type="xs:string" use="optional" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="JavaScriptResource" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="apiFramework" type="xs:string" use="optional" /> + <xs:attribute name="browserOptional" type="xs:boolean" use="optional" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="TrackingEvents" minOccurs="0" maxOccurs="1" type="vast:TrackingEvents_Verification_type" /> + <xs:element name="VerificationParameters" minOccurs="0" maxOccurs="1" type="xs:string"> + <xs:annotation> + <xs:documentation>CDATA-wrapped metadata string for the verification executable.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + <xs:attribute name="vendor" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>An identifier for the verification vendor. The recommended format is [domain]-[useCase], to avoid name collisions. For example, "company.com-omid".</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:complexType> + <!-- ========== Definition of the AdVerifications element type ========== --> + <xs:complexType name="AdVerifications_type" > + <xs:annotation> + <xs:documentation>The AdVerification element is used to initiate a controlled container where code can be executed for collecting data to verify ad playback details.</xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="Verification" minOccurs="0" maxOccurs="unbounded" type="vast:Verification_type" /> + </xs:sequence> + </xs:complexType> + <!-- ========== Definition of the Wrapper element type ========== --> + <xs:complexType name="Wrapper_type"> + <xs:complexContent> + <xs:extension base="vast:AdDefinitionBase_type"> + <xs:sequence> + <xs:element name="AdVerifications" minOccurs="0" maxOccurs="1" type="vast:AdVerifications_type" /> + <xs:element name="BlockedAdCategories" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>A string that provides a category code or label that identifies the ad content.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="authority" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>A URL for the organizational authority that produced the list being used to identify ad content. Optional unless the publisher requires ad categories. The authority attribute is required if categories are provided.</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="Creatives" minOccurs="0" maxOccurs="1"> + <xs:annotation> + <xs:documentation>A container for one or more Creative elements used to provide creative files for ad.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element name="Creative" minOccurs="1" maxOccurs="unbounded" type="vast:Creative_Wrapper_type" /> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="VASTAdTagURI" minOccurs="1" maxOccurs="1" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>A URI to another VAST response that may be another VAST Wrapper or a VAST InLine ad.</xs:documentation> + </xs:annotation> + </xs:element> + </xs:sequence> + <xs:attribute name="followAdditionalWrappers" type="xs:boolean"> + <xs:annotation> + <xs:documentation>a Boolean value that identifies whether subsequent wrappers after a requested VAST response is allowed.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="allowMultipleAds" type="xs:boolean"> + <xs:annotation> + <xs:documentation>a Boolean value that identifies whether multiple ads are allowed in the requested VAST response.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute name="fallbackOnNoAd" type="xs:boolean"> + <xs:annotation> + <xs:documentation>a Boolean value that provides instruction for using an available Ad when the requested VAST response returns no ads.</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <!-- ========== Definition of the Inline element type ========== --> + <xs:complexType name="Inline_type"> + <xs:complexContent> + <xs:extension base="vast:AdDefinitionBase_type"> + <xs:sequence> + <xs:element name="AdServingId" minOccurs="1" maxOccurs="1" type="xs:string"> + <xs:annotation> + <xs:documentation>Any ad server that returns a VAST containing an <InLine> ad must generate a pseudo-unique identifier that is appropriate for all involved parties to track the lifecycle of that ad. This should be inserted into the <AdServingId> element, and also be included on all outgoing tracking pixels. The value should be different for each Inline in a VAST. Usage of a GUID is recommended.</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AdTitle" minOccurs="1" maxOccurs="1" type="xs:string"> + <xs:annotation> + <xs:documentation>Common name of ad</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="AdVerifications" minOccurs="0" maxOccurs="1" type="vast:AdVerifications_type" /> + <xs:element name="Advertiser" minOccurs="0" maxOccurs="1" type="xs:string"> + <xs:annotation> + <xs:documentation>Name of advertiser as defined by the ad serving party</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Category" minOccurs="0" maxOccurs="unbounded"> + <xs:annotation> + <xs:documentation>A string that provides a category code or label that identifies the ad content.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="authority" type="xs:anyURI" use="required"> + <xs:annotation> + <xs:documentation>A URI for the organizational authority that produced the list being used to identify ad content.</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="Creatives" minOccurs="1" maxOccurs="1"> + <xs:annotation> + <xs:documentation>A container for one or more Creative elements used to provide creative files for ad.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element name="Creative" minOccurs="1" maxOccurs="unbounded" type="vast:Creative_Inline_type" /> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="Description" minOccurs="0" maxOccurs="1" type="xs:string"> + <xs:annotation> + <xs:documentation>Longer description of ad</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Expires" minOccurs="0" maxOccurs="1" type="xs:integer"> + <xs:annotation> + <xs:documentation>An integer value that defines the expiry period (in seconds).</xs:documentation> + </xs:annotation> + </xs:element> + <xs:element name="Survey" minOccurs="0" maxOccurs="1"> + <xs:annotation> + <xs:documentation>URL of request to survey vendor</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="type" type="xs:string" use="optional"> + <xs:annotation> + <xs:documentation>MIME type of the resource being served</xs:documentation> + </xs:annotation> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> +</xs:schema> diff --git a/client/fluid-player/test/static/vast_ad_buffet.xml b/client/fluid-player/test/static/vast_ad_buffet.xml new file mode 100644 index 0000000..b0f60b2 --- /dev/null +++ b/client/fluid-player/test/static/vast_ad_buffet.xml @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="5566276"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="78544088"> + <Linear skipoffset="00:00:03"> + <Duration>00:00:22.342</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>samplesite.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Ad Buffet Ad #1</MobileText> + <PCText>Ad Buffet Ad #1</PCText> + <DisplayUrl><![CDATA[sample.com]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="4840678"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79253280"> + <Linear> + <Duration>00:00:30.0</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>hczog.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Ad Buffet Ad #2</MobileText> + <PCText>Ad Buffet Ad #2</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="5460430"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79167900"> + <Linear> + <Duration>00:00:24.799</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>www.zodertracker.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Ad Buffet Ad #3</MobileText> + <PCText>Ad Buffet Ad #3</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_ad_buffet_with_error.xml b/client/fluid-player/test/static/vast_ad_buffet_with_error.xml new file mode 100644 index 0000000..f74cb96 --- /dev/null +++ b/client/fluid-player/test/static/vast_ad_buffet_with_error.xml @@ -0,0 +1,105 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="5566276"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Ad Buffet Ad #1</MobileText> + <PCText>Ad Buffet Ad #1</PCText> + <DisplayUrl><![CDATA[sample.com]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="4840678"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79253280"> + <Linear> + <Duration>00:00:30.0</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>hczog.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Ad Buffet Ad #2</MobileText> + <PCText>Ad Buffet Ad #2</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="5460430"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79167900"> + <Linear> + <Duration>00:00:24.799</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>www.zodertracker.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Ad Buffet Ad #3</MobileText> + <PCText>Ad Buffet Ad #3</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_ad_pod.xml b/client/fluid-player/test/static/vast_ad_pod.xml new file mode 100644 index 0000000..9523db6 --- /dev/null +++ b/client/fluid-player/test/static/vast_ad_pod.xml @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="5566276" sequence="2"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="78544088"> + <Linear skipoffset="00:00:03"> + <Duration>00:00:22.342</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>samplesite.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>AD #2 in an Ad Pod</MobileText> + <PCText>AD #2 in an Ad Pod</PCText> + <DisplayUrl><![CDATA[sample.com]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="4840678" sequence="1"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79253280"> + <Linear skipoffset="00:00:03"> + <Duration>00:00:30.0</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>hczog.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>AD #1 in an Ad Pod</MobileText> + <PCText>AD #1 in an Ad Pod</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="20005" sequence="3"> + <InLine> + <AdSystem version="4.0">iabtechlab</AdSystem> + <AdTitle> + NonLinear Image + </AdTitle> + <Description> + <![CDATA[VAST 3.0 sample tag for Non Linear ad (i.e Overlay ad). Change the StaticResources to have a tag with your own content. Change NonLinear tag's parameters accordingly to view desired results. ]]> + </Description> + <Pricing model="cpm" currency="USD"> + <![CDATA[ 25.00 ]]> + </Pricing> + <Error> + <![CDATA[ + http://example.com/error + ]]> + </Error> + <Impression id="Impression-ID"> + <![CDATA[ + http://example.com/track/impression + ]]> + </Impression> + + <Creatives> + <Creative id="5480" sequence="1"> + <NonLinearAds> + <NonLinear width="480" height="150" minSuggestedDuration="00:00:05" scalable="true" maintainAspectRatio="true"> + <StaticResource creativeType="image/png"> + <![CDATA[ https://placekitten.com/480/150 ]]> + </StaticResource> + + <NonLinearClickTracking> + <![CDATA[http://example.com/trackingurl/clickTracking]]> + </NonLinearClickTracking> + <NonLinearClickThrough> + <![CDATA[http://iabtechlab.com]]> + </NonLinearClickThrough> + + </NonLinear> + </NonLinearAds> + </Creative> + </Creatives> + </InLine> + </Ad> + <Ad id="5460430"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79167900"> + <Linear skipoffset="00:00:02"> + <Duration>00:00:24.799</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>www.zodertracker.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Stand Alone Ad - Should Not be Played (BUG!)</MobileText> + <PCText>Stand Alone Ad - Should Not be Played (BUG!)</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_cta.xml b/client/fluid-player/test/static/vast_cta.xml new file mode 100644 index 0000000..d7283fb --- /dev/null +++ b/client/fluid-player/test/static/vast_cta.xml @@ -0,0 +1,76 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="1" adType="video"> + <InLine> + <AdSystem version="1">Test</AdSystem> + <AdTitle>Vast CTA test</AdTitle> + <Creatives> + <Creative sequence="1" id="1"> + <Linear skipoffset="00:00:05"> + <Duration>00:00:00</Duration> + <MediaFiles> + <MediaFile id="1" delivery="progressive" type="video/mp4" bitrate="500" width="400" height="300" minBitrate="360" maxBitrate="1080" scalable="1" maintainAspectRatio="1" codec="0"> + <![CDATA[ https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4 ]]> + </MediaFile> + </MediaFiles> + <VideoClicks> + <ClickThrough id="1"> + <![CDATA[ http://www.example.com ]]> + </ClickThrough> + <ClickTracking> + <![CDATA[ http://www.example.com/click-tracking ]]> + </ClickTracking> + </VideoClicks> + <TrackingEvents> + <Tracking event="start">http://www.example.com/start</Tracking> + <Tracking event="firstQuartile">http://www.example.com/firstQuartile</Tracking> + <Tracking event="midpoint">http://www.example.com/midpoint</Tracking> + <Tracking event="thirdQuartile">http://www.example.com/thirdQuartile</Tracking> + <Tracking event="complete">http://www.example.com/complete</Tracking> + <Tracking event="mute">http://www.example.com/mute</Tracking> + <Tracking event="rewind">http://www.example.com/rewind</Tracking> + <Tracking event="pause">http://www.example.com/pause</Tracking> + <Tracking event="resume">http://www.example.com/resume</Tracking> + <Tracking event="fullscreen">http://www.example.com/fullscreen</Tracking> + <Tracking event="creativeView">http://www.example.com/creativeView</Tracking> + <Tracking event="acceptInvitation">http://www.example.com/acceptInvitation</Tracking> + <Tracking event="skip">http://www.example.com/skip</Tracking> + <Tracking event="progress" offset="00:00:05">http://www.example.com/progress5</Tracking> + <Tracking event="progress" offset="00:00:10">http://www.example.com/progress10</Tracking> + <Tracking event="progress" offset="00:00:15">http://www.example.com/progress15</Tracking> + <Tracking event="progress" offset="00:00:20">http://www.example.com/progress20</Tracking> + <Tracking event="progress" offset="00:00:25">http://www.example.com/progress25</Tracking> + </TrackingEvents> + <Icons> + <Icon> + <IconClicks> <!-- Will fall back to IconClickTrough if no TitleCTA extension found --> + <IconClickThrough>https://www.example.com/IconClickThrough</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + <UniversalAdId idRegistry="unknown">unknown</UniversalAdId> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <!-- The MobileText is corresponding to our "CTA text" --> + <MobileText>CTA Text Mobile</MobileText> + + <!-- The PCText is identical to MobileText --> + <PCText>CTA Text Desktop</PCText> + + <!-- The link corresponds to our "Display Url" --> + <Link><![CDATA[https://www.example.com/advertisment?ref=1234567890!"#$%&/()=]]></Link> + + <!-- The Tracking is the same as our to ClickTracking --> + <Tracking><![CDATA[https://www.example.com/tracking.html]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + <Impression id=""> + <![CDATA[ http://www.example.com/impression ]]> + </Impression> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_cta_no_friendly_url.xml b/client/fluid-player/test/static/vast_cta_no_friendly_url.xml new file mode 100644 index 0000000..0157b02 --- /dev/null +++ b/client/fluid-player/test/static/vast_cta_no_friendly_url.xml @@ -0,0 +1,73 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="1" adType="video"> + <InLine> + <AdSystem version="1">Test</AdSystem> + <AdTitle>Vast CTA test</AdTitle> + <Creatives> + <Creative sequence="1" id="1"> + <Linear skipoffset="00:00:05"> + <Duration>00:00:00</Duration> + <MediaFiles> + <MediaFile id="1" delivery="progressive" type="video/mp4" bitrate="500" width="400" height="300" minBitrate="360" maxBitrate="1080" scalable="1" maintainAspectRatio="1" codec="0"> + <![CDATA[ https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4 ]]> + </MediaFile> + </MediaFiles> + <VideoClicks> + <ClickThrough id="1"> + <![CDATA[ http://www.example.com ]]> + </ClickThrough> + </VideoClicks> + <TrackingEvents> + <Tracking event="start">http://www.example.com/start</Tracking> + <Tracking event="firstQuartile">http://www.example.com/firstQuartile</Tracking> + <Tracking event="midpoint">http://www.example.com/midpoint</Tracking> + <Tracking event="thirdQuartile">http://www.example.com/thirdQuartile</Tracking> + <Tracking event="complete">http://www.example.com/complete</Tracking> + <Tracking event="mute">http://www.example.com/mute</Tracking> + <Tracking event="rewind">http://www.example.com/rewind</Tracking> + <Tracking event="pause">http://www.example.com/pause</Tracking> + <Tracking event="resume">http://www.example.com/resume</Tracking> + <Tracking event="fullscreen">http://www.example.com/fullscreen</Tracking> + <Tracking event="creativeView">http://www.example.com/creativeView</Tracking> + <Tracking event="acceptInvitation">http://www.example.com/acceptInvitation</Tracking> + <Tracking event="skip">http://www.example.com/skip</Tracking> + <Tracking event="progress" offset="00:00:05">http://www.example.com/progress5</Tracking> + <Tracking event="progress" offset="00:00:10">http://www.example.com/progress10</Tracking> + <Tracking event="progress" offset="00:00:15">http://www.example.com/progress15</Tracking> + <Tracking event="progress" offset="00:00:20">http://www.example.com/progress20</Tracking> + <Tracking event="progress" offset="00:00:25">http://www.example.com/progress25</Tracking> + </TrackingEvents> + <Icons> + <Icon> + <IconClicks> <!-- Will fall back to IconClickTrough if no TitleCTA extension found --> + <IconClickThrough>https://www.example.com/IconClickThrough</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + <UniversalAdId idRegistry="unknown">unknown</UniversalAdId> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <!-- The MobileText is corresponding to our "CTA text" --> + <MobileText>CTA Text Mobile</MobileText> + + <!-- The PCText is identical to MobileText --> + <PCText>CTA Text Desktop</PCText> + + <!-- The link corresponds to our "Display Url" --> + <Link><![CDATA[ ]]></Link> + + <!-- The Tracking is the same as our to ClickTracking --> + <Tracking><![CDATA[https://www.example.com/tracking.html]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + <Impression id=""> + <![CDATA[ http://www.example.com/impression ]]> + </Impression> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_hls.xml b/client/fluid-player/test/static/vast_hls.xml new file mode 100644 index 0000000..5f716c3 --- /dev/null +++ b/client/fluid-player/test/static/vast_hls.xml @@ -0,0 +1,52 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="1" adType="video"> + <InLine> + <AdSystem version="1">stripcash.com</AdSystem> + <AdTitle>HLS test</AdTitle> + <Creatives> + <Creative sequence="1" id="1"> + <Linear skipoffset="00:00:05"> + <Duration>00:00:00</Duration> + <MediaFiles> + <MediaFile id="1" delivery="streaming" type="application/vnd.apple.mpegurl" width="480" height="640"> + <![CDATA[ https://cdn.fluidplayer.com/videos/HLS/index.m3u8 ]]> + </MediaFile> + </MediaFiles> + <VideoClicks> + <ClickThrough id="1"> + <![CDATA[ http://www.example.com ]]> + </ClickThrough> + <ClickTracking> + <![CDATA[ http://www.example.com/click-tracking ]]> + </ClickTracking> + </VideoClicks> + <TrackingEvents> + <Tracking event="start">http://www.example.com/start</Tracking> + <Tracking event="firstQuartile">http://www.example.com/firstQuartile</Tracking> + <Tracking event="midpoint">http://www.example.com/midpoint</Tracking> + <Tracking event="thirdQuartile">http://www.example.com/thirdQuartile</Tracking> + <Tracking event="complete">http://www.example.com/complete</Tracking> + <Tracking event="mute">http://www.example.com/mute</Tracking> + <Tracking event="rewind">http://www.example.com/rewind</Tracking> + <Tracking event="pause">http://www.example.com/pause</Tracking> + <Tracking event="resume">http://www.example.com/resume</Tracking> + <Tracking event="fullscreen">http://www.example.com/fullscreen</Tracking> + <Tracking event="creativeView">http://www.example.com/creativeView</Tracking> + <Tracking event="acceptInvitation">http://www.example.com/acceptInvitation</Tracking> + <Tracking event="skip">http://www.example.com/skip</Tracking> + <Tracking event="progress" offset="00:00:05">http://www.example.com/progress5</Tracking> + <Tracking event="progress" offset="00:00:10">http://www.example.com/progress10</Tracking> + <Tracking event="progress" offset="00:00:15">http://www.example.com/progress15</Tracking> + <Tracking event="progress" offset="00:00:20">http://www.example.com/progress20</Tracking> + <Tracking event="progress" offset="00:00:25">http://www.example.com/progress25</Tracking> + </TrackingEvents> + </Linear> + <UniversalAdId idRegistry="unknown">unknown</UniversalAdId> + </Creative> + </Creatives> + <Impression id=""> + <![CDATA[ http://www.example.com/impression ]]> + </Impression> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_linear.xml b/client/fluid-player/test/static/vast_linear.xml new file mode 100644 index 0000000..ded0132 --- /dev/null +++ b/client/fluid-player/test/static/vast_linear.xml @@ -0,0 +1,72 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="1" adType="video"> + <InLine> + <AdSystem version="1">Test</AdSystem> + <AdTitle>Vast Linear</AdTitle> + <Creatives> + <Creative sequence="1" id="1"> + <Linear skipoffset="00:00:05"> + <Duration>00:00:00</Duration> + <MediaFiles> + <MediaFile id="1" delivery="progressive" type="video/mp4" bitrate="500" width="400" height="300" minBitrate="360" maxBitrate="1080" scalable="1" maintainAspectRatio="1" codec="0"> + <![CDATA[ https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4 ]]> + </MediaFile> + </MediaFiles> + <VideoClicks> + <ClickThrough id="1"> + <![CDATA[ http://www.example.com ]]> + </ClickThrough> + <ClickTracking> + <![CDATA[ http://www.example.com/click-tracking ]]> + </ClickTracking> + </VideoClicks> + <TrackingEvents> + <Tracking event="start">http://www.example.com/start</Tracking> + <Tracking event="firstQuartile">http://www.example.com/firstQuartile</Tracking> + <Tracking event="midpoint">http://www.example.com/midpoint</Tracking> + <Tracking event="thirdQuartile">http://www.example.com/thirdQuartile</Tracking> + <Tracking event="complete">http://www.example.com/complete</Tracking> + <Tracking event="mute">http://www.example.com/mute</Tracking> + <Tracking event="rewind">http://www.example.com/rewind</Tracking> + <Tracking event="pause">http://www.example.com/pause</Tracking> + <Tracking event="resume">http://www.example.com/resume</Tracking> + <Tracking event="fullscreen">http://www.example.com/fullscreen</Tracking> + <Tracking event="creativeView">http://www.example.com/creativeView</Tracking> + <Tracking event="acceptInvitation">http://www.example.com/acceptInvitation</Tracking> + <Tracking event="skip">http://www.example.com/skip</Tracking> + <Tracking event="progress" offset="00:00:05">http://www.example.com/progress5</Tracking> + <Tracking event="progress" offset="00:00:10">http://www.example.com/progress10</Tracking> + <Tracking event="progress" offset="00:00:15">http://www.example.com/progress15</Tracking> + <Tracking event="progress" offset="00:00:20">http://www.example.com/progress20</Tracking> + <Tracking event="progress" offset="00:00:25">http://www.example.com/progress25</Tracking> + </TrackingEvents> + <Icons> + <Icon> + <IconClicks> <!-- Will fall back to IconClickTrough if no TitleCTA extension found --> + <IconClickThrough>https://www.example.com/IconClickThrough</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + <UniversalAdId idRegistry="unknown">unknown</UniversalAdId> + </Creative> + </Creatives> + <Extensions> + </Extensions> + <Impression id=""> + <![CDATA[ http://www.example.com/impression ]]> + </Impression> + <ViewableImpression id="1543"> + <Viewable> + <![CDATA[ http://www.example.com/view-impression ]]> + </Viewable> + <NotViewable> + <![CDATA[ https://search.iabtechlab.com/error?errcode=102&imprid=s5-ea2f7f298e28c0c98374491aec3dfeb1&ts=1243 ]]> + </NotViewable> + <ViewUndetermined> + <![CDATA[ https://search.iabtechlab.com/error?errcode=102&imprid=s5-ea2f7f298e28c0c98374491aec3dfeb1&ts=1243 ]]> + </ViewUndetermined> + </ViewableImpression> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_linear_e2e.xml b/client/fluid-player/test/static/vast_linear_e2e.xml new file mode 100644 index 0000000..38717c1 --- /dev/null +++ b/client/fluid-player/test/static/vast_linear_e2e.xml @@ -0,0 +1,72 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="1" adType="video"> + <InLine> + <AdSystem version="1">Test</AdSystem> + <AdTitle>Vast Linear</AdTitle> + <Creatives> + <Creative sequence="1" id="1"> + <Linear skipoffset="00:00:02"> + <Duration>00:00:00</Duration> + <MediaFiles> + <MediaFile id="1" delivery="progressive" type="video/mp4" bitrate="500" width="400" height="300" minBitrate="360" maxBitrate="1080" scalable="1" maintainAspectRatio="1" codec="0"> + <![CDATA[ http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4 ]]> + </MediaFile> + </MediaFiles> + <VideoClicks> + <ClickThrough id="1"> + <![CDATA[ http://www.example.com ]]> + </ClickThrough> + <ClickTracking> + <![CDATA[ http://www.example.com/click-tracking ]]> + </ClickTracking> + </VideoClicks> + <TrackingEvents> + <Tracking event="start">http://www.example.com/start</Tracking> + <Tracking event="firstQuartile">http://www.example.com/firstQuartile</Tracking> + <Tracking event="midpoint">http://www.example.com/midpoint</Tracking> + <Tracking event="thirdQuartile">http://www.example.com/thirdQuartile</Tracking> + <Tracking event="complete">http://www.example.com/complete</Tracking> + <Tracking event="mute">http://www.example.com/mute</Tracking> + <Tracking event="rewind">http://www.example.com/rewind</Tracking> + <Tracking event="pause">http://www.example.com/pause</Tracking> + <Tracking event="resume">http://www.example.com/resume</Tracking> + <Tracking event="fullscreen">http://www.example.com/fullscreen</Tracking> + <Tracking event="creativeView">http://www.example.com/creativeView</Tracking> + <Tracking event="acceptInvitation">http://www.example.com/acceptInvitation</Tracking> + <Tracking event="skip">http://www.example.com/skip</Tracking> + <Tracking event="progress" offset="00:00:05">http://www.example.com/progress5</Tracking> + <Tracking event="progress" offset="00:00:10">http://www.example.com/progress10</Tracking> + <Tracking event="progress" offset="00:00:15">http://www.example.com/progress15</Tracking> + <Tracking event="progress" offset="00:00:20">http://www.example.com/progress20</Tracking> + <Tracking event="progress" offset="00:00:25">http://www.example.com/progress25</Tracking> + </TrackingEvents> + <Icons> + <Icon> + <IconClicks> <!-- Will fall back to IconClickTrough if no TitleCTA extension found --> + <IconClickThrough>https://www.example.com/IconClickThrough</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + <UniversalAdId idRegistry="unknown">unknown</UniversalAdId> + </Creative> + </Creatives> + <Extensions> + </Extensions> + <Impression id=""> + <![CDATA[ http://www.example.com/impression ]]> + </Impression> + <ViewableImpression id="1543"> + <Viewable> + <![CDATA[ http://www.example.com/view-impression ]]> + </Viewable> + <NotViewable> + <![CDATA[ https://search.iabtechlab.com/error?errcode=102&imprid=s5-ea2f7f298e28c0c98374491aec3dfeb1&ts=1243 ]]> + </NotViewable> + <ViewUndetermined> + <![CDATA[ https://search.iabtechlab.com/error?errcode=102&imprid=s5-ea2f7f298e28c0c98374491aec3dfeb1&ts=1243 ]]> + </ViewUndetermined> + </ViewableImpression> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_no_ad.xml b/client/fluid-player/test/static/vast_no_ad.xml new file mode 100644 index 0000000..5c08e88 --- /dev/null +++ b/client/fluid-player/test/static/vast_no_ad.xml @@ -0,0 +1,3 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + +</VAST> diff --git a/client/fluid-player/test/static/vast_nonlinear.xml b/client/fluid-player/test/static/vast_nonlinear.xml new file mode 100644 index 0000000..a8a74c6 --- /dev/null +++ b/client/fluid-player/test/static/vast_nonlinear.xml @@ -0,0 +1,46 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="20005"> + <InLine> + <AdSystem version="4.0">iabtechlab</AdSystem> + <AdTitle> + NonLinear Image + </AdTitle> + <Description> + <![CDATA[VAST 3.0 sample tag for Non Linear ad (i.e Overlay ad). Change the StaticResources to have a tag with your own content. Change NonLinear tag's parameters accordingly to view desired results. ]]> + </Description> + <Pricing model="cpm" currency="USD"> + <![CDATA[ 25.00 ]]> + </Pricing> + <Error> + <![CDATA[ + http://example.com/error + ]]> + </Error> + <Impression id="Impression-ID"> + <![CDATA[ + http://example.com/track/impression + ]]> + </Impression> + + <Creatives> + <Creative id="5480" sequence="1"> + <NonLinearAds> + <NonLinear width="480" height="90" minSuggestedDuration="00:00:10" scalable="true" maintainAspectRatio="true"> + <StaticResource creativeType="image/png"> + <![CDATA[ https://mms.businesswire.com/media/20150623005446/en/473787/21/iab_tech_lab.jpg ]]> + </StaticResource> + + <NonLinearClickTracking> + <![CDATA[http://example.com/trackingurl/clickTracking]]> + </NonLinearClickTracking> + <NonLinearClickThrough> + <![CDATA[http://iabtechlab.com]]> + </NonLinearClickThrough> + + </NonLinear> + </NonLinearAds> + </Creative> + </Creatives> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper.xml b/client/fluid-player/test/static/vast_wrapper.xml new file mode 100644 index 0000000..33163ce --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872550"> + <Wrapper> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/vast_linear.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + </Wrapper> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper_cyclical.xml b/client/fluid-player/test/static/vast_wrapper_cyclical.xml new file mode 100644 index 0000000..802e0dd --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper_cyclical.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872550"> + <Wrapper> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/vast_wrapper_cyclical.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + </Wrapper> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_false.xml b/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_false.xml new file mode 100644 index 0000000..b38b891 --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_false.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872550" sequence="1"> + <Wrapper fallbackOnNoAd="0" allowMultipleAds="0"> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/vast_no_ad.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension type="waterfall" fallback_index="0"> + <Extension/> + </Extension> + </Extensions> + </Wrapper> + </Ad> + <Ad id="5566276" sequence="2"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="78544088"> + <Linear> + <Duration>00:00:22.342</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>samplesite.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>This is ad #2 in an Ad Pod</MobileText> + <PCText>This is ad #2 in an Ad Pod</PCText> + <DisplayUrl><![CDATA[sample.com]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="4840678"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79253280"> + <Linear> + <Duration>00:00:30.0</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>hczog.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Play Game Now</MobileText> + <PCText>Play Game Now</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="5460430"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79167900"> + <Linear> + <Duration>00:00:24.799</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>www.zodertracker.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Try for Free</MobileText> + <PCText>Try for Free</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_false_http_error.xml b/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_false_http_error.xml new file mode 100644 index 0000000..9fc1dc2 --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_false_http_error.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872550" sequence="1"> + <Wrapper fallbackOnNoAd="0" allowMultipleAds="0"> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/404.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension type="waterfall" fallback_index="0"> + <Extension/> + </Extension> + </Extensions> + </Wrapper> + </Ad> + <Ad id="5566276"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="78544088"> + <Linear> + <Duration>00:00:22.342</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>samplesite.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>This is a stand alone Ad, from the Ad Buffet</MobileText> + <PCText>This is a stand alone Ad, from the Ad Buffet</PCText> + <DisplayUrl><![CDATA[sample.com]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="4840678" sequence="2"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79253280"> + <Linear> + <Duration>00:00:30.0</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>hczog.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>This is the second ad in a pod</MobileText> + <PCText>This is the second ad in a pod</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="5460430"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79167900"> + <Linear> + <Duration>00:00:24.799</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>www.zodertracker.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Try for Free</MobileText> + <PCText>Try for Free</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_true.xml b/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_true.xml new file mode 100644 index 0000000..207f39e --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_true.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872550" sequence="1"> + <Wrapper fallbackOnNoAd="1" allowMultipleAds="0"> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/vast_no_ad.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension type="waterfall" fallback_index="0"> + <Extension/> + </Extension> + </Extensions> + </Wrapper> + </Ad> + <Ad id="5566276"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="78544088"> + <Linear> + <Duration>00:00:22.342</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>samplesite.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>This is a stand alone Ad, from the Ad Buffet</MobileText> + <PCText>This is a stand alone Ad, from the Ad Buffet</PCText> + <DisplayUrl><![CDATA[sample.com]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="4840678" sequence="2"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79253280"> + <Linear> + <Duration>00:00:30.0</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>hczog.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Play Game Now</MobileText> + <PCText>Play Game Now</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="5460430"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79167900"> + <Linear> + <Duration>00:00:24.799</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>www.zodertracker.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Try for Free</MobileText> + <PCText>Try for Free</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_true_http_error.xml b/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_true_http_error.xml new file mode 100644 index 0000000..0425518 --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper_fallbackOnNoAd_true_http_error.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872550" sequence="1"> + <Wrapper fallbackOnNoAd="1" allowMultipleAds="0"> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/404.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension type="waterfall" fallback_index="0"> + <Extension/> + </Extension> + </Extensions> + </Wrapper> + </Ad> + <Ad id="5566276"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="78544088"> + <Linear> + <Duration>00:00:22.342</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>samplesite.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>This is a stand alone Ad, from the Ad Buffet</MobileText> + <PCText>This is a stand alone Ad, from the Ad Buffet</PCText> + <DisplayUrl><![CDATA[sample.com]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="4840678" sequence="2"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79253280"> + <Linear> + <Duration>00:00:30.0</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>hczog.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Play Game Now</MobileText> + <PCText>Play Game Now</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[/cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> + <Ad id="5460430"> + <InLine> + <AdSystem>ExoClick</AdSystem> + <AdTitle/> + <Impression id="exotr"><![CDATA[/impression]]></Impression> + <Error><![CDATA[/error]]></Error> + <Creatives> + <Creative sequence="1" id="79167900"> + <Linear> + <Duration>00:00:24.799</Duration> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/progress_10_seconds]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickThrough><![CDATA[/clicktrough]]></ClickThrough> + </VideoClicks> + <MediaFiles> + <MediaFile delivery="progressive" type="video/mp4"><![CDATA[https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4]]></MediaFile> + </MediaFiles> + <Icons> + <Icon> + <IconClicks> + <IconClickThrough>www.zodertracker.com</IconClickThrough> + </IconClicks> + </Icon> + </Icons> + </Linear> + </Creative> + </Creatives> + <Extensions> + <Extension> + <TitleCTA> + <MobileText>Try for Free</MobileText> + <PCText>Try for Free</PCText> + <DisplayUrl><![CDATA[]]></DisplayUrl> + <Tracking><![CDATA[cta_tracking]]></Tracking> + </TitleCTA> + </Extension> + </Extensions> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper_followAdditionalWrappers_false.xml b/client/fluid-player/test/static/vast_wrapper_followAdditionalWrappers_false.xml new file mode 100644 index 0000000..c18dfa7 --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper_followAdditionalWrappers_false.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872551"> + <Wrapper followAdditionalWrappers="false"> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/vast_wrapper.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + </Wrapper> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper_followAdditionalWrappers_true.xml b/client/fluid-player/test/static/vast_wrapper_followAdditionalWrappers_true.xml new file mode 100644 index 0000000..8a35b19 --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper_followAdditionalWrappers_true.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872551"> + <Wrapper followAdditionalWrappers="true"> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/vast_wrapper.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + </Wrapper> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vast_wrapper_to_ad_pod.xml b/client/fluid-player/test/static/vast_wrapper_to_ad_pod.xml new file mode 100644 index 0000000..aaf8906 --- /dev/null +++ b/client/fluid-player/test/static/vast_wrapper_to_ad_pod.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="4872550"> + <Wrapper allowMultipleAds="1" followAdditionalWrappers="0"> + <AdSystem>ExoClick</AdSystem> + <VASTAdTagURI><![CDATA[/static/vast_ad_pod.xml]]></VASTAdTagURI> + <Impression id="exotr"><![CDATA[/wrapper_impression]]></Impression> + <Error><![CDATA[/wrapper_error]]></Error> + <Creatives> + <Creative sequence="1" id="70160400"> + <Linear> + <TrackingEvents> + <Tracking id="prog_1" event="progress" offset="00:00:10.000"><![CDATA[/wrapper_progress]]></Tracking> + </TrackingEvents> + <VideoClicks> + <ClickTracking><![CDATA[/wrapper_click]]></ClickTracking> + </VideoClicks> + </Linear> + </Creative> + </Creatives> + </Wrapper> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/video-thumbnail.jpg b/client/fluid-player/test/static/video-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31532c353f15173e3d0afaf53fc47a0568b942bf GIT binary patch literal 109919 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ʻj3 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 Sh| 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 literal 0 HcmV?d00001 diff --git a/client/fluid-player/test/static/vpaid_linear.xml b/client/fluid-player/test/static/vpaid_linear.xml new file mode 100644 index 0000000..fadf221 --- /dev/null +++ b/client/fluid-player/test/static/vpaid_linear.xml @@ -0,0 +1,67 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="1234567"> + <InLine> + <AdSystem>GDFP</AdSystem> + <AdTitle>Linear VPAID Example</AdTitle> + <Description>Vpaid Linear Video Ad</Description> + <Error>http://www.example.com/error</Error> + <Impression>http://www.example.com/impression</Impression> + <ViewableImpression> + <Viewable> + <![CDATA[https://example.com/viewable-impression]]> + </Viewable> + <NotViewable> + <![CDATA[https://example.com/not-viewable-impression]]> + </NotViewable> + <ViewUndetermined> + <![CDATA[https://example.com/view-undetermined]]> + </ViewUndetermined> + </ViewableImpression> + <Creatives> + <Creative sequence="1"> + <Linear skipoffset="00:00:03"> + <Duration>00:00:10</Duration> + <TrackingEvents> + <Tracking event="start">http://www.example.com/start</Tracking> + <Tracking event="firstQuartile">http://www.example.com/firstQuartile</Tracking> + <Tracking event="midpoint">http://www.example.com/midpoint</Tracking> + <Tracking event="thirdQuartile">http://www.example.com/thirdQuartile</Tracking> + <Tracking event="complete">http://www.example.com/complete</Tracking> + <Tracking event="mute">http://www.example.com/mute</Tracking> + <Tracking event="unmute">http://www.example.com/unmute</Tracking> + <Tracking event="rewind">http://www.example.com/rewind</Tracking> + <Tracking event="pause">http://www.example.com/pause</Tracking> + <Tracking event="resume">http://www.example.com/resume</Tracking> + <Tracking event="fullscreen">http://www.example.com/fullscreen</Tracking> + <Tracking event="creativeView">http://www.example.com/creativeView</Tracking> + <Tracking event="acceptInvitation">http://www.example.com/acceptInvitation</Tracking> + </TrackingEvents> + <AdParameters> + <![CDATA[ +{"videos":[ {"url":"https://cdn.jsdelivr.net/npm/big-buck-bunny-1080p@0.0.6/video.mp4","mimetype":"video/mp4"}]} +]]> + </AdParameters> + <VideoClicks> + <ClickThrough id="123">http://google.com</ClickThrough> + <ClickTracking id="123">http://www.example.com/click</ClickTracking> + </VideoClicks> + <MediaFiles> + + <!-- + <MediaFile apiFramework="VPAID" type="application/javascript"> + https://secure-ds.serving-sys.com/BurstingCachedScripts/VPAID/HTML5_1_40_0_0/VPAIDAPI.js + </MediaFile> + --> + + <MediaFile apiFramework="VPAID" type="application/javascript"> + https://googleads.github.io/googleads-ima-html5/vpaid/linear/VpaidVideoAd.js + </MediaFile> + + </MediaFiles> + </Linear> + </Creative> + <Creative sequence="1"/> + </Creatives> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/test/static/vpaid_nonlinear.xml b/client/fluid-player/test/static/vpaid_nonlinear.xml new file mode 100644 index 0000000..dce1811 --- /dev/null +++ b/client/fluid-player/test/static/vpaid_nonlinear.xml @@ -0,0 +1,42 @@ +<VAST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vast4.xsd" version="4.2"> + <Ad id="1234567"> + <InLine> + <AdSystem></AdSystem> + <AdTitle>NonLinear VPAID JS</AdTitle> + <Description>Vpaid NonLinear Ad</Description> + <Error>http://www.example.com/error</Error> + <Impression>http://www.example.com/impression</Impression> + <Creatives> + <Creative sequence="1"> + <NonLinearAds> + <TrackingEvents> + <Tracking event="start">http://www.example.com/start</Tracking> + <Tracking event="firstQuartile">http://www.example.com/firstQuartile</Tracking> + <Tracking event="midpoint">http://www.example.com/midpoint</Tracking> + <Tracking event="thirdQuartile">http://www.example.com/thirdQuartile</Tracking> + <Tracking event="complete">http://www.example.com/complete</Tracking> + <Tracking event="mute">http://www.example.com/mute</Tracking> + <Tracking event="rewind">http://www.example.com/rewind</Tracking> + <Tracking event="pause">http://www.example.com/pause</Tracking> + <Tracking event="resume">http://www.example.com/resume</Tracking> + <Tracking event="fullscreen">http://www.example.com/fullscreen</Tracking> + <Tracking event="creativeView">http://www.example.com/creativeView</Tracking> + <Tracking event="acceptInvitation">http://www.example.com/acceptInvitation</Tracking> + </TrackingEvents> + <NonLinear apiFramework="VPAID" width="480" height="90" id="overlay-1"> + <AdParameters> + <![CDATA[{"overlays":["https://googleads.github.io/googleads-ima-html5/media/NonLinearVpaid.png"], "videos":[ {"url":"https://iab-publicfiles.s3.amazonaws.com/vast/VAST-4.0-Short-Intro.mp4","mimetype":"video/mp4"}]} ]]> + </AdParameters> + <StaticResource creativeType="application/javascript"> + <![CDATA[https://googleads.github.io/googleads-ima-html5/vpaid/nonlinear/VpaidNonLinear.js]]> + </StaticResource> + <NonLinearClickThrough id="GDFP"> + <![CDATA[ http://google.com ]]> + </NonLinearClickThrough> + </NonLinear> + </NonLinearAds> + </Creative> + </Creatives> + </InLine> + </Ad> +</VAST> diff --git a/client/fluid-player/vendor/webvtt.js b/client/fluid-player/vendor/webvtt.js new file mode 100644 index 0000000..26160ac --- /dev/null +++ b/client/fluid-player/vendor/webvtt.js @@ -0,0 +1,702 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// Not intended to be fast, but if you can make it faster, please help out! + +var WebVTTParser = function() { + this.parse = function(input, mode) { + //XXX need global search and replace for \0 + var NEWLINE = /\r\n|\r|\n/, + startTime = Date.now(), + linePos = 0, + lines = input.split(NEWLINE), + alreadyCollected = false, + cues = [], + errors = [] + function err(message, col) { + errors.push({message:message, line:linePos+1, col:col}) + } + + var line = lines[linePos], + lineLength = line.length, + signature = "WEBVTT", + bom = 0, + signature_length = signature.length + + /* Byte order mark */ + if (line[0] === "\ufeff") { + bom = 1 + signature_length += 1 + } + /* SIGNATURE */ + if ( + lineLength < signature_length || + line.indexOf(signature) !== 0+bom || + lineLength > signature_length && + line[signature_length] !== " " && + line[signature_length] !== "\t" + ) { + err("No valid signature. (File needs to start with \"WEBVTT\".)") + } + + linePos++ + + /* HEADER */ + while(lines[linePos] != "" && lines[linePos] != undefined) { + err("No blank line after the signature.") + if(lines[linePos].indexOf("-->") != -1) { + alreadyCollected = true + break + } + linePos++ + } + + /* CUE LOOP */ + while(lines[linePos] != undefined) { + var cue + while(!alreadyCollected && lines[linePos] == "") { + linePos++ + } + if(!alreadyCollected && lines[linePos] == undefined) + break + + /* CUE CREATION */ + cue = { + id:"", + startTime:0, + endTime:0, + pauseOnExit:false, + direction:"horizontal", + snapToLines:true, + linePosition:"auto", + textPosition:50, + size:100, + alignment:"middle", + text:"", + tree:null + } + + var parseTimings = true + + if(lines[linePos].indexOf("-->") == -1) { + cue.id = lines[linePos] + + /* COMMENTS + Not part of the specification's parser as these would just be ignored. However, + we want them to be conforming and not get "Cue identifier cannot be standalone". + */ + if(/^NOTE($|[ \t])/.test(cue.id)) { // .startsWith fails in Chrome + linePos++ + while(lines[linePos] != "" && lines[linePos] != undefined) { + if(lines[linePos].indexOf("-->") != -1) + err("Cannot have timestamp in a comment.") + linePos++ + } + continue + } + + linePos++ + + if(lines[linePos] == "" || lines[linePos] == undefined) { + err("Cue identifier cannot be standalone.") + continue + } + + if(lines[linePos].indexOf("-->") == -1) { + parseTimings = false + err("Cue identifier needs to be followed by timestamp.") + } + } + + /* TIMINGS */ + alreadyCollected = false + var timings = new WebVTTCueTimingsAndSettingsParser(lines[linePos], err) + var previousCueStart = 0 + if(cues.length > 0) { + previousCueStart = cues[cues.length-1].startTime + } + if(parseTimings && !timings.parse(cue, previousCueStart)) { + /* BAD CUE */ + + cue = null + linePos++ + + /* BAD CUE LOOP */ + while(lines[linePos] != "" && lines[linePos] != undefined) { + if(lines[linePos].indexOf("-->") != -1) { + alreadyCollected = true + break + } + linePos++ + } + continue + } + linePos++ + + /* CUE TEXT LOOP */ + while(lines[linePos] != "" && lines[linePos] != undefined) { + if(lines[linePos].indexOf("-->") != -1) { + err("Blank line missing before cue.") + alreadyCollected = true + break + } + if(cue.text != "") + cue.text += "\n" + cue.text += lines[linePos] + linePos++ + } + + /* CUE TEXT PROCESSING */ + var cuetextparser = new WebVTTCueTextParser(cue.text, err, mode) + cue.tree = cuetextparser.parse(cue.startTime, cue.endTime) + cues.push(cue) + } + cues.sort(function(a, b) { + if (a.startTime < b.startTime) + return -1 + if (a.startTime > b.startTime) + return 1 + if (a.endTime > b.endTime) + return -1 + if (a.endTime < b.endTime) + return 1 + return 0 + }) + /* END */ + return {cues:cues, errors:errors, time:Date.now()-startTime} + } +} + +var WebVTTCueTimingsAndSettingsParser = function(line, errorHandler) { + var SPACE = /[\u0020\t\f]/, + NOSPACE = /[^\u0020\t\f]/, + line = line, + pos = 0, + err = function(message) { + errorHandler(message, pos+1) + }, + spaceBeforeSetting = true + function skip(pattern) { + while( + line[pos] != undefined && + pattern.test(line[pos]) + ) { + pos++ + } + } + function collect(pattern) { + var str = "" + while( + line[pos] != undefined && + pattern.test(line[pos]) + ) { + str += line[pos] + pos++ + } + return str + } + /* http://dev.w3.org/html5/webvtt/#collect-a-webvtt-timestamp */ + function timestamp() { + var units = "minutes", + val1, + val2, + val3, + val4 + // 3 + if(line[pos] == undefined) { + err("No timestamp found.") + return + } + // 4 + if(!/\d/.test(line[pos])) { + err("Timestamp must start with a character in the range 0-9.") + return + } + // 5-7 + val1 = collect(/\d/) + if(val1.length > 2 || parseInt(val1, 10) > 59) { + units = "hours" + } + // 8 + if(line[pos] != ":") { + err("No time unit separator found.") + return + } + pos++ + // 9-11 + val2 = collect(/\d/) + if(val2.length != 2) { + err("Must be exactly two digits.") + return + } + // 12 + if(units == "hours" || line[pos] == ":") { + if(line[pos] != ":") { + err("No seconds found or minutes is greater than 59.") + return + } + pos++ + val3 = collect(/\d/) + if(val3.length != 2) { + err("Must be exactly two digits.") + return + } + } else { + val3 = val2 + val2 = val1 + val1 = "0" + } + // 13 + if(line[pos] != ".") { + err("No decimal separator (\".\") found.") + return + } + pos++ + // 14-16 + val4 = collect(/\d/) + if(val4.length != 3) { + err("Milliseconds must be given in three digits.") + return + } + // 17 + if(parseInt(val2, 10) > 59) { + err("You cannot have more than 59 minutes.") + return + } + if(parseInt(val3, 10) > 59) { + err("You cannot have more than 59 seconds.") + return + } + return parseInt(val1, 10) * 60 * 60 + parseInt(val2, 10) * 60 + parseInt(val3, 10) + parseInt(val4, 10) / 1000 + } + + /* http://dev.w3.org/html5/webvtt/#parse-the-webvtt-settings */ + function parseSettings(input, cue) { + var settings = input.split(SPACE), + seen = [] + for(var i=0; i < settings.length; i++) { + if(settings[i] == "") + continue + + var index = settings[i].indexOf(':'), + setting = settings[i].slice(0, index) + value = settings[i].slice(index + 1) + + if(seen.indexOf(setting) != -1) { + err("Duplicate setting.") + } + seen.push(setting) + + if(value == "") { + err("No value for setting defined.") + return + } + + if(setting == "vertical") { // writing direction + if(value != "rl" && value != "lr") { + err("Writing direction can only be set to 'rl' or 'rl'.") + continue + } + cue.direction = value + } else if(setting == "line") { // line position + if(!/\d/.test(value)) { + err("Line position takes a number or percentage.") + continue + } + if(value.indexOf("-", 1) != -1) { + err("Line position can only have '-' at the start.") + continue + } + if(value.indexOf("%") != -1 && value.indexOf("%") != value.length-1) { + err("Line position can only have '%' at the end.") + continue + } + if(value[0] == "-" && value[value.length-1] == "%") { + err("Line position cannot be a negative percentage.") + continue + } + if(value[value.length-1] == "%") { + if(parseInt(value, 10) > 100) { + err("Line position cannot be >100%.") + continue + } + cue.snapToLines = false + } + cue.linePosition = parseInt(value, 10) + } else if(setting == "position") { // text position + if(value[value.length-1] != "%") { + err("Text position must be a percentage.") + continue + } + if(parseInt(value, 10) > 100) { + err("Size cannot be >100%.") + continue + } + cue.textPosition = parseInt(value, 10) + } else if(setting == "size") { // size + if(value[value.length-1] != "%") { + err("Size must be a percentage.") + continue + } + if(parseInt(value, 10) > 100) { + err("Size cannot be >100%.") + continue + } + cue.size = parseInt(value, 10) + } else if(setting == "align") { // alignment + var alignValues = ["start", "middle", "end", "left", "right"] + if(alignValues.indexOf(value) == -1) { + err("Alignment can only be set to one of " + alignValues.join(", ") + ".") + continue + } + cue.alignment = value + } else { + err("Invalid setting.") + } + } + } + + this.parse = function(cue, previousCueStart) { + skip(SPACE) + cue.startTime = timestamp() + if(cue.startTime == undefined) { + return + } + if(cue.startTime < previousCueStart) { + err("Start timestamp is not greater than or equal to start timestamp of previous cue.") + } + if(NOSPACE.test(line[pos])) { + err("Timestamp not separated from '-->' by whitespace.") + } + skip(SPACE) + // 6-8 + if(line[pos] != "-") { + err("No valid timestamp separator found.") + return + } + pos++ + if(line[pos] != "-") { + err("No valid timestamp separator found.") + return + } + pos++ + if(line[pos] != ">") { + err("No valid timestamp separator found.") + return + } + pos++ + if(NOSPACE.test(line[pos])) { + err("'-->' not separated from timestamp by whitespace.") + } + skip(SPACE) + cue.endTime = timestamp() + if(cue.endTime == undefined) { + return + } + if(cue.endTime <= cue.startTime) { + err("End timestamp is not greater than start timestamp.") + } + + if(NOSPACE.test(line[pos])) { + spaceBeforeSetting = false + } + skip(SPACE) + parseSettings(line.substring(pos), cue) + return true + } + this.parseTimestamp = function() { + var ts = timestamp() + if(line[pos] != undefined) { + err("Timestamp must not have trailing characters.") + return + } + return ts + } +} + +var WebVTTCueTextParser = function(line, errorHandler, mode) { + var line = line, + pos = 0, + err = function(message) { + if(mode == "metadata") + return + errorHandler(message, pos+1) + } + + this.parse = function(cueStart, cueEnd) { + var result = {children:[]}, + current = result, + timestamps = [] + + function attach(token) { + current.children.push({type:"object", name:token[1], classes:token[2], children:[], parent:current}) + current = current.children[current.children.length-1] + } + function inScope(name) { + var node = current + while(node) { + if(node.name == name) + return true + node = node.parent + } + return + } + + while(line[pos] != undefined) { + var token = nextToken() + if(token[0] == "text") { + current.children.push({type:"text", value:token[1], parent:current}) + } else if(token[0] == "start tag") { + if(mode == "chapters") + err("Start tags not allowed in chapter title text.") + var name = token[1] + if(name != "v" && name != "lang" && token[3] != "") { + err("Only <v> and <lang> can have an annotation.") + } + if( + name == "c" || + name == "i" || + name == "b" || + name == "u" || + name == "ruby" + ) { + attach(token) + } else if(name == "rt" && current.name == "ruby") { + attach(token) + } else if(name == "v") { + if(inScope("v")) { + err("<v> cannot be nested inside itself.") + } + attach(token) + current.value = token[3] // annotation + if(!token[3]) { + err("<v> requires an annotation.") + } + } else if(name == "lang") { + attach(token) + current.value = token[3] // language + } else { + err("Incorrect start tag.") + } + } else if(token[0] == "end tag") { + if(mode == "chapters") + err("End tags not allowed in chapter title text.") + // XXX check <ruby> content + if(token[1] == current.name) { + current = current.parent + } else if(token[1] == "ruby" && current.name == "rt") { + current = current.parent.parent + } else { + err("Incorrect end tag.") + } + } else if(token[0] == "timestamp") { + if(mode == "chapters") + err("Timestamp not allowed in chapter title text.") + var timings = new WebVTTCueTimingsAndSettingsParser(token[1], err), + timestamp = timings.parseTimestamp() + if(timestamp != undefined) { + if(timestamp <= cueStart || timestamp >= cueEnd) { + err("Timestamp must be between start timestamp and end timestamp.") + } + if(timestamps.length > 0 && timestamps[timestamps.length-1] >= timestamp) { + err("Timestamp must be greater than any previous timestamp.") + } + current.children.push({type:"timestamp", value:timestamp, parent:current}) + timestamps.push(timestamp) + } + } + } + while(current.parent) { + if(current.name != "v") { + err("Required end tag missing.") + } + current = current.parent + } + return result + } + + function nextToken() { + var state = "data", + result = "", + buffer = "", + classes = [] + while(line[pos-1] != undefined || pos == 0) { + var c = line[pos] + if(state == "data") { + if(c == "&") { + buffer = c + state = "escape" + } else if(c == "<" && result == "") { + state = "tag" + } else if(c == "<" || c == undefined) { + return ["text", result] + } else { + result += c + } + } else if(state == "escape") { + if(c == "&") { + err("Incorrect escape.") + result += buffer + buffer = c + } else if(/[abglmnsprt]/.test(c)) { + buffer += c + } else if(c == ";") { + if(buffer == "&") { + result += "&" + } else if(buffer == "<") { + result += "<" + } else if(buffer == ">") { + result += ">" + } else if(buffer == "&lrm") { + result += "\u200e" + } else if(buffer == "&rlm") { + result += "\u200f" + } else if(buffer == " ") { + result += "\u00A0" + } else { + err("Incorrect escape.") + result += buffer + ";" + } + state = "data" + } else if(c == "<" || c == undefined) { + err("Incorrect escape.") + result += buffer + return ["text", result] + } else { + err("Incorrect escape.") + result += buffer + c + state = "data" + } + } else if(state == "tag") { + if(c == "\t" || c == "\n" || c == "\f" || c == " ") { + state = "start tag annotation" + } else if(c == ".") { + state = "start tag class" + } else if(c == "/") { + state = "end tag" + } else if(/\d/.test(c)) { + result = c + state = "timestamp tag" + } else if(c == ">" || c == undefined) { + if(c == ">") { + pos++ + } + return ["start tag", "", [], ""] + } else { + result = c + state = "start tag" + } + } else if(state == "start tag") { + if(c == "\t" || c == "\f" || c == " ") { + state = "start tag annotation" + } else if(c == "\n") { + buffer = c + state = "start tag annotation" + } else if(c == ".") { + state = "start tag class" + } else if(c == ">" || c == undefined) { + if(c == ">") { + pos++ + } + return ["start tag", result, [], ""] + } else { + result += c + } + } else if(state == "start tag class") { + if(c == "\t" || c == "\f" || c == " ") { + classes.push(buffer) + buffer = "" + state = "start tag annotation" + } else if(c == "\n") { + classes.push(buffer) + buffer = c + state = "start tag annotation" + } else if(c == ".") { + classes.push(buffer) + buffer = "" + } else if(c == ">" || c == undefined) { + if(c == ">") { + pos++ + } + classes.push(buffer) + return ["start tag", result, classes, ""] + } else { + buffer += c + } + } else if(state == "start tag annotation") { + if(c == ">" || c == undefined) { + if(c == ">") { + pos++ + } + buffer = buffer.split(/[\u0020\t\f\r\n]+/).filter(function(item) { if(item) return true }).join(" ") + return ["start tag", result, classes, buffer] + } else { + buffer +=c + } + } else if(state == "end tag") { + if(c == ">" || c == undefined) { + if(c == ">") { + pos++ + } + return ["end tag", result] + } else { + result += c + } + } else if(state == "timestamp tag") { + if(c == ">" || c == undefined) { + if(c == ">") { + pos++ + } + return ["timestamp", result] + } else { + result += c + } + } else { + err("Never happens.") // The joke is it might. + } + // 8 + pos++ + } + } +} + +var WebVTTSerializer = function() { + function serializeTree(tree) { + var result = "" + for (var i = 0; i < tree.length; i++) { + var node = tree[i] + if(node.type == "text") { + result += node.value + } else if(node.type == "object") { + result += "<" + node.name + if(node.classes) { + for(var y = 0; y < node.classes.length; y++) { + result += "." + node.classes[y] + } + } + if(node.value) { + result += " " + node.value + } + result += ">" + if(node.children) + result += serializeTree(node.children) + result += "</" + node.name + ">" + } else { + result += "<" + node.value + ">" + } + } + return result + } + function serializeCue(cue) { + return cue.startTime + " " + cue.endTime + "\n" + serializeTree(cue.tree.children) + "\n\n" + } + this.serialize = function(cues) { + var result = "" + for(var i=0;i<cues.length;i++) { + result += serializeCue(cues[i]) + } + return result + } +} + +export default WebVTTParser; diff --git a/client/fluid-player/webpack.config.js b/client/fluid-player/webpack.config.js new file mode 100644 index 0000000..8265036 --- /dev/null +++ b/client/fluid-player/webpack.config.js @@ -0,0 +1,185 @@ +const path = require('path'); +const fs = require('fs'); +const webpack = require('webpack'); +const semver = require('semver'); +const cheerio = require('cheerio'); +const HtmlWebpackPlugin = require('html-webpack-plugin') +const CopyPlugin = require('copy-webpack-plugin'); + +// Loading the current package.json - will be used to determine version etc. +const packageJSON = require(path.resolve(__dirname, 'package.json')); + +// Validate package version is valid semver +if (!semver.valid(packageJSON.version)) { + throw 'Invalid package version - ' + packageJSON.version; +} + +// Distribution options configure how build paths are going to be configured. +const getDistOptions = (mode) => { + const fullVersion = packageJSON.version; + const majorVersion = semver.major(packageJSON.version); + const cdnRoot = packageJSON.com_fluidplayer.cdn; + + switch (mode) { + case 'development': + return { + path: path.resolve(__dirname, 'dist'), + publicPath: '/' + }; + case 'current': + return { + path: path.resolve(__dirname, 'dist-cdn/v' + majorVersion + '/current/'), + publicPath: cdnRoot + '/v' + majorVersion + '/current/' + }; + case 'versioned': + return { + path: path.resolve(__dirname, 'dist-cdn/' + fullVersion + '/'), + publicPath: cdnRoot + '/' + fullVersion + '/' + }; + default: + throw 'Unknown distribution type provided in --dist!'; + } +} + +// Webpack configuration +module.exports = (env, argv) => { + const wpMode = typeof argv.mode !== 'undefined' ? argv.mode : 'development'; + const wpDebug = wpMode === 'development' && typeof env.debug !== 'undefined' && !!env.debug; + const wpDist = typeof env.dist !== 'undefined' ? env.dist : 'development'; + const wpDistOptions = getDistOptions(wpDist); + + if ('development' !== wpDist && (wpMode !== 'production' || wpDebug)) { + throw 'Building a production distribution in development mode or with debug enabled is not allowed!' + } + + const plugins = [ + // Define common variables for use in Fluid Player + new webpack.DefinePlugin({ + FP_BUILD_VERSION: JSON.stringify(packageJSON.version), + FP_HOMEPAGE: JSON.stringify(packageJSON.homepage), + FP_ENV: JSON.stringify(wpMode), + FP_DEBUG: JSON.stringify(wpDebug), + FP_WITH_CSS: false + }) + ]; + + // Development mode builds and development server specifics + if ('development' === wpMode) { + // Locate all E2E cases + const caseFiles = []; + fs.readdirSync(path.resolve(__dirname, 'test/html/')).forEach(file => { + if (file === 'special-cases' || file === 'e2e') { + return; + } + + const absPath = path.resolve(__dirname, 'test/html/', file); + const caseHtml = cheerio.load(fs.readFileSync(absPath)); + const publicName = file.replace('.tpl', ''); + + plugins.push(new HtmlWebpackPlugin({ + template: path.resolve(__dirname, 'test/html/', file), + inject: false, + filename: publicName, + scriptLoading: "blocking", + })); + + caseFiles.push({ + file: publicName, + name: caseHtml('title').text() + }); + }); + + fs.readdirSync(path.resolve(__dirname, 'test/html/special-cases')).forEach(file => { + const publicName = file.replace('.tpl', ''); + + plugins.push(new HtmlWebpackPlugin({ + template: path.resolve(__dirname, 'test/html/special-cases', file), + inject: false, + filename: publicName, + scriptLoading: "blocking", + })); + }); + + fs.readdirSync(path.resolve(__dirname, 'test/html/e2e')).forEach(file => { + const publicName = file.replace('.tpl', ''); + + plugins.push(new HtmlWebpackPlugin({ + template: path.resolve(__dirname, 'test/html/e2e', file), + inject: false, + filename: publicName, + scriptLoading: "blocking", + })); + }); + + // Emit all cases as separate HTML pages + plugins.push(new HtmlWebpackPlugin({ + template: path.resolve(__dirname, 'test/index.html'), + filename: 'index.html', + inject: false, + templateParameters: { + cases: caseFiles + } + })); + + // Copy static assets for E2E + plugins.push(new CopyPlugin( + { + patterns: [ + { from: path.resolve(__dirname, 'test/static/'), to: path.resolve(wpDistOptions.path, 'static') } + ] + } + )); + } + + return { + devServer: { + static: wpDistOptions.path, + // index: 'index.html', + // allowedHosts: "all", // To use with remote hosting (ie: ngrok) + }, + devtool: wpMode === 'development' ? 'source-map' : false, + cache: wpMode !== 'development' ? { + type: "filesystem", + buildDependencies: { + // This makes all dependencies of this file - build dependencies + config: [__filename], + // By default webpack and loaders are build dependencies + } + } : undefined, + plugins, + entry: { + fluidplayer: './src/browser.js' + }, + optimization: { + minimize: wpMode !== 'development' + }, + output: { + filename: '[name].min.js', + chunkFilename: '[name].[chunkhash].min.js', + path: wpDistOptions.path, + publicPath: wpDistOptions.publicPath + }, + module: { + rules: [ + { + test: /\.m?js$/, + exclude: /node_modules/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + } + } + }, + { + test: /\.css$/i, + use: ['style-loader', 'css-loader'], + }, + { + test: /\.svg/, + type: 'asset' + }, + ], + } + }; +} diff --git a/client/fluid-player/yarn.lock b/client/fluid-player/yarn.lock new file mode 100644 index 0000000..0ce4a39 --- /dev/null +++ b/client/fluid-player/yarn.lock @@ -0,0 +1,3899 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz" + integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.20.12", "@babel/core@^7.4.0-0": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.20.7": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + 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== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": + 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.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz" + integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== + 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.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + 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== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + 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== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + 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== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz" + integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== + dependencies: + "@babel/types" "^7.20.7" + +"@babel/helper-module-imports@^7.18.6": + 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== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + 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.20.10" + "@babel/types" "^7.20.7" + +"@babel/helper-optimise-call-expression@^7.18.6": + 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== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + 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== + +"@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz" + integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.20.7" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2": + 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== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + 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== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + 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== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + 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== + +"@babel/helper-validator-option@^7.18.6": + 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== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.20.7": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": + version "7.20.15" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz" + integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz" + integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.7" + +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz" + integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz" + integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz" + integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz" + integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz" + integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz" + integrity sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz" + integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.20.7" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz" + integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/template" "^7.20.7" + +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz" + integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz" + integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz" + integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== + dependencies: + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-simple-access" "^7.20.2" + +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz" + integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz" + integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.19.0": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz" + integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.8.4": + version "7.17.9" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.18.10", "@babel/template@^7.20.7": + 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.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@jridgewell/gen-mapping@^0.1.0": + 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" + +"@jridgewell/gen-mapping@^0.3.0": + 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" + +"@jridgewell/gen-mapping@^0.3.2": + 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" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/source-map@^0.3.2": + 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" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": + 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" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@nodelib/fs.scandir@2.1.5": + 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" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + 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" + +"@playwright/test@^1.49.0": + version "1.49.0" + resolved "https://registry.npmjs.org/@playwright/test/-/test-1.49.0.tgz" + integrity sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw== + dependencies: + playwright "1.49.0" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.21.0" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz" + integrity sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.31": + version "4.17.33" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz" + integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.16" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz" + integrity sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.31" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + 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== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/node@*", "@types/node@^22.9.1": + version "22.10.1" + resolved "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== + dependencies: + undici-types "~6.20.0" + +"@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== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.0" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + dependencies: + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/ws@^8.5.1": + version "8.5.4" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz" + integrity sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w== + +"@webpack-cli/info@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz" + integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== + +"@webpack-cli/serve@^2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz" + integrity sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn@^8, acorn@^8.5.0, acorn@^8.7.1: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0, ajv@^8.8.2: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + 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: + color-convert "^1.9.0" + +anymatch@~3.1.2: + 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" + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +babel-loader@^9.1.2: + version "9.1.2" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz" + integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== + dependencies: + find-cache-dir "^3.3.2" + schema-utils "^4.0.0" + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bcp-47-match@^1.0.0, bcp-47-match@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz" + integrity sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w== + +bcp-47-normalize@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz" + integrity sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A== + dependencies: + bcp-47 "^1.0.0" + bcp-47-match "^1.0.0" + +bcp-47@^1.0.0: + version "1.0.8" + resolved "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz" + integrity sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag== + dependencies: + is-alphabetical "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.0" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz" + integrity sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + 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" + +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, "browserslist@>= 4.21.0": + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +caniuse-lite@^1.0.30001449: + version "1.0.30001450" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz" + integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +cheerio-select@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz" + integrity sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g== + dependencies: + css-select "^4.3.0" + css-what "^6.0.1" + domelementtype "^2.2.0" + domhandler "^4.3.1" + domutils "^2.8.0" + +cheerio@^1.0.0-rc.3: + version "1.0.0-rc.10" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz" + integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== + dependencies: + cheerio-select "^1.5.0" + dom-serializer "^1.3.2" + domhandler "^4.2.0" + htmlparser2 "^6.1.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + tslib "^2.2.0" + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +clean-css@^5.2.2: + version "5.3.2" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + dependencies: + source-map "~0.6.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +codem-isoboxer@0.3.6: + version "0.3.6" + resolved "https://registry.npmjs.org/codem-isoboxer/-/codem-isoboxer-0.3.6.tgz" + integrity sha512-LuO8/7LW6XuR5ERn1yavXAfodGRhuY2yP60JTZIw5yNYMCE5lUVbk3NFUCJxjnphQH+Xemp5hOGb1LgUXm00Xw== + +color-convert@^1.9.0: + 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" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + 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== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== + dependencies: + fast-glob "^3.2.11" + glob-parent "^6.0.1" + globby "^13.1.1" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + +core-js-compat@^3.25.1: + version "3.27.2" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz" + integrity sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg== + dependencies: + browserslist "^4.21.4" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cross-spawn@^7.0.3: + 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" + +css-loader@^6.7.3: + version "6.7.3" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz" + integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.19" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-select@^4.1.3, css-select@^4.3.0: + 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" + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +dashjs@^4.5.2: + version "4.5.2" + resolved "https://registry.npmjs.org/dashjs/-/dashjs-4.5.2.tgz" + integrity sha512-WXPk0lPDSaHjiSVoVRh2jQPiMmB1alKUH8hV2CVmaI0vPUeT1wIY7madVE38SthfOmwS9IJViv1RrxrxdGjElg== + dependencies: + bcp-47-match "^1.0.3" + bcp-47-normalize "^1.1.1" + codem-isoboxer "0.3.6" + es6-promise "^4.2.8" + fast-deep-equal "2.0.1" + html-entities "^1.2.1" + imsc "^1.0.2" + localforage "^1.7.1" + ua-parser-js "^1.0.2" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + 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" + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.4.0" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1, dom-serializer@^1.3.2: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.5.2, domutils@^2.8.0: + 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" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.284: + version "1.4.285" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.285.tgz" + integrity sha512-47o4PPgxfU1KMNejz+Dgaodf7YTcg48uOfV1oM6cs3adrl2+7R+dHkt3Jpxqo0LRCbGJEzTKMUt0RdvByb/leg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + 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" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-deep-equal@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== + +fast-glob@^3.2.11: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fill-range@^7.0.1: + 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" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.2: + 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: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0: + 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" + +follow-redirects@^1.0.0: + version "1.15.0" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-monkey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + 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== + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + 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" + +global@^4.3.1: + version "4.4.0" + resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^13.1.1: + 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" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has@^1.0.3: + 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" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hls.js@^1.5.13: + version "1.5.15" + resolved "https://registry.npmjs.org/hls.js/-/hls.js-1.5.15.tgz" + integrity sha512-6cD7xN6bycBHaXz2WyPIaHn/iXFizE5au2yvY5q9aC4wfihxAr16C9fUy4nxh2a3wOw0fEgLRa9dN6wsYjlpNg== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^1.2.1: + version "1.4.0" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@2.0.0: + 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" + +http-parser-js@>=0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz" + integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imsc@^1.0.2: + version "1.1.3" + resolved "https://registry.npmjs.org/imsc/-/imsc-1.1.3.tgz" + integrity sha512-IY0hMkVTNoqoYwKEp5UvNNKp/A5jeJUOrIO7judgOyhHT+xC6PA4VBOMAOhdtAYbMRHx9DTgI8p6Z6jhYQPFDA== + dependencies: + sax "1.2.1" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-binary-path@~2.1.0: + 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" + +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + 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" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.1: + 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== + +json-schema-traverse@^0.4.1: + 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== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +lie@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz" + integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +localforage@^1.7.1: + version "1.10.0" + resolved "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lru-cache@^5.1.1: + 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" + +lru-cache@^6.0.0: + 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" + +make-dir@^3.0.2: + 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" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.4.13" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz" + integrity sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg== + dependencies: + fs-monkey "^1.0.3" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + 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" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-releases@^2.0.8: + version "2.0.9" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz" + integrity sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + 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" + +nth-check@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +object-inspect@^1.9.0: + version "1.12.0" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.npmjs.org/open/-/open-8.4.0.tgz" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + 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" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +panolens@^0.12.1: + version "0.12.1" + resolved "https://registry.npmjs.org/panolens/-/panolens-0.12.1.tgz" + integrity sha512-2hpjm+rRnDdaLD5Bak49K0Y9/X6vOr1OcyJx5piSA6sCOs1tsgchMgKIwpSGCMpBMHWZ10E/Cz4BIwyXYebt5g== + dependencies: + three "^0.105.2" + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parse5-htmlparser2-tree-adapter@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + 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: + find-up "^4.0.0" + +playwright-core@1.49.0: + version "1.49.0" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz" + integrity sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA== + +playwright@1.49.0: + version "1.49.0" + resolved "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz" + integrity sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A== + dependencies: + playwright-core "1.49.0" + optionalDependencies: + fsevents "2.3.2" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.10" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.1.0, postcss@^8.4.19: + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +process-nextick-args@~2.0.0: + 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== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + 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" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.0.1: + 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" + +readable-stream@^3.0.6: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.14.2, resolve@^1.20.0: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1, safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" + integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o=sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== + +schema-utils@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.1.1: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.1.2: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + 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" + +serialize-javascript@^6.0.0: + 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" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.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" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + 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" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + 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" + +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@~0.5.20: + 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" + +source-map@^0.6.0, source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string_decoder@^1.1.1, string_decoder@~1.1.1: + 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" + +strip-ansi@^6.0.1: + 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" + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +style-loader@^3.3.1: + version "3.3.1" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== + +supports-color@^5.3.0: + 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" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.1.3: + version "5.3.6" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + +terser@^5.10.0, terser@^5.14.1: + version "5.16.3" + resolved "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz" + integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +three@^0.105.2: + version "0.105.2" + resolved "https://registry.npmjs.org/three/-/three-0.105.2.tgz" + integrity sha512-L3Al37k4g3hVbgFFS251UVtIc25chhyN0/RvXzR0C+uIBToV6EKDG+MZzEXm9L2miGUVMK27W46/VkP6WUZXMg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + 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" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tslib@^2.0.3, tslib@^2.2.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +ua-parser-js@^1.0.2: + version "1.0.33" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz" + integrity sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ== + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +videojs-vtt.js@^0.15.4: + version "0.15.4" + resolved "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.4.tgz" + integrity sha512-r6IhM325fcLb1D6pgsMkTQT1PpFdUdYZa1iqk7wJEu+QlibBwATPfPc9Bg8Jiym0GE5yP1AG2rMLu+QMVWkYtA== + dependencies: + global "^4.3.1" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webpack-cli@^5.1.1, webpack-cli@5.x.x: + version "5.1.1" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz" + integrity sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^2.1.0" + "@webpack-cli/info" "^2.0.1" + "@webpack-cli/serve" "^2.0.4" + colorette "^2.0.14" + commander "^10.0.1" + cross-spawn "^7.0.3" + envinfo "^7.7.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.11.1: + version "4.11.1" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.75.0, webpack@>=5, webpack@5.x.x: + version "5.75.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz" + integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.7.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.10.0" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.4.2: + version "8.12.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz" + integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== diff --git a/client/index.html b/client/index.html new file mode 100644 index 0000000..b7528e0 --- /dev/null +++ b/client/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html prefix="og: https://ogp.me/ns#"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title><%- title %> + <%- analytics %> + + + +
+ + diff --git a/client/jsconfig.json b/client/jsconfig.json deleted file mode 100644 index 5c02774..0000000 --- a/client/jsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "module": "commonJS", - "target": "es2015", - "moduleResolution": "node" - }, - "exclude": ["node_modules", "dist", "dev", "src"] -} diff --git a/client/package-lock.json b/client/package-lock.json index 6492016..0209635 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,3127 +1,114 @@ { "name": "kemono-2-client", - "version": "0.2.1", + "version": "1.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "kemono-2-client", - "version": "0.2.1", + "version": "1.4.0", + "hasInstallScript": true, "license": "ISC", "dependencies": { - "@babel/runtime": "^7.22.10", - "@uppy/core": "^3.4.0", - "@uppy/dashboard": "^3.5.1", - "@uppy/form": "^3.0.2", - "@uppy/tus": "^3.1.3", - "diff": "^5.1.0", - "fluid-player": "^3.22.0", - "micromodal": "^0.4.10", + "@babel/runtime": "^7.26.7", + "@dr.pogodin/react-helmet": "^3.0.1", + "@uppy/core": "^4.4.2", + "@uppy/dashboard": "^4.3.1", + "@uppy/form": "^4.1.1", + "@uppy/tus": "^4.2.2", + "clsx": "^2.1.1", + "diff": "^7.0.0", + "fluid-player": "file:./fluid-player", + "micromodal": "^0.6.1", "purecss": "^3.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.5.0", "sha256-wasm": "^2.2.2", - "whatwg-fetch": "^3.6.17" + "swagger-ui-react": "^5.20.7" }, "devDependencies": { - "@babel/core": "^7.22.10", - "@babel/plugin-transform-runtime": "^7.22.10", - "@babel/preset-env": "^7.22.10", - "babel-loader": "^8.3.0", + "@babel/core": "^7.26.8", + "@babel/plugin-transform-runtime": "^7.26.8", + "@babel/preset-env": "^7.26.8", + "@babel/preset-react": "^7.26.3", + "@babel/preset-typescript": "^7.26.0", + "@hyperjump/json-schema": "^1.11.0", + "@modyfi/vite-plugin-yaml": "^1.1.0", + "@types/micromodal": "^0.3.5", + "@types/node": "^22.14.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@types/sha256-wasm": "^2.2.3", + "@types/swagger-ui-react": "^5.18.0", + "@types/webpack-bundle-analyzer": "^4.7.0", + "@vitejs/plugin-legacy": "^6.0.1", + "@vitejs/plugin-react": "^4.3.4", + "ajv": "^8.17.1", + "babel-loader": "^9.2.1", "buffer": "^6.0.3", - "copy-webpack-plugin": "^8.1.1", - "css-loader": "^5.2.7", - "dotenv": "^8.6.0", - "fs-extra": "^10.1.0", - "html-webpack-plugin": "^5.5.3", - "mini-css-extract-plugin": "^1.6.2", - "postcss": "^8.4.28", - "postcss-loader": "^7.3.3", - "postcss-preset-env": "^9.1.1", - "rimraf": "^3.0.2", - "sass": "^1.66.0", - "sass-loader": "^11.1.1", + "copy-webpack-plugin": "^12.0.2", + "css-loader": "^7.1.2", + "fs-extra": "^11.3.0", + "html-webpack-plugin": "^5.6.3", + "mini-css-extract-plugin": "^2.9.2", + "postcss": "^8.5.1", + "postcss-loader": "^8.1.1", + "postcss-preset-env": "^10.1.3", + "rimraf": "^6.0.1", + "sass": "^1.84.0", + "sass-loader": "^16.0.4 ", "stream-browserify": "^3.0.0", - "style-loader": "^2.0.0", - "webpack": "^5.88.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "style-loader": "^4.0.0", + "terser": "^5.39.0", + "ts-loader": "^9.5.2", + "typescript": "^5.7.3", + "vite": "^6.1.0", + "vite-css-modules": "^1.8.4", + "vite-plugin-html": "^3.2.2", + "vite-plugin-static-copy": "^2.2.0", + "webpack": "^5.97.1", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.0", "webpack-manifest-plugin": "^5.0.0", - "webpack-merge": "^5.9.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.10", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", - "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.10", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", - "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", - "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.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.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", - "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", - "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", - "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", - "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.10.tgz", - "integrity": "sha512-RchI7HePu1eu0CYNKHHHQdfenZcM4nz8rew5B1VWqeRKdcwW5aQ5HeG9eTUbWiAS1UrmHVLmoxTWHt3iLD/NhA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", - "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.10", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.10", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.10", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.10", - "@babel/plugin-transform-parameters": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.10", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", - "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.10", - "@babel/types": "^7.22.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.4.tgz", - "integrity": "sha512-zXMGsJetbLoXe+gjEES07MEGjL0Uy3hMxmnGtVBrRpVKr5KV9OgCB09zr/vLrsEtoVQTgJFewxaU8IYSAE4tjg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-3.0.0.tgz", - "integrity": "sha512-rBODd1rY01QcenD34QxbQxLc1g+Uh7z1X/uzTHNQzJUnFCT9/EZYI7KWq+j0YfWMXJsRJ8lVkqBcB0R/qLr+yg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-1.1.3.tgz", - "integrity": "sha512-7mJZ8gGRtSQfQKBQFi5N0Z+jzNC0q8bIkwojP1W0w+APzEqHu5wJoGVsvKxVnVklu9F8tW1PikbBRseYnAdv+g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-1.2.3.tgz", - "integrity": "sha512-YaEnCoPTdhE4lPQFH3dU4IEk8S+yCnxS88wMv45JzlnMfZp57hpqA6qf2gX8uv7IJTJ/43u6pTQmhy7hCjlz7g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/color-helpers": "^3.0.0", - "@csstools/css-calc": "^1.1.3" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.1.tgz", - "integrity": "sha512-xrvsmVUtefWMWQsGgFffqWSK03pZ1vfDki4IVIIUxxDKnGBzqNgv0A7SB1oXtVNEkcVO8xi1ZrTL29HhSu5kGA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.0" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.0.tgz", - "integrity": "sha512-wErmsWCbsmig8sQKkM6pFhr/oPha1bHfvxsUY5CYSQxwyhA9Ulrs8EqCgClhg4Tgg2XapVstGqSVcz0xOYizZA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - } - }, - "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.4.tgz", - "integrity": "sha512-V/OUXYX91tAC1CDsiY+HotIcJR+vPtzrX8pCplCpT++i8ThZZsq5F5dzZh/bDM3WUOjrvC1ljed1oSJxMfjqhw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" - } - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-4.0.0.tgz", - "integrity": "sha512-dVPVVqQG0FixjM9CG/+8eHTsCAxRKqmNh6H69IpruolPlnEF1611f2AoLK8TijTSAsqBSclKd4WHs1KUb/LdJw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/selector-specificity": "^3.0.0", - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-3.0.1.tgz", - "integrity": "sha512-+vrvCQeUifpMeyd42VQ3JPWGQ8cO19+TnGbtfq1SDSgZzRapCQO4aK9h/jhMOKPnxGzbA57oS0aHgP/12N9gSQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-color-parser": "^1.2.2", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/postcss-progressive-custom-properties": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-color-mix-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.1.tgz", - "integrity": "sha512-Z5cXkLiccKIVcUTe+fAfjUD7ZUv0j8rq3dSoBpM6I49dcw+50318eYrwUZa3nyb4xNx7ntNNUPmesAc87kPE2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-color-parser": "^1.2.2", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/postcss-progressive-custom-properties": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-exponential-functions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.0.tgz", - "integrity": "sha512-FPndJ/7oGlML7/4EhLi902wGOukO0Nn37PjwOQGc0BhhjQPy3np3By4d3M8s9Cfmp9EHEKgUHRN2DQ5HLT/hTw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-calc": "^1.1.3", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-3.0.0.tgz", - "integrity": "sha512-ntkGj+1uDa/u6lpjPxnkPcjJn7ChO/Kcy08YxctOZI7vwtrdYvFhmE476dq8bj1yna306+jQ9gzXIG/SWfOaRg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-gradients-interpolation-method": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.1.tgz", - "integrity": "sha512-IHeFIcksjI8xKX7PWLzAyigM3UvJdZ4btejeNa7y/wXxqD5dyPPZuY55y8HGTrS6ETVTRqfIznoCPtTzIX7ygQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-color-parser": "^1.2.2", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/postcss-progressive-custom-properties": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.1.tgz", - "integrity": "sha512-FYe2K8EOYlL1BUm2HTXVBo6bWAj0xl4khOk6EFhQHy/C5p3rlr8OcetzQuwMeNQ3v25nB06QTgqUHoOUwoEqhA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-color-parser": "^1.2.2", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.0.tgz", - "integrity": "sha512-FH3+zfOfsgtX332IIkRDxiYLmgwyNk49tfltpC6dsZaO4RV2zWY6x9VMIC5cjvmjlDO7DIThpzqaqw2icT8RbQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-4.0.0.tgz", - "integrity": "sha512-0I6siRcDymG3RrkNTSvHDMxTQ6mDyYE8awkcaHNgtYacd43msl+4ZWDfQ1yZQ/viczVWjqJkLmPiRHSgxn5nZA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/selector-specificity": "^3.0.0", - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-float-and-clear": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-2.0.0.tgz", - "integrity": "sha512-Wki4vxsF6icRvRz8eF9bPpAvwaAt0RHwhVOyzfoFg52XiIMjb6jcbHkGxwpJXP4DVrnFEwpwmrz5aTRqOW82kg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-resize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-2.0.0.tgz", - "integrity": "sha512-lCQ1aX8c5+WI4t5EoYf3alTzJNNocMqTb+u1J9CINdDhFh1fjovqK+0aHalUHsNstZmzFPNzIkU4Mb3eM9U8SA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-logical-viewport-units": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.1.tgz", - "integrity": "sha512-R5s19SscS7CHoxvdYNMu2Y3WDwG4JjdhsejqjunDB1GqfzhtHSvL7b5XxCkUWqm2KRl35hI6kJ4HEaCDd/3BXg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-tokenizer": "^2.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-minmax": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.0.7.tgz", - "integrity": "sha512-5LGLdu8cJgRPmvkjUNqOPKIKeHbyQmoGKooB5Rh0mp5mLaNI9bl+IjFZ2keY0cztZYsriJsGf6Lu8R5XetuwoQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-calc": "^1.1.3", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/media-query-list-parser": "^2.1.4" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.2.tgz", - "integrity": "sha512-kQJR6NvTRidsaRjCdHGjra2+fLoFiDQOm5B2aZrhmXqng/hweXjruboKzB326rxQO2L0m0T+gCKbZgyuncyhLg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/media-query-list-parser": "^2.1.4" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-3.0.0.tgz", - "integrity": "sha512-HsB66aDWAouOwD/GcfDTS0a7wCuVWaTpXcjl5VKP0XvFxDiU+r0T8FG7xgb6ovZNZ+qzvGIwRM+CLHhDgXrYgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-3.0.0.tgz", - "integrity": "sha512-6Nw55PRXEKEVqn3bzA8gRRPYxr5tf5PssvcE5DRA/nAxKgKtgNZMCHCSd1uxTCWeyLnkf6h5tYRSB0P1Vh/K/A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.1.tgz", - "integrity": "sha512-3TIz+dCPlQPzz4yAEYXchUpfuU2gRYK4u1J+1xatNX85Isg4V+IbLyppblWLV4Vb6npFF8qsHN17rNuxOIy/6w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-color-parser": "^1.2.2", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/postcss-progressive-custom-properties": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.0.0.tgz", - "integrity": "sha512-2/D3CCL9DN2xhuUTP8OKvKnaqJ1j4yZUxuGLsCUOQ16wnDAuMLKLkflOmZF5tsPh/02VPeXRmqIN+U595WAulw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-relative-color-syntax": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.1.tgz", - "integrity": "sha512-9B8br/7q0bjD1fV3yE22izjc7Oy5hDbDgwdFEz207cdJHYC9yQneJzP3H+/w3RgC7uyfEVhyyhkGRx5YAfJtmg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-color-parser": "^1.2.2", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/postcss-progressive-custom-properties": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-scope-pseudo-class": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-3.0.0.tgz", - "integrity": "sha512-GFNVsD97OuEcfHmcT0/DAZWAvTM/FFBDQndIOLawNc1Wq8YqpZwBdHa063Lq+Irk7azygTT+Iinyg3Lt76p7rg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.1.tgz", - "integrity": "sha512-y1sykToXorFE+5cjtp//xAMWEAEple0kcZn2QhzEFIZDDNvGOCp5JvvmmPGsC3eDlj6yQp70l9uXZNLnimEYfA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-calc": "^1.1.3", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-3.0.0.tgz", - "integrity": "sha512-BAa1MIMJmEZlJ+UkPrkyoz3DC7kLlIl2oDya5yXgvUrelpwxddgz8iMp69qBStdXwuMyfPx46oZcSNx8Z0T2eA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/color-helpers": "^3.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.1.tgz", - "integrity": "sha512-hW+JPv0MPQfWC1KARgvJI6bisEUFAZWSvUNq/khGCupYV/h6Z9R2ZFz0Xc633LXBst0ezbXpy7NpnPurSx5Klw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-calc": "^1.1.3", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.0.tgz", - "integrity": "sha512-P0JD1WHh3avVyKKRKjd0dZIjCEeaBer8t1BbwGMUDtSZaLhXlLNBqZ8KkqHzYWXOJgHleXAny2/sx8LYl6qhEA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz", - "integrity": "sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.13" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@transloadit/prettier-bytes": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.9.tgz", - "integrity": "sha512-pCvdmea/F3Tn4hAtHqNXmjcixSaroJJ+L3STXlYJdir1g1m2mRQpWbN8a4SvgQtaw2930Ckhdx8qXdXBFMKbAA==" - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", - "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", - "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/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@uppy/companion-client": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.3.0.tgz", - "integrity": "sha512-ogU0QieutbM0A6/yxK91w1Ge4KTC+eAGQMk6JKZu58b435dLScRTCsWGFSSIvt1U8RDY7YDCyl51zawh+A+5CQ==", - "dependencies": { - "@uppy/utils": "^5.4.3", - "namespace-emitter": "^2.0.1" - } - }, - "node_modules/@uppy/core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.4.0.tgz", - "integrity": "sha512-95NNyXZfuNfB6sgna41fNNPRuTqjrHdlVzkXaJlZzghAckIxNz2CoeMYA1rtgn9o8ykKa2Zdz4kk2MEq8Qy4fw==", - "dependencies": { - "@transloadit/prettier-bytes": "0.0.9", - "@uppy/store-default": "^3.0.3", - "@uppy/utils": "^5.4.3", - "lodash": "^4.17.21", - "mime-match": "^1.0.2", - "namespace-emitter": "^2.0.1", - "nanoid": "^4.0.0", - "preact": "^10.5.13" - } - }, - "node_modules/@uppy/dashboard": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-3.5.1.tgz", - "integrity": "sha512-Fb3FFg4n3QuoLsFb2Cp2wnlEXJ9bYq/uy4d68USqrkAAHiFiT+/y07Lvrf2BN4H5UFCzWEMhgaBrwo792DwxjQ==", - "dependencies": { - "@transloadit/prettier-bytes": "0.0.7", - "@uppy/informer": "^3.0.3", - "@uppy/provider-views": "^3.5.0", - "@uppy/status-bar": "^3.2.4", - "@uppy/thumbnail-generator": "^3.0.4", - "@uppy/utils": "^5.4.3", - "classnames": "^2.2.6", - "is-shallow-equal": "^1.0.1", - "lodash": "^4.17.21", - "memoize-one": "^6.0.0", - "nanoid": "^4.0.0", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.4.0" - } - }, - "node_modules/@uppy/dashboard/node_modules/@transloadit/prettier-bytes": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz", - "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==" - }, - "node_modules/@uppy/form": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@uppy/form/-/form-3.0.2.tgz", - "integrity": "sha512-o1wQy23Yh8q8oh+ZHxwx6RAJFWcoRL9p42l6W1X+9y9MyduXYyHPIRvib6QOp9MHJiqITDpAQQyoHPHSkdYi8Q==", - "dependencies": { - "@uppy/utils": "^5.3.0", - "get-form-data": "^3.0.0" - }, - "peerDependencies": { - "@uppy/core": "^3.2.0" - } - }, - "node_modules/@uppy/informer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-3.0.3.tgz", - "integrity": "sha512-jMMlZ0bCJ2ruJJ0LMl7pJrM/b0e9vjVEHvYYdQghnRSRDSMONcTJXEqNZ0Lu4x7OZR1SGvqqchFk7n3vAsuERw==", - "dependencies": { - "@uppy/utils": "^5.4.3", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.4.0" - } - }, - "node_modules/@uppy/provider-views": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-3.5.0.tgz", - "integrity": "sha512-xSp5xQ6NsPLS2XJdsdBQCLgQELEd0BvVM2R34/XFyGTSqeA4NJKHfM6kSKwjW/jkj26CyFN5nth6CGeNaaKQ+w==", - "dependencies": { - "@uppy/utils": "^5.4.3", - "classnames": "^2.2.6", - "nanoid": "^4.0.0", - "p-queue": "^7.3.4", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.4.0" - } - }, - "node_modules/@uppy/status-bar": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-3.2.4.tgz", - "integrity": "sha512-WuK0LRmz7H7iBDV0VO+iUNoXmhbyeCEAWzslX0nqhkGuMchIQprVwd80ZegACySajqcpV1RDNxdhmgtCbRn8wA==", - "dependencies": { - "@transloadit/prettier-bytes": "0.0.9", - "@uppy/utils": "^5.4.3", - "classnames": "^2.2.6", - "preact": "^10.5.13" - }, - "peerDependencies": { - "@uppy/core": "^3.4.0" - } - }, - "node_modules/@uppy/store-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-3.0.3.tgz", - "integrity": "sha512-/zlvQNj4HjkthI+7dNdj/8mOlTg1Zb1gJ/ZsOxof0g3xXD+OAwm7asRnOwpfj2dos+lExdW/zMn8XsRGsuvb6Q==" - }, - "node_modules/@uppy/thumbnail-generator": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-3.0.4.tgz", - "integrity": "sha512-f7E+4F6UWunX3jnV3wfL+k5zQaukKmD1z2qYbmRg5OuE9CxDJrNdAVk14KDAi79seejPJa6VVfCgGjTlIGLaRA==", - "dependencies": { - "@uppy/utils": "^5.4.3", - "exifr": "^7.0.0" - }, - "peerDependencies": { - "@uppy/core": "^3.4.0" - } - }, - "node_modules/@uppy/tus": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@uppy/tus/-/tus-3.1.3.tgz", - "integrity": "sha512-AY4tXHfeM+btnG9uKWc2ZiPhnB29xEFTudVbVmC/vEN6oBeKuJVF9NF7z9s34cRxptvvrZsv8pnRkvPJkTdfyQ==", - "dependencies": { - "@uppy/companion-client": "^3.3.0", - "@uppy/utils": "^5.4.3", - "tus-js-client": "^3.0.0" - }, - "peerDependencies": { - "@uppy/core": "^3.4.0" - } - }, - "node_modules/@uppy/utils": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.4.3.tgz", - "integrity": "sha512-ewQTWQ5Wu1/ocz/lLCkhoXQwHLRktFK4CxrOsZmeCLK9LxjD1GOwSFjOuL199WDQKXiCle6SVlAJGQ3SDlXVkg==", - "dependencies": { - "lodash": "^4.17.21", - "preact": "^10.5.13" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { + "webpack-merge": "^6.0.1", + "yaml": "^2.7.0" + } + }, + "fluid-player": { + "version": "3.46.0", + "license": "MIT", + "dependencies": { + "dashjs": "^4.5.2", + "es6-promise": "^4.2.8", + "hls.js": "^1.5.13", + "panolens": "^0.12.1", + "videojs-vtt.js": "^0.15.4" + }, + "devDependencies": { + "@babel/core": "^7.20.12", + "@babel/preset-env": "^7.20.2", + "@playwright/test": "^1.49.0", + "@types/node": "^22.9.1", + "babel-loader": "^9.1.2", + "cheerio": "^1.0.0-rc.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.7.3", + "html-webpack-plugin": "^5.5.0", + "semver": "^7.3.2", + "style-loader": "^3.3.1", + "webpack": "^5.75.0", + "webpack-cli": "^5.1.1", + "webpack-dev-server": "^4.11.1" + } + }, + "fluid-player/node_modules/@webpack-cli/configtest": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -3130,11 +117,12 @@ "webpack-cli": "5.x.x" } }, - "node_modules/@webpack-cli/info": { + "fluid-player/node_modules/@webpack-cli/info": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -3143,11 +131,12 @@ "webpack-cli": "5.x.x" } }, - "node_modules/@webpack-cli/serve": { + "fluid-player/node_modules/@webpack-cli/serve": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -3161,3923 +150,19 @@ } } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/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==", - "dev": true - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ajv/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==", - "dev": true - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", + "fluid-player/node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", "dev": true, + "license": "MIT", "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "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": ">=8" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", - "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001520", - "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": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dev": true, - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/bcp-47": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz", - "integrity": "sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/bcp-47-match": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz", - "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/bcp-47-normalize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz", - "integrity": "sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A==", - "dependencies": { - "bcp-47": "^1.0.0", - "bcp-47-match": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/bonjour-service/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==", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "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/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001521", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", - "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "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/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/codem-isoboxer": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/codem-isoboxer/-/codem-isoboxer-0.3.9.tgz", - "integrity": "sha512-4XOTqEzBWrGOZaMd+sTED2hLpzfBbiQCf1W6OBGkIHqk1D8uwy8WFLazVbdQwfDpQ+vf39lqTGPa9IhWW0roTA==" - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combine-errors": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz", - "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==", - "dependencies": { - "custom-error-instance": "2.1.1", - "lodash.uniqby": "4.5.0" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-webpack-plugin": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz", - "integrity": "sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.5", - "glob-parent": "^5.1.1", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", - "dev": true, - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-6.0.0.tgz", - "integrity": "sha512-VbfLlOWO7sBHBTn6pwDQzc07Z0SDydgDBfNfCE0nvrehdBNv9RKsuupIRa/qal0+fBZhAALyQDPMKz5lnvcchw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-6.0.0.tgz", - "integrity": "sha512-X+r+JBuoO37FBOWVNhVJhxtSBUFHgHbrcc0CjFT28JEdOw1qaDwABv/uunyodUuSy2hMPe9j/HjssxSlvUmKjg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/selector-specificity": "^3.0.0", - "postcss-selector-parser": "^6.0.13", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", - "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.15", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^3.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/css-loader/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/css-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-loader/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/css-loader/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/css-prefers-color-scheme": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-9.0.0.tgz", - "integrity": "sha512-03QGAk/FXIRseDdLb7XAiu6gidQ0Nd8945xuM7VFVPpc6goJsG9uIO8xQjTxwbPdPIIV4o4AJoOJyt8gwDl67g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssdb": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.7.0.tgz", - "integrity": "sha512-1hN+I3r4VqSNQ+OmMXxYexnumbOONkSil0TWMebVXHtzYW4tRRPovUNHPHj2d4nrgOuYJ8Vs3XwvywsuwwXNNA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ] - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/custom-error-instance": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz", - "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==" - }, - "node_modules/dashjs": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/dashjs/-/dashjs-4.7.1.tgz", - "integrity": "sha512-RPUqJGjR4lXrApHfNOd9G6885q8GpQ4rWecYBMdJjXCtnM8sNg9bhqic3Jl0bTgR0Xzl7Jd86qRc1YZbq1wjPw==", - "dependencies": { - "bcp-47-match": "^1.0.3", - "bcp-47-normalize": "^1.1.1", - "codem-isoboxer": "0.3.9", - "es6-promise": "^4.2.8", - "fast-deep-equal": "2.0.1", - "html-entities": "^1.2.1", - "imsc": "^1.1.3", - "localforage": "^1.7.1", - "path-browserify": "^1.0.1", - "ua-parser-js": "^1.0.2" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "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", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.496", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz", - "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "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==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/envinfo": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", - "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "dev": true - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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": ">=8.0.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exifr": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz", - "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==" - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==" - }, - "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==", - "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", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fluid-player": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/fluid-player/-/fluid-player-3.22.0.tgz", - "integrity": "sha512-SyR7hBjB1+sHAApE4Emo5xcIXVz72c68BhLwaGb8EjwEJ9NnWOtMHZGDZeOg4sg2DN5OWo95XPzUhNSHxOmtLw==", - "dependencies": { - "dashjs": "^4.5.2", - "es6-promise": "^4.2.8", - "hls.js": "^1.3.2", - "panolens": "^0.12.1", - "videojs-vtt.js": "^0.15.4" - } - }, - "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==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-form-data/-/get-form-data-3.0.0.tgz", - "integrity": "sha512-1d53Kn08wlPuLu31/boF1tW2WRYKw3xAWae3mqcjqpDjoqVBtXolbQnudbbEFyFWL7+2SLGRAFdotxNY06V7MA==" - }, - "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==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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": { - "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/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/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hls.js": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.4.10.tgz", - "integrity": "sha512-wAVSj4Fm2MqOHy5+BlYnlKxXvJlv5IuZHjlzHu18QmjRzSDFQiUDWdHs5+NsFMQrgKEBwuWDcyvaMC9dUzJ5Uw==" - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "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/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "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/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/immutable": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.2.tgz", - "integrity": "sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "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/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imsc": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/imsc/-/imsc-1.1.3.tgz", - "integrity": "sha512-IY0hMkVTNoqoYwKEp5UvNNKp/A5jeJUOrIO7judgOyhHT+xC6PA4VBOMAOhdtAYbMRHx9DTgI8p6Z6jhYQPFDA==", - "dependencies": { - "sax": "1.2.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==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", - "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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-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==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-shallow-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shallow-equal/-/is-shallow-equal-1.0.1.tgz", - "integrity": "sha512-lq5RvK+85Hs5J3p4oA4256M1FEffzmI533ikeDHvJd42nouRRx5wBzt36JuviiGe5dIPyHON/d0/Up+PBo6XkQ==" - }, - "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": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", - "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-base64": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", - "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "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/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dependencies": { - "lie": "3.1.1" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._baseiteratee": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", - "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==", - "dependencies": { - "lodash._stringtopath": "~4.8.0" - } - }, - "node_modules/lodash._basetostring": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", - "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==" - }, - "node_modules/lodash._baseuniq": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", - "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==", - "dependencies": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "node_modules/lodash._createset": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz", - "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==" - }, - "node_modules/lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==" - }, - "node_modules/lodash._stringtopath": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz", - "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==", - "dependencies": { - "lodash._basetostring": "~4.12.0" - } - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/lodash.uniqby": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz", - "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==", - "dependencies": { - "lodash._baseiteratee": "~4.7.0", - "lodash._baseuniq": "~4.6.0" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromodal": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/micromodal/-/micromodal-0.4.10.tgz", - "integrity": "sha512-BUrEnzMPFBwK8nOE4xUDYHLrlGlLULQVjpja99tpJQPSUEWgw3kTLp1n1qv0HmKU29AiHE7Y7sMLiRziDK4ghQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz", - "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", - "dependencies": { - "wildcard": "^1.1.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==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", - "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/namespace-emitter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz", - "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" - }, - "node_modules/nanoassert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", - "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" - }, - "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": "^14 || ^16 || >=18" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "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==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.3.4.tgz", - "integrity": "sha512-esox8CWt0j9EZECFvkFl2WNPat8LN4t7WWeXq73D9ha0V96qPRufApZi4ZhPwXAln1uVVal429HVVKPa2X0yQg==", - "dependencies": { - "eventemitter3": "^4.0.7", - "p-timeout": "^5.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/panolens": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/panolens/-/panolens-0.12.1.tgz", - "integrity": "sha512-2hpjm+rRnDdaLD5Bak49K0Y9/X6vOr1OcyJx5piSA6sCOs1tsgchMgKIwpSGCMpBMHWZ10E/Cz4BIwyXYebt5g==", - "dependencies": { - "three": "^0.105.2" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", - "dev": true, - "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": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-6.0.2.tgz", - "integrity": "sha512-IRuCwwAAQbgaLhxQdQcIIK0dCVXg3XDUnzgKD8iwdiYdwU4rMWRWyl/W9/0nA4ihVpq5pyALiHB2veBJ0292pw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.0.tgz", - "integrity": "sha512-kaWTgnhRKFtfMF8H0+NQBFxgr5CGg05WGe07Mc1ld6XHwwRWlqSbHOW0zwf+BtkBQpsdVUu7+gl9dtdvhWMedw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-9.0.2.tgz", - "integrity": "sha512-SfPjgr//VQ/DOCf80STIAsdAs7sbIbxATvVmd+Ec7JvR8onz9pjawhq3BJM3Pie40EE3TyB0P6hft16D33Nlyg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-9.0.0.tgz", - "integrity": "sha512-RmUFL+foS05AKglkEoqfx+KFdKRVmqUAxlHNz4jLqIi7046drIPyerdl4B6j/RA2BSP8FI8gJcHmLRrwJOMnHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-media": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.0.tgz", - "integrity": "sha512-NxDn7C6GJ7X8TsWOa8MbCdq9rLERRLcPfQSp856k1jzMreL8X9M6iWk35JjPRIb9IfRnVohmxAylDRx7n4Rv4g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.3", - "@csstools/css-parser-algorithms": "^2.3.0", - "@csstools/css-tokenizer": "^2.1.1", - "@csstools/media-query-list-parser": "^2.1.2" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-properties": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-13.3.0.tgz", - "integrity": "sha512-q4VgtIKSy5+KcUvQ0WxTjDy9DZjQ5VCXAZ9+tT9+aPMbA0z6s2t1nMw0QHszru1ib5ElkXl9JUpYYU37VVUs7g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.4", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-7.1.4.tgz", - "integrity": "sha512-TU2xyUUBTlpiLnwyE2ZYMUIYB41MKMkBZ8X8ntkqRDQ8sdBLhFFsPgNcOliBd5+/zcK51C9hRnSE7hKUJMxQSw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.3", - "@csstools/css-parser-algorithms": "^2.3.0", - "@csstools/css-tokenizer": "^2.1.1", - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-8.0.0.tgz", - "integrity": "sha512-Oy5BBi0dWPwij/IA+yDYj+/OBMQ9EPqAzTHeSNUYrUWdll/PRJmcbiUj0MNcsBi681I1gcSTLvMERPaXzdbvJg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.0.tgz", - "integrity": "sha512-wR8npIkrIVUTicUpCWSSo1f/g7gAEIH70FMqCugY4m4j6TX4E0T2Q5rhfO0gqv00biBZdLyb+HkW8x6as+iJNQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^3.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-9.0.0.tgz", - "integrity": "sha512-zA4TbVaIaT8npZBEROhZmlc+GBKE8AELPHXE7i4TmIUEQhw/P/mSJfY9t6tBzpQ1rABeGtEOHYrW4SboQeONMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.0.tgz", - "integrity": "sha512-E7+J9nuQzZaA37D/MUZMX1K817RZGDab8qw6pFwzAkDd/QtlWJ9/WTKmzewNiuxzeq6WWY7ATiRePVoDKp+DnA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-5.0.0.tgz", - "integrity": "sha512-YjsEEL6890P7MCv6fch6Am1yq0EhQCJMXyT4LBohiu87+4/WqR7y5W3RIv53WdA901hhytgRvjlrAhibhW4qsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-image-set-function": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-6.0.0.tgz", - "integrity": "sha512-bg58QnJexFpPBU4IGPAugAPKV0FuFtX5rHYNSKVaV91TpHN7iwyEzz1bkIPCiSU5+BUN00e+3fV5KFrwIgRocw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-lab-function": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-6.0.1.tgz", - "integrity": "sha512-/Xl6JitDh7jWkcOLxrHcAlEaqkxyaG3g4iDMy5RyhNaiQPJ9Egf2+Mxp1W2qnH5jB2bj59f3RbdKmC6qx1IcXA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/css-color-parser": "^1.2.2", - "@csstools/css-parser-algorithms": "^2.3.1", - "@csstools/css-tokenizer": "^2.2.0", - "@csstools/postcss-progressive-custom-properties": "^3.0.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", - "dev": true, - "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { "node": ">= 14.15.0" @@ -7087,780 +172,52 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "webpack": "^5.1.0" } }, - "node_modules/postcss-loader/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/postcss-loader/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/postcss-loader/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/postcss-logical": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.0.tgz", - "integrity": "sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nesting": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-12.0.1.tgz", - "integrity": "sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/selector-specificity": "^3.0.0", - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-2.0.0.tgz", - "integrity": "sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-5.0.0.tgz", - "integrity": "sha512-2rlxDyeSics/hC2FuMdPnWiP9WUPZ5x7FTuArXLFVpaSQ2woPSfZS4RD59HuEokbZhs/wPUQJ1E3MT6zVv94MQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-9.0.0.tgz", - "integrity": "sha512-qLEPD9VPH5opDVemwmRaujODF9nExn24VOC3ghgVLEvfYN7VZLwJHes0q/C9YR5hI2UC3VgBE8Wkdp1TxCXhtg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-preset-env": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-9.1.1.tgz", - "integrity": "sha512-rMPEqyTLm8JLbvaHnDAdQg6SN4Z/NDOsm+CRefg4HmSOiNpTcBXaw4RAaQbfTNe8BB75l4NpoQ6sMdrutdEpdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "@csstools/postcss-cascade-layers": "^4.0.0", - "@csstools/postcss-color-function": "^3.0.1", - "@csstools/postcss-color-mix-function": "^2.0.1", - "@csstools/postcss-exponential-functions": "^1.0.0", - "@csstools/postcss-font-format-keywords": "^3.0.0", - "@csstools/postcss-gradients-interpolation-method": "^4.0.1", - "@csstools/postcss-hwb-function": "^3.0.1", - "@csstools/postcss-ic-unit": "^3.0.0", - "@csstools/postcss-is-pseudo-class": "^4.0.0", - "@csstools/postcss-logical-float-and-clear": "^2.0.0", - "@csstools/postcss-logical-resize": "^2.0.0", - "@csstools/postcss-logical-viewport-units": "^2.0.1", - "@csstools/postcss-media-minmax": "^1.0.7", - "@csstools/postcss-media-queries-aspect-ratio-number-values": "^2.0.2", - "@csstools/postcss-nested-calc": "^3.0.0", - "@csstools/postcss-normalize-display-values": "^3.0.0", - "@csstools/postcss-oklab-function": "^3.0.1", - "@csstools/postcss-progressive-custom-properties": "^3.0.0", - "@csstools/postcss-relative-color-syntax": "^2.0.1", - "@csstools/postcss-scope-pseudo-class": "^3.0.0", - "@csstools/postcss-stepped-value-functions": "^3.0.1", - "@csstools/postcss-text-decoration-shorthand": "^3.0.0", - "@csstools/postcss-trigonometric-functions": "^3.0.1", - "@csstools/postcss-unset-value": "^3.0.0", - "autoprefixer": "^10.4.14", - "browserslist": "^4.21.10", - "css-blank-pseudo": "^6.0.0", - "css-has-pseudo": "^6.0.0", - "css-prefers-color-scheme": "^9.0.0", - "cssdb": "^7.7.0", - "postcss-attribute-case-insensitive": "^6.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^6.0.0", - "postcss-color-hex-alpha": "^9.0.2", - "postcss-color-rebeccapurple": "^9.0.0", - "postcss-custom-media": "^10.0.0", - "postcss-custom-properties": "^13.3.0", - "postcss-custom-selectors": "^7.1.4", - "postcss-dir-pseudo-class": "^8.0.0", - "postcss-double-position-gradients": "^5.0.0", - "postcss-focus-visible": "^9.0.0", - "postcss-focus-within": "^8.0.0", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^5.0.0", - "postcss-image-set-function": "^6.0.0", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^6.0.1", - "postcss-logical": "^7.0.0", - "postcss-nesting": "^12.0.1", - "postcss-opacity-percentage": "^2.0.0", - "postcss-overflow-shorthand": "^5.0.0", - "postcss-page-break": "^3.0.4", - "postcss-place": "^9.0.0", - "postcss-pseudo-class-any-link": "^9.0.0", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^7.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-9.0.0.tgz", - "integrity": "sha512-QNCYIL98VKFKY6HGDEJpF6+K/sg9bxcUYnOmNHJxZS5wsFDFaVoPeG68WAuhsqwbIBSo/b9fjEnTwY2mTSD+uA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.0.13" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-7.0.1.tgz", - "integrity": "sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "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/preact": { - "version": "10.17.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz", - "integrity": "sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/purecss": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/purecss/-/purecss-3.0.0.tgz", - "integrity": "sha512-IdYbGwbmuA7Hy9ACIO1q7ks4xGLcJSVHxJT2BXIz2c4Ve1aSrNU5bAzA1ILT4Gmdy5K59ruWoRPf9WvJZU5fbA==" - }, - "node_modules/qs": { + "fluid-player/node_modules/css-loader": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, + "license": "MIT", "dependencies": { - "side-channel": "^1.0.4" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=0.6" + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "webpack": { + "optional": true } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.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.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { + "fluid-player/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -7871,987 +228,29 @@ "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "fluid-player/node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sass": { - "version": "1.66.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", - "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, + "license": "MIT", "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-loader": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-11.1.1.tgz", - "integrity": "sha512-fOCp/zLmj1V1WHDZbUbPgrZhA7HKXHEqkslzB+05U5K9SbSbcmH91C7QLW31AsXikxUMaxXRhhcqWZAxUMLDyA==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0", - "sass": "^1.3.0", "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } } }, - "node_modules/sax": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/sha256-wasm": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", - "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", - "dependencies": { - "b4a": "^1.0.1", - "nanoassert": "^2.0.0" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/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/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/style-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", - "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/style-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/three": { - "version": "0.105.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.105.2.tgz", - "integrity": "sha512-L3Al37k4g3hVbgFFS251UVtIc25chhyN0/RvXzR0C+uIBToV6EKDG+MZzEXm9L2miGUVMK27W46/VkP6WUZXMg==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tus-js-client": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-3.1.1.tgz", - "integrity": "sha512-SZzWP62jEFLmROSRZx+uoGLKqsYWMGK/m+PiNehPVWbCm7/S9zRIMaDxiaOcKdMnFno4luaqP5E+Y1iXXPjP0A==", - "dependencies": { - "buffer-from": "^1.1.2", - "combine-errors": "^3.0.3", - "is-stream": "^2.0.0", - "js-base64": "^3.7.2", - "lodash.throttle": "^4.1.1", - "proper-lockfile": "^4.1.2", - "url-parse": "^1.5.7" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.35", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", - "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/videojs-vtt.js": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", - "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", - "dependencies": { - "global": "^4.3.1" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { + "fluid-player/node_modules/webpack-cli": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -8892,102 +291,12 @@ } } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/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==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "fluid-player/node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -9017,7 +326,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "ws": "^8.13.0" }, "bin": { @@ -9042,27 +351,5864 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "fluid-player/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", + "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.27.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", + "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", + "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", + "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", + "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", + "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", + "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", + "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz", + "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.27.0", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", + "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-typescript": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz", + "integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.8.tgz", + "integrity": "sha512-9dUvP2qpZI6PlGQ/sob+95B3u5u7nkYt9yhZFCC7G9HBRHBxj+QxS/wUlwaMGYW0waf+NIierI8aoDTssEdRYw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.8.tgz", + "integrity": "sha512-yuZpgWUzqZWQhEqfvtJufhl28DgO9sBwSbXbf/59gejNuvZcoUTRGQZhzhwF4ccqb53YAGB+u92z9+eSKoB4YA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz", + "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.7.tgz", + "integrity": "sha512-XTb6Mw0v2qXtQYRW9d9duAjDnoTbBpsngD7sRNLmYDjvwU2ebpIHplyxgOeo6jp/Kr52gkLi5VaK5RDCqzMzZQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.8.tgz", + "integrity": "sha512-/K8u9ZyGMGPjmwCSIjgaOLKfic2RIGdFHHes84XW5LnmrvdhOTVxo255NppHi3ROEvoHPW7MplMJgjZK5Q+TxA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.8.tgz", + "integrity": "sha512-CoHQ/0UXrvxLovu0ZeW6c3/20hjJ/QRg6lyXm3dZLY/JgvRU6bdbQZF/Du30A4TvowfcgvIHQmP1bNXUxgDrAw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.8.tgz", + "integrity": "sha512-LpFKjX6hblpeqyych1cKmk+3FJZ19QmaJtqincySoMkbkG/w2tfbnO5oE6mlnCTXcGUJ0rCEuRHvTqKK0nHYUQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz", + "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz", + "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", + "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.7.tgz", + "integrity": "sha512-LB6tIP7iBZb5CYv8iRenfBZmbaG3DWNEziOnPjGoQX5P94FBPvvTBy68b/d9NnS5PELKwFmmOYsAEIgEhDPCHA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", + "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.8.tgz", + "integrity": "sha512-+5aPsNWgxohXoYNS1f+Ys0x3Qnfehgygv3qrPyv+Y25G0yX54/WlVB+IXprqBLOXHM1gsVF+QQSjlArhygna0Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz", + "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.3.tgz", + "integrity": "sha512-dbNeEEPHxAwfQJ3duRL5IPpuD77QAHtRl4bAHRs0vOVhVbHrsL7mHnwe0irYjbs9kYwhAHZBQTLBgmvufPuRkA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.8.tgz", + "integrity": "sha512-eGE31oLnJDoUysDdjS9MLxNZdtqqSxjDXMdISpLh80QMaYrKs7VINpid34tWQ+iU23Wg5x76qAzf1Q/SLLbZVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.2.tgz", + "integrity": "sha512-4EcAvXTUPh7n6UoZZkCzgtCf/wPzMlTNuddcKg7HG8ozfQkUcHsJ2faQKeLmjyKdYPyOUn4YA7yDPf8K/jfIxw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.7.tgz", + "integrity": "sha512-rdrRCKRnWtj5FyRin0u/gLla7CIvZRw/zMGI1fVJP0Sg/m1WGicjPVHRANL++3HQtsiXKAbPrcPr+VkyGck0IA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz", + "integrity": "sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.7.tgz", + "integrity": "sha512-qTrZgLju3AV7Djhzuh2Bq/wjFqbcypnk0FhHjxW8DWJQcZLS1HecIus4X2/RLch1ukX7b+YYCdqbEnpIQO5ccg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@dr.pogodin/react-helmet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@dr.pogodin/react-helmet/-/react-helmet-3.0.1.tgz", + "integrity": "sha512-nU6pq6ES8pZYfAwMg/MBEwo+krjmVbyKKVrVHxZzZrv0bNuWPqJN3BlaR8S2s7pnwuAuiDJUofm3JdiOL7wIaA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.26.9" + }, + "peerDependencies": { + "react": "19" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hyperjump/browser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@hyperjump/browser/-/browser-1.3.0.tgz", + "integrity": "sha512-bf2ZTqpjfvcEq3DAZSg1h0FuliNUddR6nDPuaPb9qNoPPBQQzD1ldtuXX0QggXKQZl0OgsI3eovGCR3Dl5kToA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@hyperjump/json-pointer": "^1.1.0", + "@hyperjump/uri": "^1.2.0", + "content-type": "^1.0.5", + "just-curry-it": "^5.3.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jdesrosiers" + } + }, + "node_modules/@hyperjump/json-pointer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@hyperjump/json-pointer/-/json-pointer-1.1.0.tgz", + "integrity": "sha512-tFCKxMKDKK3VEdtUA3EBOS9GmSOS4mbrTjh9v3RnK10BphDMOb6+bxTh++/ae1AyfHyWb6R54O/iaoAtPMZPCg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jdesrosiers" + } + }, + "node_modules/@hyperjump/json-schema": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-1.12.1.tgz", + "integrity": "sha512-kbXbFsU7m4xPYk2ku0lgnBD8d+P2g4yS8imn8CF16Zf09gbAfeJpmiodbAXOT0e8j00AiW76McgBQdndEr0QbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hyperjump/json-pointer": "^1.1.0", + "@hyperjump/pact": "^1.2.0", + "@hyperjump/uri": "^1.2.0", + "content-type": "^1.0.4", + "json-stringify-deterministic": "^1.0.12", + "just-curry-it": "^5.3.0", + "uuid": "^9.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jdesrosiers" + }, + "peerDependencies": { + "@hyperjump/browser": "^1.1.0" + } + }, + "node_modules/@hyperjump/pact": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@hyperjump/pact/-/pact-1.4.0.tgz", + "integrity": "sha512-01Q7VY6BcAkp9W31Fv+ciiZycxZHGlR2N6ba9BifgyclHYHdbaZgITo0U6QMhYRlem4k8pf8J31/tApxvqAz8A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jdesrosiers" + } + }, + "node_modules/@hyperjump/uri": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@hyperjump/uri/-/uri-1.3.1.tgz", + "integrity": "sha512-2ecKymxf6prQMgrNpAvlx4RhsuM5+PFT6oh6uUTZdv5qmBv0RZvxv8LJ7oR30ZxGhdPdZAl4We/1NFc0nqHeAw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jdesrosiers" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", + "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@modyfi/vite-plugin-yaml": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@modyfi/vite-plugin-yaml/-/vite-plugin-yaml-1.1.1.tgz", + "integrity": "sha512-rEbfFNlMGLKpAYs2RsfLAhxCHFa6M4QKHHk0A4EYcCJAUwFtFO6qiEdLjUGUTtnRUxAC7GxxCa+ZbeUILSDvqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "5.1.0", + "js-yaml": "4.1.0", + "tosource": "2.0.0-alpha.3" + }, + "peerDependencies": { + "vite": ">=3.2.7" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@playwright/test": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz", + "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.51.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@swagger-api/apidom-ast": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.30.tgz", + "integrity": "sha512-5Wj3zdt0dxS9ERVk4qSuqDIsMQ8dP2vop8b494OpJ/O2W261yCV39Z+vN+PqeJ2NiKDRMlJ+QoQ1uVfKwEo8Kg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "unraw": "^3.0.0" + } + }, + "node_modules/@swagger-api/apidom-core": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.30.tgz", + "integrity": "sha512-pDnUhXIKKUvmeezQfwKLL05rkOH1L7ueiy5ja5ob9y2w4r+HXDID7qHtDGeRxKZoIt4E3Sd1K37OjcE9fNcknQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "minim": "~0.23.8", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "short-unique-id": "^5.0.2", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-error": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.30.tgz", + "integrity": "sha512-hVDx0kUF1DTyaEXwmsF3wpJClEfnH0pxjEubqtvHpjjeTMgZzmKc5azbYtvgBX3uUpGHyQZyG/O9g94/wIhhMA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.20.7" + } + }, + "node_modules/@swagger-api/apidom-json-pointer": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.30.tgz", + "integrity": "sha512-G+BDNXU/ARJCbJiFq1A6dh6pNDDp1J0jPfKeIHjsD8aZoRdpJC0F3F7onm8TjQm2cnvAi4B7vPOKzjWrYN1VWw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-ns-api-design-systems": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.30.tgz", + "integrity": "sha512-YsFtttsq39qVU2J9lMD3i+aeuiMD8EjeageszDEePYgb4/k2PZX9YJqb9urwxydBM7BFG7H/r9K/dVUMHFV5hw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-arazzo-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.30.tgz", + "integrity": "sha512-HpszcpuDlSOXWruHzasR64L8640VHVDuy8xXJrhx1iBu+gDHriOM8gbh8jQgWST91H0smtPeTG9WV1/h6frhRw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-asyncapi-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-/DvnCZY2cVz8E79Nc5mXD8J0++D8QT/c1PKPMMGEGVwGWB6XLh8jZM0HERb6yAiLUC0qzv4Jau/iQH1gs/ZtiQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.30.tgz", + "integrity": "sha512-HZL76SJaUDmL1GuFcev23UX1vVuxSHIED3vvKso+k3KWNfVWZJrr7GX1ELJx84fWW8g3b5S5+nyz5q1ApT084A==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.30.tgz", + "integrity": "sha512-D2adAcu/ISoBe0zRbcX0HyaDvWoMhmaL8iPR4pvjLY7soB2tCR4uLEzAkqPa2zaOKBRA2ziF74aNKrKbM5sX8w==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.30.tgz", + "integrity": "sha512-u5YMIw/g74Z59wPBFS2A2LaheC+EEqRcbpUQOApTvb6zjW+xWxbCuKV1ypzIaVDDPIry8e3mpwjjXLj1mvad5w==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.30.tgz", + "integrity": "sha512-/Mp11+tBKTN6XnpOiQo/cKnqmvfJhdCniHCK6Bg8wpCI3dMi+nSSpIYgWEPVQfNsLtf/PaYegrtYY56W4UzNRw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.30.tgz", + "integrity": "sha512-6sZ0LLYnEz9KXtt9xTRSc0EORBl5Fj3LUbfabUjqLQZGldsJWU+3TTQ4XtzFFHlan7z2WYyALKP7iP+b60XbPg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.4" + } + }, + "node_modules/@swagger-api/apidom-ns-openapi-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.30.tgz", + "integrity": "sha512-nloJUjf6AtKRnBuWmaFkVk7lR7aht9cudXkR/W0ui+feLSJ5rnYy6nyLyGFLZqLnb2cSV8L6bB6tGPJnvc5KzA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-openapi-3-0": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-7bz6kCgjStTKGGI4wBP2ho574lyfjH5EDPPuXhkwmAG2mOn9MZezlQhsbdo3B+vbi/58mqQb2XCoB4aeP1F+GQ==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-ns-openapi-3-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-pq2jxSp0I6xnGzyAiEXWYMuurp8H7TlOQ6Ijr/XX54gNmaIK+yQ3HXc7S6FZx+B2kQx03Tb8Y8O7L7J7YnmFiA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "ts-mixer": "^6.0.3" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.30.tgz", + "integrity": "sha512-ER5kQtxOXG8W1cQC7xH8EYYUOAMaqVrECIZShoa6yOLoI0/a40xFF5Lansn2P9szR1hT/2neM8KLcjaxCFjXSQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.30.tgz", + "integrity": "sha512-Xghcidv1TJVwrb/jFHQZA5YHPm+LxNPpFjOJYrijugXK72D3a5fqc/2PZzkGXeYefE4lGM+YB83c08N6NDCa4w==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.30.tgz", + "integrity": "sha512-SZajkrTJ7c1I9CI3gnsdHZCQFSIyQ2H/lkWDjA/drZkRcfbR1CTbR2q0BGGlV5Y+nFHBxjRNpPbYbZrqh0WV4w==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.30.tgz", + "integrity": "sha512-T+N1ix+V5IpOWMFcamQRI50830JayD1gifnRm+mVeWJKMzp+xm08bnO8NiR9LQ2SKJZ6FWYM38oG2tAt0Lwxcg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-KjyF966T9HVvSsk+RWaOcNDxXBqOWr/09SAw1OdBBfGHqs+xF3KOV7/2RB88Adw3+ZZ3E5oXDvVVhobq8wVvyA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-+6zlRD0nP7T5Yiu9hHgP3b7d016WYRXqfr9TW/yqPFInM/tI74ROPJnMQ1G3s0HyW6lB0KX7cG0O0TqcMmnSqg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-json": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.30.tgz", + "integrity": "sha512-cciT19OOXafwBnXe9KFVwUGEVu4Zrvb4k12TYNlNqzVg1xA9pBc3Ywq5EgHIhiiQOLY3fILr0fr6B36N6irN2Q==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "tree-sitter": "=0.22.1", + "tree-sitter-json": "=0.24.8", + "web-tree-sitter": "=0.24.5" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-json/node_modules/node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-json/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.30.tgz", + "integrity": "sha512-Q5b9XVTId/FiGSmGKSOxyKJZYdvWcZOqogpLkF0Q8PtPVCgp2LFl73XuJOgjxO1nkE+n/ap+93svgaaxQRaVow==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-VsDpKXmRl6sXpgR6o582yyDJqfFfliYVrVWve0DCOTkpvOeOYqPPLA45oMMvunJkqVsBL4Fpy9/ZqAQvdlur7g==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-Q2NQ1/IF500mFuZZDC3tTw75UOTgSknqRyBywsA159BRnqnWxwk/2//Ifh8Vwq/mMyW2zSChigCvnqI+/IvQxA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.30.tgz", + "integrity": "sha512-6Zj1UtbQIwnsVJi2xn+Zl9yn9U014XzkX6QKrpAXIUGNCcjwWIbuOKd3u2T481OOP0BuVf3JpWhRqxumtosV3w==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.30.tgz", + "integrity": "sha512-YaGDkZaV9ZRtbIGorsyyqL2x323gLMqqgLrPpAjaBbBFiAJRwF/gwRHMY4iJ85H2YeUxUq0jqtSc3jH3wsQJGg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.30.tgz", + "integrity": "sha512-rBa7daaUrDVAIwJZm+S4lwc5pqNt6avNTGxEB69dNZ3QDJmCC+HUnudUtsG3VqMfP46JITKUPvtzRLGjX8CgRg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.30", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.30.tgz", + "integrity": "sha512-NRmQehyw4gbDzeBAl0zjyPqj4e/jNYgqnRLcOsxTKpWODud8RHBqEvju/M6iET6ru0o+A9265efFzqR9hiE0LA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-ast": "^1.0.0-beta.30", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@swagger-api/apidom-error": "^1.0.0-beta.30", + "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.0", + "@types/ramda": "~0.30.0", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0", + "tree-sitter": "=0.22.1", + "web-tree-sitter": "=0.24.5" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/@tree-sitter-grammars/tree-sitter-yaml": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@tree-sitter-grammars/tree-sitter-yaml/-/tree-sitter-yaml-0.7.0.tgz", + "integrity": "sha512-GOMIK3IaDvECD0eZEhAsLl03RMtM1E8StxuGMn6PpMKFg7jyQ+jSzxJZ4Jmc/tYitah9/AECt8o4tlRQ5yEZQg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "peerDependencies": { + "tree-sitter": "^0.22.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2/node_modules/tree-sitter": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.22.1.tgz", + "integrity": "sha512-gRO+jk2ljxZlIn20QRskIvpLCMtzuLl5T0BY6L9uvPYD17uUrxlxWkvYCiVqED2q2q7CVtY52Uex4WcYo2FEXw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.1", + "node-gyp-build": "^4.8.2" + } + }, + "node_modules/@swagger-api/apidom-reference": { + "version": "1.0.0-beta.30", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.30.tgz", + "integrity": "sha512-l1MpLMlmaX+y2hra5EadfR37sAMzmEz1wZomVcnw7vJEFlLQo3WwOdFvpQemPCZ9IJHUs+5zhZ++w7z60uKpSw==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@swagger-api/apidom-core": "^1.0.0-beta.30", + "@types/ramda": "~0.30.0", + "axios": "^1.8.2", + "minimatch": "^7.4.3", + "process": "^0.11.10", + "ramda": "~0.30.0", + "ramda-adjunct": "^5.0.0" + }, + "optionalDependencies": { + "@swagger-api/apidom-error": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.0.0-beta.3 <1.0.0-rc.0", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.3 <1.0.0-rc.0" + } + }, + "node_modules/@swagger-api/apidom-reference/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==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@swagger-api/apidom-reference/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@swaggerexpert/cookie": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@swaggerexpert/cookie/-/cookie-2.0.2.tgz", + "integrity": "sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==", + "license": "Apache-2.0", + "dependencies": { + "apg-lite": "^1.0.3" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/@transloadit/prettier-bytes": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.5.tgz", + "integrity": "sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/micromodal": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@types/micromodal/-/micromodal-0.3.5.tgz", + "integrity": "sha512-xDref7Vyx0nhfJWpeEkVrSb5l1GuHIyxfePxuHSTP3eW587Qe3hzKcBy0V+1Wjuyh21UhJH46eP43czH2ZRpGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ramda": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.30.2.tgz", + "integrity": "sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==", + "license": "MIT", + "dependencies": { + "types-ramda": "^0.30.1" + } + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", + "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sha256-wasm": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@types/sha256-wasm/-/sha256-wasm-2.2.3.tgz", + "integrity": "sha512-yaESPxpToMojUgEAjVsk0XAxXcVK8e2dyRfFzD9U8wKsdnV4SGrI3tg6tUrRoEW4PEmfWvKFJ2KocSUt5AETfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/swagger-ui-react": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-react/-/swagger-ui-react-5.18.0.tgz", + "integrity": "sha512-c2M9adVG7t28t1pq19K9Jt20VLQf0P/fwJwnfcmsVVsdkwCWhRmbKDu+tIs0/NGwJ/7GY8lBx+iKZxuDI5gDbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, + "node_modules/@types/webpack-bundle-analyzer": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@types/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz", + "integrity": "sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "tapable": "^2.2.0", + "webpack": "^5" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@uppy/companion-client": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-4.4.1.tgz", + "integrity": "sha512-ardMacShsfzaIbqHEH48YlpzWZkBj1qhAj0Dvn3r31p9d0HA5xFUvAdLYrZ6ezKvZ0RcDbf0SB5qCrQMkjscXQ==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^6.1.1", + "namespace-emitter": "^2.0.1", + "p-retry": "^6.1.0" + }, + "peerDependencies": { + "@uppy/core": "^4.4.1" + } + }, + "node_modules/@uppy/companion-client/node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@uppy/companion-client/node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@uppy/core": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@uppy/core/-/core-4.4.4.tgz", + "integrity": "sha512-etaG6uSrShnS8x/CGI9ME/XP23jw8FTkujzKbaag4lDTtdlvcs6PxcObtH3I5MxxJXUEWwcfVGTdAUvd/tGCaA==", + "license": "MIT", + "dependencies": { + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/store-default": "^4.2.0", + "@uppy/utils": "^6.1.3", + "lodash": "^4.17.21", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^5.0.9", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/dashboard": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-4.3.3.tgz", + "integrity": "sha512-bZzzyzWzyoCsXxLUKsjT+X6AWNlFjRU1Ui+28Hp0C7A43zm8y0pb8BbwECl8a3NJH10tKNOHwT8IiVwbiGwXPQ==", + "license": "MIT", + "dependencies": { + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/informer": "^4.2.1", + "@uppy/provider-views": "^4.4.2", + "@uppy/status-bar": "^4.1.3", + "@uppy/thumbnail-generator": "^4.1.1", + "@uppy/utils": "^6.1.3", + "classnames": "^2.2.6", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0", + "nanoid": "^5.0.9", + "preact": "^10.5.13", + "shallow-equal": "^3.0.0" + }, + "peerDependencies": { + "@uppy/core": "^4.4.4" + } + }, + "node_modules/@uppy/form": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@uppy/form/-/form-4.1.1.tgz", + "integrity": "sha512-S4GqnFOp0Q+el8iz6tTYYdcr4vw2HU5AIeZmKT+vJdYj74JnMGWCJuaAn7VN8w5Bm28bgYoK5M37cGviMB0yrw==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^6.1.1", + "get-form-data": "^3.0.0" + }, + "peerDependencies": { + "@uppy/core": "^4.4.1" + } + }, + "node_modules/@uppy/informer": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-4.2.1.tgz", + "integrity": "sha512-0en8Py47pl6RMDrgUfqFoF807W5kK5AKVJNT1SkTsLiGg5anmTIMuvmNG3k6LN4cn9P/rKyEHSdGcoBBUj9u7Q==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^6.1.1", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^4.4.1" + } + }, + "node_modules/@uppy/provider-views": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-4.4.2.tgz", + "integrity": "sha512-YGrPJuydrksmMCjvo7Ty7/lDLNo/Y8zsOgWgWmVbXB0V5aRvqY49LeKY8HDlOXclKmn6dl5CeQFf7p46txRNGQ==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^6.1.2", + "classnames": "^2.2.6", + "nanoid": "^5.0.9", + "p-queue": "^8.0.0", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^4.4.2" + } + }, + "node_modules/@uppy/status-bar": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-4.1.3.tgz", + "integrity": "sha512-1YlbsoA9lTNL2b7nhehDri15XslVzGLG+J7HFAsxbE2cMHnOusuLCkm03oE9c72pOU9nG2qZV6yqdWBTwdxbNA==", + "license": "MIT", + "dependencies": { + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/utils": "^6.1.3", + "classnames": "^2.2.6", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^4.4.4" + } + }, + "node_modules/@uppy/store-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-4.2.0.tgz", + "integrity": "sha512-PieFVa8yTvRHIqsNKfpO/yaJw5Ae/hT7uT58ryw7gvCBY5bHrNWxH5N0XFe8PFHMpLpLn8v3UXGx9ib9QkB6+Q==", + "license": "MIT" + }, + "node_modules/@uppy/thumbnail-generator": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-4.1.1.tgz", + "integrity": "sha512-65znkGNgVTbVte51IKOhgxOpHGSwYj9Qik2jF2ZBocMbhBY4gPkWFwqMrKQBfddA9KbUa4jVe1psxhAQTzYgiA==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^6.1.1", + "exifr": "^7.0.0" + }, + "peerDependencies": { + "@uppy/core": "^4.4.1" + } + }, + "node_modules/@uppy/tus": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@uppy/tus/-/tus-4.2.2.tgz", + "integrity": "sha512-fauUHqoLDtyRXwoaIyWM8ctuJ+SAXdjuM2eyoPYcGtpVaEGa+AS7IQkJkWz2RrWSdLCHL9O+fk6jKr+0PIDEpQ==", + "license": "MIT", + "dependencies": { + "@uppy/companion-client": "^4.4.1", + "@uppy/utils": "^6.1.1", + "tus-js-client": "^4.2.3" + }, + "peerDependencies": { + "@uppy/core": "^4.4.1" + } + }, + "node_modules/@uppy/utils": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-6.1.3.tgz", + "integrity": "sha512-7WuTtMf0k1g962sE76mKy8aDV/kLeDrF8Wv1oTxaXQzUpmHBAoKd3FXLrQXu7TgM0XNHHRZXAckBttbVOWkKCw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21", + "preact": "^10.5.13" + } + }, + "node_modules/@vitejs/plugin-legacy": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-6.0.2.tgz", + "integrity": "sha512-b/a6ARuJ1yCoIH/lSjpwPMyqo3NSCoqyxYtff7VCC6cnJfvBTzd7PthcrbomhLZnMsp/eW41b6TrbNSQvHW2lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.9", + "@babel/preset-env": "^7.26.9", + "browserslist": "^4.24.4", + "browserslist-to-esbuild": "^2.1.1", + "core-js": "^3.40.0", + "magic-string": "^0.30.17", + "regenerator-runtime": "^0.14.1", + "systemjs": "^6.15.1" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "peerDependencies": { + "terser": "^5.16.0", + "vite": "^6.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", + "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", + "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", + "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -9070,16 +6216,2893 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/fast-deep-equal": { + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apg-lite": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/apg-lite/-/apg-lite-1.0.4.tgz", + "integrity": "sha512-B32zCN3IdHIc99Vy7V9BaYTUzLeRA8YXYY1aQD1/5I2aqIrO0coi4t6hJPqMisidlBxhyME8UexkHt31SlR6Og==", + "license": "BSD-2-Clause" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autolinker": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", + "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-1.0.8.tgz", + "integrity": "sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz", + "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz", + "integrity": "sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A==", + "license": "MIT", + "dependencies": { + "bcp-47": "^1.0.0", + "bcp-47-match": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserslist-to-esbuild": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz", + "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "browserslist-to-esbuild": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "browserslist": "*" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001712", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz", + "integrity": "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/codem-isoboxer": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/codem-isoboxer/-/codem-isoboxer-0.3.9.tgz", + "integrity": "sha512-4XOTqEzBWrGOZaMd+sTED2hLpzfBbiQCf1W6OBGkIHqk1D8uwy8WFLazVbdQwfDpQ+vf39lqTGPa9IhWW0roTA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combine-errors": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz", + "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==", + "dependencies": { + "custom-error-instance": "2.1.1", + "lodash.uniqby": "4.5.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true, + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", + "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", + "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", + "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz", + "integrity": "sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.4.tgz", + "integrity": "sha512-3KSCVkjZJe/QxicVXnbyYSY26WsFc1YoMY7jep1ZKWMEVc7jEm6V2Xq2r+MX8WKQIuB7ofGbnr5iVI+aZpoSzg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-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==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/custom-error-instance": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz", + "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==", + "license": "ISC" + }, + "node_modules/dashjs": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/dashjs/-/dashjs-4.7.4.tgz", + "integrity": "sha512-+hldo25QPP3H/NOwqUrvt4uKdMse60/Gsz9AUAnoYfhga8qHWq4nWiojUosOiigbigkDTCAn9ORcvUaKCvmfCA==", + "license": "BSD-3-Clause", + "dependencies": { + "bcp-47-match": "^1.0.3", + "bcp-47-normalize": "^1.1.1", + "codem-isoboxer": "0.3.9", + "es6-promise": "^4.2.8", + "fast-deep-equal": "2.0.1", + "html-entities": "^1.2.1", + "imsc": "^1.1.5", + "localforage": "^1.7.1", + "path-browserify": "^1.0.1", + "ua-parser-js": "^1.0.37" + } + }, + "node_modules/dashjs/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "license": "MIT" + }, + "node_modules/dashjs/node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "license": "BSD-3-Clause", + "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", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", + "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "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-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.134", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.134.tgz", + "integrity": "sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exifr": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz", + "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==", + "license": "MIT" + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "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==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/webpack-dev-server/node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fluid-player": { + "resolved": "fluid-player", + "link": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "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==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^3.2.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-form-data/-/get-form-data-3.0.0.tgz", + "integrity": "sha512-1d53Kn08wlPuLu31/boF1tW2WRYKw3xAWae3mqcjqpDjoqVBtXolbQnudbbEFyFWL7+2SLGRAFdotxNY06V7MA==", + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/hls.js": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.1.tgz", + "integrity": "sha512-7GOkcqn0Y9EqU2OJZlzkwxj9Uynuln7URvr7dRjgqNJNZ5UbbjL/v1BjAvQogy57Psdd/ek1u2s6IDEFYlabrA==", + "license": "Apache-2.0" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "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/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "dev": true, "funding": [ { @@ -9090,24 +9113,1278 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ] + ], + "license": "MIT" }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", + "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/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, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imsc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/imsc/-/imsc-1.1.5.tgz", + "integrity": "sha512-V8je+CGkcvGhgl2C1GlhqFFiUOIEdwXbXLiu1Fcubvvbo+g9inauqT3l0pNYXGoLPBj3jxtZz9t+wCopMkwadQ==", + "license": "BSD-2-Clause", + "dependencies": { + "sax": "1.2.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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/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==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-base64": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==", + "license": "BSD-3-Clause" + }, + "node_modules/js-file-download": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz", + "integrity": "sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-deterministic": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/json-stringify-deterministic/-/json-stringify-deterministic-1.0.12.tgz", + "integrity": "sha512-q3PN0lbUdv0pmurkBNdJH3pfFvOTL/Zp0lquqpvcjfKzt6Y0j49EPHAmVHCAS4Ceq/Y+PejWTzyiVpoY71+D6g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/just-curry-it": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/just-curry-it/-/just-curry-it-5.3.0.tgz", + "integrity": "sha512-silMIRiFjUWlfaDhkgSzpuAyQ6EX/o09Eu8ZBfmFwQMbax7+LQzeIU2CBrICT6Ne4l86ITCGvUCBpCubWYy0Yw==", + "dev": true, + "license": "MIT" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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, + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash._baseiteratee": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", + "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==", + "license": "MIT", + "dependencies": { + "lodash._stringtopath": "~4.8.0" + } + }, + "node_modules/lodash._basetostring": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", + "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==", + "license": "MIT" + }, + "node_modules/lodash._baseuniq": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", + "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==", + "license": "MIT", + "dependencies": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "node_modules/lodash._createset": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz", + "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==", + "license": "MIT" + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "license": "MIT" + }, + "node_modules/lodash._stringtopath": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz", + "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==", + "license": "MIT", + "dependencies": { + "lodash._basetostring": "~4.12.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz", + "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==", + "license": "MIT", + "dependencies": { + "lodash._baseiteratee": "~4.7.0", + "lodash._baseuniq": "~4.6.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromodal": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/micromodal/-/micromodal-0.6.1.tgz", + "integrity": "sha512-rw1fOptxQe3XGDm9xil9hBC2ylPb1kKZyYv4FlK54R/7L+KG+D8SQxPL5L8OlEXAhBDHckeoULYxWSYU9rg/RA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "license": "ISC", + "dependencies": { + "wildcard": "^1.1.0" + } + }, + "node_modules/mime-match/node_modules/wildcard": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz", + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -9115,75 +10392,2898 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-manifest-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-5.0.0.tgz", - "integrity": "sha512-8RQfMAdc5Uw3QbCQ/CBV/AXqOR8mt03B6GJmRbhWopE8GzRfEpn+k0ZuWywxW+5QZsffhmFDY1J6ohqJo+eMuw==", - "dev": true, - "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "engines": { - "node": ">=12.22.0" }, "peerDependencies": { - "webpack": "^5.47.0" + "webpack": "^5.0.0" } }, - "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dev": true, + "node_modules/minim": { + "version": "0.23.8", + "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", + "integrity": "sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==", + "license": "MIT", "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" + "lodash": "^4.15.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=6" } }, - "node_modules/webpack-merge": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10.0.0" + "node": "*" } }, - "node_modules/webpack-merge/node_modules/wildcard": { + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "license": "MIT", + "engines": { + "node": ">=10" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==", + "license": "MIT" + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==", + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch-commonjs": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch-commonjs/-/node-fetch-commonjs-3.3.2.tgz", + "integrity": "sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==", + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "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==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node_modules/node-html-parser/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/node-html-parser/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-path-templating": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-2.2.1.tgz", + "integrity": "sha512-eN14VrDvl/YyGxxrkGOHkVkWEoPyhyeydOUrbvjoz8K5eIGgELASwN1eqFOJ2CTQMGCy2EntOK1KdtJ8ZMekcg==", + "license": "Apache-2.0", + "dependencies": { + "apg-lite": "^1.0.4" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/openapi-server-url-templating": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/openapi-server-url-templating/-/openapi-server-url-templating-1.3.0.tgz", + "integrity": "sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==", + "license": "Apache-2.0", + "dependencies": { + "apg-lite": "^1.0.4" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/panolens": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/panolens/-/panolens-0.12.1.tgz", + "integrity": "sha512-2hpjm+rRnDdaLD5Bak49K0Y9/X6vOr1OcyJx5piSA6sCOs1tsgchMgKIwpSGCMpBMHWZ10E/Cz4BIwyXYebt5g==", + "license": "MIT", + "dependencies": { + "three": "^0.105.2" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/playwright": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", + "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.51.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", + "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.8.tgz", + "integrity": "sha512-S/TpMKVKofNvsxfau/+bw+IA6cSfB6/kmzFj5szUofHOVnFFMB2WwK+Zu07BeMD8T0n+ZnTO5uXiMvAKe2dPkA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-media": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", + "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", + "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz", + "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.8.tgz", + "integrity": "sha512-plV21I86Hg9q8omNz13G9fhPtLopIWH06bt/Cb5cs1XnaGU2kUtEitvVd4vtQb/VqCdNUHK5swKn3QFmMRbpDg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.0.8", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "dev": true, + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.5.tgz", + "integrity": "sha512-LQybafF/K7H+6fAs4SIkgzkSCixJy0/h0gubDIAP3Ihz+IQBRwsjyvBnAZ3JUHD+A/ITaxVRPDxn//a3Qy4pDw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.8", + "@csstools/postcss-color-mix-function": "^3.0.8", + "@csstools/postcss-content-alt-text": "^2.0.4", + "@csstools/postcss-exponential-functions": "^2.0.7", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.8", + "@csstools/postcss-gradients-interpolation-method": "^5.0.8", + "@csstools/postcss-hwb-function": "^4.0.8", + "@csstools/postcss-ic-unit": "^4.0.0", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.3", + "@csstools/postcss-media-minmax": "^2.0.7", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.8", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-random-function": "^1.0.3", + "@csstools/postcss-relative-color-syntax": "^3.0.8", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.2", + "@csstools/postcss-stepped-value-functions": "^4.0.7", + "@csstools/postcss-text-decoration-shorthand": "^4.0.2", + "@csstools/postcss-trigonometric-functions": "^4.0.7", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.19", + "browserslist": "^4.24.4", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.2", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.2.3", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.8", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-custom-properties": "^14.0.4", + "postcss-custom-selectors": "^8.0.4", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.0", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.8", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.1", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/preact": { + "version": "10.26.5", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.5.tgz", + "integrity": "sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/purecss": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/purecss/-/purecss-3.0.0.tgz", + "integrity": "sha512-IdYbGwbmuA7Hy9ACIO1q7ks4xGLcJSVHxJT2BXIz2c4Ve1aSrNU5bAzA1ILT4Gmdy5K59ruWoRPf9WvJZU5fbA==", + "license": "BSD-3-Clause" + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/ramda": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz", + "integrity": "sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/ramda-adjunct": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ramda-adjunct/-/ramda-adjunct-5.1.0.tgz", + "integrity": "sha512-8qCpl2vZBXEJyNbi4zqcgdfHtcdsWjOGbiNSEnEBrM6Y0OKOT8UxJbIVGm1TIcjaSu2MxaWcgtsNlKlCk7o7qg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda-adjunct" + }, + "peerDependencies": { + "ramda": ">= 0.30.0" + } + }, + "node_modules/randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "license": "MIT", + "dependencies": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "license": "MIT", + "dependencies": { + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^15.3.0 || 16 || 17 || 18" + } + }, + "node_modules/react-debounce-input": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.3.0.tgz", + "integrity": "sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==", + "license": "MIT", + "dependencies": { + "lodash.debounce": "^4", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^15.3.0 || 16 || 17 || 18" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-immutable-proptypes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/react-immutable-proptypes/-/react-immutable-proptypes-2.2.0.tgz", + "integrity": "sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.2" + }, + "peerDependencies": { + "immutable": ">=3.6.2" + } + }, + "node_modules/react-immutable-pure-component": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz", + "integrity": "sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==", + "license": "MIT", + "peerDependencies": { + "immutable": ">= 2 || >= 4.0.0-rc", + "react": ">= 16.6", + "react-dom": ">= 16.6" + } + }, + "node_modules/react-inspector": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.2.tgz", + "integrity": "sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.0.tgz", + "integrity": "sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", + "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.27.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + }, + "bin": { + "remarkable": "bin/remarkable.js" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/remarkable/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.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==", + "license": "MIT" + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.86.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.3.tgz", + "integrity": "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -9193,11 +13293,2087 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack/node_modules/webpack-sources": { + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha256-wasm": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/sha256-wasm/-/sha256-wasm-2.2.2.tgz", + "integrity": "sha512-qKSGARvao+JQlFiA+sjJZhJ/61gmW/3aNLblB2rsgIxDlDxsJPHo8a1seXj12oKtuHVgJSJJ7QEGBUYQN741lQ==", + "license": "ISC", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallow-equal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz", + "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/short-unique-id": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.2.tgz", + "integrity": "sha512-MlRVyT5RYfDO2kUzBgOPlZriRzG+NIAuwSy1HBN8tahXyFi3+804GGi/mzjUsi6VxgiQuDgMnhoI2FqmSHX8Tg==", + "license": "Apache-2.0", + "bin": { + "short-unique-id": "bin/short-unique-id", + "suid": "bin/short-unique-id" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", + "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.27.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-client": { + "version": "3.34.4", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.34.4.tgz", + "integrity": "sha512-Qvtu8DtARAx5GwefA0eV1WRLa4Q9bhczrtNAsiBMOx3HkxAOczy1APQhrcblJdLys0xEGQ4xYizYFXfIL9BhpA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.22.15", + "@scarf/scarf": "=1.4.0", + "@swagger-api/apidom-core": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-error": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-json-pointer": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-ns-openapi-3-1": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swagger-api/apidom-reference": ">=1.0.0-beta.13 <1.0.0-rc.0", + "@swaggerexpert/cookie": "^2.0.2", + "deepmerge": "~4.3.0", + "fast-json-patch": "^3.0.0-1", + "js-yaml": "^4.1.0", + "neotraverse": "=0.6.18", + "node-abort-controller": "^3.1.1", + "node-fetch-commonjs": "^3.3.2", + "openapi-path-templating": "^2.2.1", + "openapi-server-url-templating": "^1.3.0", + "ramda": "^0.30.1", + "ramda-adjunct": "^5.1.0" + } + }, + "node_modules/swagger-ui-react": { + "version": "5.20.7", + "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.20.7.tgz", + "integrity": "sha512-TmWWER0OKkwx/IC1G82AaU265oOpETZFt2KjYxvsGwRWB4cN0NYd85jVogd6tATS8YxbiUHfVpUUJp662CCljg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs3": "^7.26.10", + "@scarf/scarf": "=1.4.0", + "base64-js": "^1.5.1", + "classnames": "^2.5.1", + "css.escape": "1.5.1", + "deep-extend": "0.6.0", + "dompurify": "=3.2.4", + "ieee754": "^1.2.1", + "immutable": "^3.x.x", + "js-file-download": "^0.4.12", + "js-yaml": "=4.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.8.1", + "randexp": "^0.5.3", + "randombytes": "^2.1.0", + "react-copy-to-clipboard": "5.1.0", + "react-debounce-input": "=3.3.0", + "react-immutable-proptypes": "2.2.0", + "react-immutable-pure-component": "^2.2.0", + "react-inspector": "^6.0.1", + "react-redux": "^9.2.0", + "react-syntax-highlighter": "^15.6.1", + "redux": "^5.0.1", + "redux-immutable": "^4.0.0", + "remarkable": "^2.0.1", + "reselect": "^5.1.1", + "serialize-error": "^8.1.0", + "sha.js": "^2.4.11", + "swagger-client": "^3.34.4", + "url-parse": "^1.5.10", + "xml": "=1.0.1", + "xml-but-prettier": "^1.0.1", + "zenscroll": "^4.0.2" + }, + "peerDependencies": { + "react": ">=16.8.0 <19", + "react-dom": ">=16.8.0 <19" + } + }, + "node_modules/swagger-ui-react/node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/swagger-ui-react/node_modules/redux-immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz", + "integrity": "sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==", + "license": "BSD-3-Clause", + "peerDependencies": { + "immutable": "^3.8.1 || ^4.0.0-rc.1" + } + }, + "node_modules/systemjs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.15.1.tgz", + "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/three": { + "version": "0.105.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.105.2.tgz", + "integrity": "sha512-L3Al37k4g3hVbgFFS251UVtIc25chhyN0/RvXzR0C+uIBToV6EKDG+MZzEXm9L2miGUVMK27W46/VkP6WUZXMg==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tosource": { + "version": "2.0.0-alpha.3", + "resolved": "https://registry.npmjs.org/tosource/-/tosource-2.0.0-alpha.3.tgz", + "integrity": "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tree-sitter": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" + } + }, + "node_modules/tree-sitter-json": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/tree-sitter-json/-/tree-sitter-json-0.24.8.tgz", + "integrity": "sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.2.2", + "node-gyp-build": "^4.8.2" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree-sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-json/node_modules/node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter/node_modules/node-addon-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.3.1.tgz", + "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/ts-loader": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" + }, + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, + "node_modules/tus-js-client": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-4.3.1.tgz", + "integrity": "sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.1.2", + "combine-errors": "^3.0.3", + "is-stream": "^2.0.0", + "js-base64": "^3.7.2", + "lodash.throttle": "^4.1.1", + "proper-lockfile": "^4.1.2", + "url-parse": "^1.5.7" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/types-ramda": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.30.1.tgz", + "integrity": "sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==", + "license": "MIT", + "dependencies": { + "ts-toolbelt": "^9.6.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", + "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undici": { + "version": "6.21.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", + "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unraw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.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==", + "dev": true, + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/videojs-vtt.js": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", + "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", + "license": "Apache-2.0", + "dependencies": { + "global": "^4.3.1" + } + }, + "node_modules/vite": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", + "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-css-modules": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/vite-css-modules/-/vite-css-modules-1.8.4.tgz", + "integrity": "sha512-FpHXNyih8rs7TnnzYuLyPvGHWUJ98tJSEFQDjXK/undcidQr5uIPeBZOsojTBVFk7T+Bd9U/ucdJFNUojTNrRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@rollup/pluginutils": "^5.1.4", + "generic-names": "^4.0.0", + "icss-utils": "^5.1.0", + "magic-string": "^0.30.17", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.2.0", + "postcss-modules-scope": "^3.2.1", + "postcss-modules-values": "^4.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/vite-css-modules?sponsor=1" + }, + "peerDependencies": { + "lightningcss": "^1.23.0", + "postcss": "^8.4.33", + "vite": "^5.0.12 || ^6.0.0" + }, + "peerDependenciesMeta": { + "lightningcss": { + "optional": true + } + } + }, + "node_modules/vite-css-modules/node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/vite-css-modules/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-html": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/vite-plugin-html/-/vite-plugin-html-3.2.2.tgz", + "integrity": "sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^4.2.0", + "colorette": "^2.0.16", + "connect-history-api-fallback": "^1.6.0", + "consola": "^2.15.3", + "dotenv": "^16.0.0", + "dotenv-expand": "^8.0.2", + "ejs": "^3.1.6", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", + "node-html-parser": "^5.3.3", + "pathe": "^0.2.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-html/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/vite-plugin-html/node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/vite-plugin-html/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.1.tgz", + "integrity": "sha512-EfsPcBm3ewg3UMG8RJaC0ADq6/qnUZnokXx4By4+2cAcipjT9i0Y0owIJGqmZI7d6nxk4qB1q5aXOwNuSyPdyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "fast-glob": "^3.2.11", + "fs-extra": "^11.1.0", + "p-map": "^7.0.3", + "picocolors": "^1.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/web-tree-sitter": { + "version": "0.24.5", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.24.5.tgz", + "integrity": "sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==", + "license": "MIT", + "optional": true + }, + "node_modules/webpack": { + "version": "5.99.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.5.tgz", + "integrity": "sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", + "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", + "colorette": "^2.0.14", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "envinfo": "^7.14.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.82.0" + }, + "peerDependenciesMeta": { + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.1.tgz", + "integrity": "sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.7", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/webpack-dev-server/node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/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, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/memfs": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-5.0.1.tgz", + "integrity": "sha512-xTlX7dC3hrASixA2inuWFMz6qHsNi6MT3Uiqw621sJjRTShtpMjbDYhPPZBwWUKdIYKIjSq9em6+uzWayf38aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "webpack": "^5.75.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -9207,6 +15383,7 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -9221,20 +15398,40 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", - "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -9246,21 +15443,126 @@ } }, "node_modules/wildcard": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz", - "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -9277,23 +15579,68 @@ } } }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "license": "MIT" + }, + "node_modules/xml-but-prettier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-but-prettier/-/xml-but-prettier-1.0.1.tgz", + "integrity": "sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==", + "license": "MIT", + "dependencies": { + "repeat-string": "^1.5.2" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zenscroll": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zenscroll/-/zenscroll-4.0.2.tgz", + "integrity": "sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==", + "license": "Unlicense" } } } diff --git a/client/package.json b/client/package.json index 14cb424..7a573c0 100644 --- a/client/package.json +++ b/client/package.json @@ -1,52 +1,101 @@ { "name": "kemono-2-client", - "version": "0.2.1", + "version": "1.4.0", "description": "frontend for kemono 2", "private": true, - "scripts": { - "dev": "webpack serve --config webpack.dev.js", - "build": "webpack --config webpack.prod.js" - }, - "keywords": [], "author": "BassOfBass", "license": "ISC", + "scripts": { + "start": "vite preview --config ./vite.prod.mjs", + "postinstall": "cd \"fluid-player\" && npm install", + "dev": "vite --config ./vite.dev.mjs", + "validate": "node scripts/validate.mjs && tsc --noEmit", + "prebuild": "cd \"fluid-player\" && npm run build", + "build": "vite build --config ./vite.prod.mjs" + }, + "overrides": { + "vite": "$vite", + "swagger-ui-react": { + "react": "$react", + "react-dom": "$react-dom" + } + }, + "imports": { + "#storage/*": "./src/browser/storage/*/index.ts", + "#hooks": "./src/browser/hooks/index.ts", + "#components/*": "./src/components/*/index.ts", + "#env/*": "./src/env/*.ts", + "#lib/*": "./src/lib/*/index.ts", + "#pages/*": "./src/pages/*.tsx", + "#entities/*": "./src/entities/*/index.ts", + "#css": "./src/css/*.scss", + "#assets/*": "./src/assets/*", + "#api/*": "./src/api/*/index.ts" + }, "dependencies": { - "@babel/runtime": "^7.22.10", - "@uppy/core": "^3.4.0", - "@uppy/dashboard": "^3.5.1", - "@uppy/form": "^3.0.2", - "@uppy/tus": "^3.1.3", - "diff": "^5.1.0", - "fluid-player": "^3.22.0", - "micromodal": "^0.4.10", + "@babel/runtime": "^7.26.7", + "@uppy/core": "^4.4.2", + "@uppy/dashboard": "^4.3.1", + "@uppy/form": "^4.1.1", + "@uppy/tus": "^4.2.2", + "clsx": "^2.1.1", + "diff": "^7.0.0", + "fluid-player": "file:./fluid-player", + "micromodal": "^0.6.1", "purecss": "^3.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "@dr.pogodin/react-helmet": "^3.0.1", + "react-router": "^7.5.0", "sha256-wasm": "^2.2.2", - "whatwg-fetch": "^3.6.17" + "swagger-ui-react": "^5.20.7" }, "devDependencies": { - "@babel/core": "^7.22.10", - "@babel/plugin-transform-runtime": "^7.22.10", - "@babel/preset-env": "^7.22.10", - "babel-loader": "^8.3.0", + "@babel/core": "^7.26.8", + "@babel/plugin-transform-runtime": "^7.26.8", + "@babel/preset-env": "^7.26.8", + "@babel/preset-react": "^7.26.3", + "@babel/preset-typescript": "^7.26.0", + "@hyperjump/json-schema": "^1.11.0", + "@modyfi/vite-plugin-yaml": "^1.1.0", + "@types/micromodal": "^0.3.5", + "@types/node": "^22.14.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@types/sha256-wasm": "^2.2.3", + "@types/swagger-ui-react": "^5.18.0", + "@types/webpack-bundle-analyzer": "^4.7.0", + "@vitejs/plugin-legacy": "^6.0.1", + "@vitejs/plugin-react": "^4.3.4", + "ajv": "^8.17.1", + "babel-loader": "^9.2.1", "buffer": "^6.0.3", - "copy-webpack-plugin": "^8.1.1", - "css-loader": "^5.2.7", - "dotenv": "^8.6.0", - "fs-extra": "^10.1.0", - "html-webpack-plugin": "^5.5.3", - "mini-css-extract-plugin": "^1.6.2", - "postcss": "^8.4.28", - "postcss-loader": "^7.3.3", - "postcss-preset-env": "^9.1.1", - "rimraf": "^3.0.2", - "sass": "^1.66.0", - "sass-loader": "^11.1.1", + "copy-webpack-plugin": "^12.0.2", + "css-loader": "^7.1.2", + "fs-extra": "^11.3.0", + "html-webpack-plugin": "^5.6.3", + "mini-css-extract-plugin": "^2.9.2", + "postcss": "^8.5.1", + "postcss-loader": "^8.1.1", + "postcss-preset-env": "^10.1.3", + "rimraf": "^6.0.1", + "sass": "^1.84.0", + "sass-loader": "^16.0.4 ", "stream-browserify": "^3.0.0", - "style-loader": "^2.0.0", - "webpack": "^5.88.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "style-loader": "^4.0.0", + "terser": "^5.39.0", + "ts-loader": "^9.5.2", + "typescript": "^5.7.3", + "vite": "^6.1.0", + "vite-css-modules": "^1.8.4", + "vite-plugin-html": "^3.2.2", + "vite-plugin-static-copy": "^2.2.0", + "webpack": "^5.97.1", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.0", "webpack-manifest-plugin": "^5.0.0", - "webpack-merge": "^5.9.0" + "webpack-merge": "^6.0.1", + "yaml": "^2.7.0" } } diff --git a/client/scripts/validate.mjs b/client/scripts/validate.mjs new file mode 100644 index 0000000..67b4c3b --- /dev/null +++ b/client/scripts/validate.mjs @@ -0,0 +1,32 @@ +// @ts-check +import path from "node:path"; +import fs from "node:fs/promises"; +import { cwd } from "node:process"; +import { validate } from "@hyperjump/json-schema/openapi-3-1"; +import YAML from "yaml"; +import { parseConfiguration } from "../configs/parse-config.js"; + +const schemaPath = path.join(cwd(), "..", "src", "pages", "api", "schema.yaml"); + +run().catch((error) => { + console.error(error); + process.exitCode = 1; + process.exit(); +}); + +async function run() { + parseConfiguration(); + // const fileContent = await fs.readFile(schemaPath, { encoding: "utf8" }); + // const parsedSchema = YAML.parse(fileContent) + // const output = await validate( + // "https://spec.openapis.org/oas/3.1/schema-base", + // parsedSchema, + // // the library doesn't support values beyond `"FLAG"` and `"BASIC"` + // // but it's the only library in js which can validate OpenAPI 3.1 schemas + // "BASIC" + // ); + + // if (!output.valid) { + // throw new Error("Failed to validate OpenAPI Schema.") + // } +} diff --git a/client/src/api/_index.js b/client/src/api/_index.js deleted file mode 100644 index 6990896..0000000 --- a/client/src/api/_index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { kemonoAPI } from "./kemono/_index"; -export { paysitesAPI } from "./paysites/_index"; diff --git a/client/src/api/account/account.ts b/client/src/api/account/account.ts new file mode 100644 index 0000000..4282ba4 --- /dev/null +++ b/client/src/api/account/account.ts @@ -0,0 +1,19 @@ +import { apiFetch } from "#lib/api"; +import { IAccount } from "#entities/account"; + +interface IResult { + props: { + currentPage: "account"; + title: string; + account: IAccount; + notifications_count: number; + }; +} + +export async function fetchAccount() { + const path = "/account"; + + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/account/administrator/account.ts b/client/src/api/account/administrator/account.ts new file mode 100644 index 0000000..4e9da46 --- /dev/null +++ b/client/src/api/account/administrator/account.ts @@ -0,0 +1,11 @@ +import { apiV2Fetch } from "#lib/api"; +import { IAccount } from "#entities/account"; + +export async function apiFetchAccount(accountID: number) { + const pathSpec = `/account/administrator/account/{account_id}`; + const path = `/account/administrator/account/${accountID}`; + + const result = await apiV2Fetch(pathSpec, "GET", path); + + return result; +} diff --git a/client/src/api/account/administrator/accounts.ts b/client/src/api/account/administrator/accounts.ts new file mode 100644 index 0000000..4584aa4 --- /dev/null +++ b/client/src/api/account/administrator/accounts.ts @@ -0,0 +1,46 @@ +import { apiV2Fetch } from "#lib/api"; +import { IAccount } from "#entities/account"; + +export async function apiCountAccounts(name?: string, role?: string) { + const pathSpec = `/account/administrator/accounts`; + const path = `/account/administrator/accounts`; + const searchParams = new URLSearchParams(); + + if (name) { + searchParams.set("name", name); + } + + if (role) { + searchParams.set("role", role); + } + + const result = await apiV2Fetch(pathSpec, "GET", path, { + searchParams, + }); + + return result; +} + +export async function apiFetchAccounts( + page: number, + name?: string, + role?: string +) { + const pathSpec = `/account/administrator/accounts/{page}`; + const path = `/account/administrator/accounts/${page}`; + const searchParams = new URLSearchParams(); + + if (name) { + searchParams.set("name", name); + } + + if (role) { + searchParams.set("role", role); + } + + const result = await apiV2Fetch(pathSpec, "GET", path, { + searchParams, + }); + + return result; +} diff --git a/client/src/api/account/administrator/change-roles.ts b/client/src/api/account/administrator/change-roles.ts new file mode 100644 index 0000000..f881c12 --- /dev/null +++ b/client/src/api/account/administrator/change-roles.ts @@ -0,0 +1,22 @@ +import { apiV2Fetch } from "#lib/api"; + +interface IBody { + role: string; +} + +export async function apiChangeTargetAccountRole( + accountID: number, + role: string +) { + const pathSpec = `/account/administrator/account/{account_id}`; + const path = `/account/administrator/account/${accountID}`; + const body: IBody = { + role, + }; + + const targetAccountID = await apiV2Fetch(pathSpec, "PATCH", path, { + body, + }); + + return targetAccountID; +} diff --git a/client/src/api/account/administrator/index.ts b/client/src/api/account/administrator/index.ts new file mode 100644 index 0000000..a4c1526 --- /dev/null +++ b/client/src/api/account/administrator/index.ts @@ -0,0 +1,3 @@ +export { apiCountAccounts, apiFetchAccounts } from "./accounts"; +export { apiChangeTargetAccountRole } from "./change-roles"; +export { apiFetchAccount } from "./account"; diff --git a/client/src/api/account/auto-import-keys/get.ts b/client/src/api/account/auto-import-keys/get.ts new file mode 100644 index 0000000..fd152e4 --- /dev/null +++ b/client/src/api/account/auto-import-keys/get.ts @@ -0,0 +1,19 @@ +import { apiFetch } from "#lib/api"; +import { IAutoImportKey } from "#entities/account"; + +interface IResult { + props: { + currentPage: "account"; + title: "Your service keys"; + service_keys: IAutoImportKey[]; + }; + import_ids: { key_id: string; import_id: string }[]; +} + +export async function fetchAccountAutoImportKeys() { + const path = `/account/keys`; + + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/account/auto-import-keys/index.ts b/client/src/api/account/auto-import-keys/index.ts new file mode 100644 index 0000000..134ec93 --- /dev/null +++ b/client/src/api/account/auto-import-keys/index.ts @@ -0,0 +1,2 @@ +export { fetchAccountAutoImportKeys } from "./get"; +export { fetchRevokeAutoImportKeys } from "./revoke"; diff --git a/client/src/api/account/auto-import-keys/revoke.ts b/client/src/api/account/auto-import-keys/revoke.ts new file mode 100644 index 0000000..1658129 --- /dev/null +++ b/client/src/api/account/auto-import-keys/revoke.ts @@ -0,0 +1,15 @@ +import { apiFetch } from "#lib/api"; + +interface IBody { + revoke: number[]; +} + +export async function fetchRevokeAutoImportKeys(keyIDs: number[]) { + const path = `/account/keys`; + const body: IBody = { + revoke: keyIDs, + }; + await apiFetch(path, { method: "POST", body }); + + return true; +} diff --git a/client/src/api/account/change-password.ts b/client/src/api/account/change-password.ts new file mode 100644 index 0000000..ed647cf --- /dev/null +++ b/client/src/api/account/change-password.ts @@ -0,0 +1,24 @@ +import { apiFetch } from "#lib/api"; + +interface IBody { + "current-password": string; + "new-password": string; + "new-password-confirmation": string; +} + +export async function fetchAccountChangePassword( + currentPassword: string, + newPassword: string, + newPasswordConfirmation: string +) { + const path = `/account/change_password`; + const body: IBody = { + "current-password": currentPassword, + "new-password": newPassword, + "new-password-confirmation": newPasswordConfirmation, + }; + + const result = await apiFetch(path, { method: "POST", body }); + + return result; +} diff --git a/client/src/api/account/dms/get.ts b/client/src/api/account/dms/get.ts new file mode 100644 index 0000000..12b3cf8 --- /dev/null +++ b/client/src/api/account/dms/get.ts @@ -0,0 +1,22 @@ +import { apiFetch } from "#lib/api"; +import { IUnapprovedDM } from "#entities/dms"; + +interface IResult { + currentPage: "import"; + account_id: number; + status: "ignored" | "pending"; + dms: IUnapprovedDM[]; +} + +export async function fetchDMsForReview(status?: "ignored" | "pending") { + const path = `/account/review_dms`; + const params = new URLSearchParams(); + + if (status) { + params.set("status", status); + } + + const result = await apiFetch(path, { method: "GET" }, params); + + return result; +} diff --git a/client/src/api/account/dms/index.ts b/client/src/api/account/dms/index.ts new file mode 100644 index 0000000..55f9cda --- /dev/null +++ b/client/src/api/account/dms/index.ts @@ -0,0 +1,2 @@ +export { fetchDMsForReview } from "./get"; +export { fetchApproveDMs } from "./review" diff --git a/client/src/api/account/dms/review.ts b/client/src/api/account/dms/review.ts new file mode 100644 index 0000000..7fa1059 --- /dev/null +++ b/client/src/api/account/dms/review.ts @@ -0,0 +1,21 @@ +import { apiFetch } from "#lib/api"; + +interface IBody { + approved_hashes: string[]; + delete_ignored?: boolean; +} + +export async function fetchApproveDMs( + hashes: string[], + isIgnoredDeleted?: boolean +) { + const path = `/account/review_dms`; + const body: IBody = { + approved_hashes: hashes, + delete_ignored: isIgnoredDeleted, + }; + + const result = await apiFetch(path, { method: "POST", body }); + + return result; +} diff --git a/client/src/api/account/favorites/favorite-post.ts b/client/src/api/account/favorites/favorite-post.ts new file mode 100644 index 0000000..a9be04b --- /dev/null +++ b/client/src/api/account/favorites/favorite-post.ts @@ -0,0 +1,25 @@ +import { apiFetch } from "#lib/api"; + +export async function apiFavoritePost( + service: string, + profileID: string, + postID: string +) { + const path = `/favorites/post/${service}/${profileID}/${postID}`; + + await apiFetch(path, { method: "POST" }); + + return true; +} + +export async function apiUnfavoritePost( + service: string, + profileID: string, + postID: string +) { + const path = `/favorites/post/${service}/${profileID}/${postID}`; + + await apiFetch(path, { method: "DELETE" }); + + return true; +} diff --git a/client/src/api/account/favorites/favorite-profile.ts b/client/src/api/account/favorites/favorite-profile.ts new file mode 100644 index 0000000..9e6db7c --- /dev/null +++ b/client/src/api/account/favorites/favorite-profile.ts @@ -0,0 +1,17 @@ +import { apiFetch } from "#lib/api"; + +export async function apiFavoriteProfile(service: string, profileID: string) { + const path = `/favorites/creator/${service}/${profileID}`; + + await apiFetch(path, { method: "POST" }); + + return true; +} + +export async function apiUnfavoriteProfile(service: string, profileID: string) { + const path = `/favorites/creator/${service}/${profileID}`; + + await apiFetch(path, { method: "DELETE" }); + + return true; +} diff --git a/client/src/api/account/favorites/get-favourite-artists.ts b/client/src/api/account/favorites/get-favourite-artists.ts new file mode 100644 index 0000000..665297f --- /dev/null +++ b/client/src/api/account/favorites/get-favourite-artists.ts @@ -0,0 +1,15 @@ +import { apiFetch } from "#lib/api"; +import { IFavouriteArtist } from "#entities/account"; + +export async function fetchFavouriteProfiles() { + const path = `/account/favorites`; + const params = new URLSearchParams([["type", "artist"]]); + + const data = await apiFetch( + path, + { method: "GET" }, + params + ); + + return data; +} diff --git a/client/src/api/account/favorites/get-favourite-posts.ts b/client/src/api/account/favorites/get-favourite-posts.ts new file mode 100644 index 0000000..5b2b964 --- /dev/null +++ b/client/src/api/account/favorites/get-favourite-posts.ts @@ -0,0 +1,15 @@ +import { apiFetch } from "#lib/api"; +import { IFavouritePost } from "#entities/account"; + +export async function fetchFavouritePosts() { + const path = `/account/favorites`; + const params = new URLSearchParams([["type", "post"]]); + + const data = await apiFetch( + path, + { method: "GET" }, + params + ); + + return data; +} diff --git a/client/src/api/account/favorites/index.ts b/client/src/api/account/favorites/index.ts new file mode 100644 index 0000000..961927c --- /dev/null +++ b/client/src/api/account/favorites/index.ts @@ -0,0 +1,4 @@ +export { fetchFavouriteProfiles } from "./get-favourite-artists"; +export { fetchFavouritePosts } from "./get-favourite-posts"; +export { apiFavoritePost, apiUnfavoritePost } from "./favorite-post"; +export { apiFavoriteProfile, apiUnfavoriteProfile } from "./favorite-profile"; diff --git a/client/src/api/account/index.ts b/client/src/api/account/index.ts new file mode 100644 index 0000000..e87cc7a --- /dev/null +++ b/client/src/api/account/index.ts @@ -0,0 +1,4 @@ +export { fetchAccount } from "./account"; +export { fetchAccountNotifications } from "./notifications"; +export { fetchAddProfileLink } from "./profiles"; +export { fetchAccountChangePassword } from "./change-password"; diff --git a/client/src/api/account/moderator/index.ts b/client/src/api/account/moderator/index.ts new file mode 100644 index 0000000..36ddfc1 --- /dev/null +++ b/client/src/api/account/moderator/index.ts @@ -0,0 +1,5 @@ +export { + fetchProfileLinkRequests, + fetchApproveLinkRequest, + fetchRejectLinkRequest, +} from "./profile-link-requests"; diff --git a/client/src/api/account/moderator/profile-link-requests.ts b/client/src/api/account/moderator/profile-link-requests.ts new file mode 100644 index 0000000..05cbcb2 --- /dev/null +++ b/client/src/api/account/moderator/profile-link-requests.ts @@ -0,0 +1,30 @@ +import { apiFetch } from "#lib/api"; +import { IProfileLinkRequest } from "#entities/account"; + +export async function fetchProfileLinkRequests() { + const path = `/account/moderator/tasks/creator_links`; + + const linkRequests = await apiFetch(path, { + method: "GET", + }); + + return linkRequests; +} + +export async function fetchApproveLinkRequest(requestID: string) { + const path = `/account/moderator/creator_link_requests/${requestID}/approve`; + const resp = await apiFetch<{ response: "approved" }>(path, { + method: "POST", + }); + + return resp; +} + +export async function fetchRejectLinkRequest(requestID: string) { + const path = `/account/moderator/creator_link_requests/${requestID}/reject`; + const resp = await apiFetch<{ response: "rejected" }>(path, { + method: "POST", + }); + + return resp; +} diff --git a/client/src/api/account/notifications.ts b/client/src/api/account/notifications.ts new file mode 100644 index 0000000..20a8b6b --- /dev/null +++ b/client/src/api/account/notifications.ts @@ -0,0 +1,17 @@ +import { apiFetch } from "#lib/api"; +import { INotification } from "#entities/account"; + +interface IResult { + props: { + currentPage: "account"; + notifications: INotification[]; + }; +} + +export async function fetchAccountNotifications() { + const path = "/account/notifications"; + + const result = await apiFetch(path, { method: "GET" }); + + return result.props; +} diff --git a/client/src/api/account/profiles.ts b/client/src/api/account/profiles.ts new file mode 100644 index 0000000..e1390e7 --- /dev/null +++ b/client/src/api/account/profiles.ts @@ -0,0 +1,42 @@ +import { apiFetch } from "#lib/api"; +import { IArtist } from "#entities/profiles"; + +interface IResult { + message: string + props: { + id: string + service: string + artist: IArtist + share_count: number + has_links: "✔️" | "0" + display_data: { + service: string + href: string + } + } +} + +interface IBody { + service: string; + artist_id: string; + reason?: string; +} + +export async function fetchAddProfileLink( + service: string, + profileID: string, + linkService: string, + linkProfileID: string, + reason?: string +) { + const path = `/${service}/user/${profileID}/links/new`; + const body: IBody = { + service: linkService, + artist_id: linkProfileID, + reason, + }; + + const result = await apiFetch(path, { method: "POST", body }); + + return result; +} diff --git a/client/src/api/authentication/index.ts b/client/src/api/authentication/index.ts new file mode 100644 index 0000000..f03bd79 --- /dev/null +++ b/client/src/api/authentication/index.ts @@ -0,0 +1,3 @@ +export { fetchRegisterAccount } from "./register"; +export { fetchLoginAccount } from "./login"; +export { fetchLogoutAccount } from "./logout"; diff --git a/client/src/api/authentication/login.ts b/client/src/api/authentication/login.ts new file mode 100644 index 0000000..d49a89e --- /dev/null +++ b/client/src/api/authentication/login.ts @@ -0,0 +1,28 @@ +import { IAccount } from "#entities/account"; +import { apiFetch, ensureAPIError } from "#lib/api"; +import { fetchAccount } from "../account/account"; + +export async function fetchLoginAccount(username: string, password: string) { + const path = `/authentication/login`; + const body = { + username, + password, + }; + + try { + const result = await apiFetch(path, { method: "POST", body }); + + return result; + } catch (error) { + ensureAPIError(error); + + // account is already logged in + if (error.response.status !== 409) { + throw error; + } + + const result = await fetchAccount(); + + return result.props.account; + } +} diff --git a/client/src/api/authentication/logout.ts b/client/src/api/authentication/logout.ts new file mode 100644 index 0000000..5939fc4 --- /dev/null +++ b/client/src/api/authentication/logout.ts @@ -0,0 +1,9 @@ +import { apiFetch } from "#lib/api"; + +export async function fetchLogoutAccount() { + const path = `/authentication/logout`; + + const result = await apiFetch(path, { method: "POST"}); + + return result; +} diff --git a/client/src/api/authentication/register.ts b/client/src/api/authentication/register.ts new file mode 100644 index 0000000..fc4d1f2 --- /dev/null +++ b/client/src/api/authentication/register.ts @@ -0,0 +1,20 @@ +import { apiFetch } from "#lib/api"; + +export async function fetchRegisterAccount( + userName: string, + password: string, + confirmPassword: string, + favorites?: string +) { + const path = `/authentication/register`; + const body = { + username: userName, + password, + confirm_password: confirmPassword, + favorites_json: favorites, + }; + + const result = await apiFetch(path, { method: "POST", body }); + + return result; +} diff --git a/client/src/api/dms/all.ts b/client/src/api/dms/all.ts new file mode 100644 index 0000000..205f0fe --- /dev/null +++ b/client/src/api/dms/all.ts @@ -0,0 +1,29 @@ +import { apiFetch } from "#lib/api"; +import { IApprovedDM } from "#entities/dms"; + +interface IResult { + props: { + currentPage: "artists"; + count: number; + limit: number; + dms: IApprovedDM[]; + }; + base: {}; +} + +export async function fetchDMs(offset?: number, query?: string) { + const path = "/dms"; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + if (query) { + params.set("q", query); + } + + const result = await apiFetch(path, { method: "GET" }, params); + + return result; +} diff --git a/client/src/api/dms/has-pending.ts b/client/src/api/dms/has-pending.ts new file mode 100644 index 0000000..3e7be2b --- /dev/null +++ b/client/src/api/dms/has-pending.ts @@ -0,0 +1,8 @@ +import { apiFetch } from "#lib/api"; + +export async function fetchHasPendingDMs() { + const path = `/has_pending_dms`; + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/dms/index.ts b/client/src/api/dms/index.ts new file mode 100644 index 0000000..3fd3257 --- /dev/null +++ b/client/src/api/dms/index.ts @@ -0,0 +1,3 @@ +export { fetchDMs } from "./all"; +export { fetchProfileDMs } from "./profile"; +export { fetchHasPendingDMs } from "./has-pending"; diff --git a/client/src/api/dms/profile.ts b/client/src/api/dms/profile.ts new file mode 100644 index 0000000..b32b5d7 --- /dev/null +++ b/client/src/api/dms/profile.ts @@ -0,0 +1,27 @@ +import { apiFetch } from "#lib/api"; +import { IArtist } from "#entities/profiles"; +import { IApprovedDM } from "#entities/dms"; + +interface IResult { + props: { + id: string; + service: string; + artist: IArtist; + display_data: { + service: string; + href: string; + }; + + share_count: number; + dm_count: number; + dms: IApprovedDM[]; + has_links: "✔️" | "0"; + }; +} + +export async function fetchProfileDMs(service: string, profileID: string) { + const path = `/${service}/user/${profileID}/dms`; + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/files/archive-file.ts b/client/src/api/files/archive-file.ts new file mode 100644 index 0000000..d0832a0 --- /dev/null +++ b/client/src/api/files/archive-file.ts @@ -0,0 +1,35 @@ +import { apiFetch } from "#lib/api"; + +export interface IArchiveFile { + password?: string; + file: { + hash: string; + ext: string; + }; + file_list: string[]; +} + +export async function apiFetchArchiveFile(fileHash: string) { + const path = `/file/${fileHash}`; + + const result = await apiFetch(path, { method: "GET" }); + + return result; +} + +type SetPasswordBody = Array; +type SetPasswordResponse = "ok" | { + error: string; +}; + +export async function apiSetArchiveFilePassword( + archiveHash: string, + password: string +): Promise { + const path = `/file/${archiveHash}`; + const body: SetPasswordBody = [password]; + + const result = await apiFetch(path, { body, method: "PATCH" }); + + return result; +} diff --git a/client/src/api/files/index.ts b/client/src/api/files/index.ts new file mode 100644 index 0000000..2981eac --- /dev/null +++ b/client/src/api/files/index.ts @@ -0,0 +1,2 @@ +export { apiFetchArchiveFile, apiSetArchiveFilePassword, type IArchiveFile } from "./archive-file"; +export { fetchSearchFileByHash } from "./search-by-hash"; diff --git a/client/src/api/files/search-by-hash.ts b/client/src/api/files/search-by-hash.ts new file mode 100644 index 0000000..a9adf61 --- /dev/null +++ b/client/src/api/files/search-by-hash.ts @@ -0,0 +1,56 @@ +import { apiFetch } from "#lib/api"; + +interface IResult { + id: number; + hash: string; + mtime: string; + + ctime: string; + + mime: string; + ext: string; + added: string; + + size: number; + ihash: string; + + posts: IPostResult[]; + discord_posts: IDiscordPostResult[]; +} + +interface IPostResult { + file_id: number; + id: string; + user: string; + service: string; + title: string; + substring: string; + published: string; + + file: { + name: string; + path: string; + }; + attachments: { name: string; path: string }[]; +} + +interface IDiscordPostResult { + file_id: number; + id: string; + server: string; + channel: string; + substring: string; + published: string; + + embeds: unknown[]; + mentions: unknown[]; + attachments: { name: string; path: string }[]; +} + +export async function fetchSearchFileByHash(fileHash: string) { + const path = `/search_hash/${fileHash}`; + + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/imports/create-import.ts b/client/src/api/imports/create-import.ts new file mode 100644 index 0000000..1e03057 --- /dev/null +++ b/client/src/api/imports/create-import.ts @@ -0,0 +1,26 @@ +import { apiFetch } from "#lib/api"; + +interface IBody { + session_key: string; + service: string; + auto_import?: string; + save_session_key?: string; + save_dms?: boolean; + channel_ids?: string; + "x-bc"?: string; + auth_id?: string; + user_agent?: string; +} + +interface IResult { + import_id: string; +} + +export async function fetchCreateImport(input: IBody) { + const path = `/importer/submit`; + const body: IBody = input; + + const result = await apiFetch(path, { method: "POST", body }); + + return result; +} diff --git a/client/src/api/imports/get-import.ts b/client/src/api/imports/get-import.ts new file mode 100644 index 0000000..f3430e3 --- /dev/null +++ b/client/src/api/imports/get-import.ts @@ -0,0 +1,9 @@ +import { apiFetch } from "#lib/api"; + +export async function fetchImportLogs(importId: string): Promise> { + const path = `/importer/logs/${importId}`; + + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/imports/index.ts b/client/src/api/imports/index.ts new file mode 100644 index 0000000..958814d --- /dev/null +++ b/client/src/api/imports/index.ts @@ -0,0 +1,2 @@ +export { fetchImportLogs } from "./get-import"; +export { fetchCreateImport } from "./create-import"; diff --git a/client/src/api/kemono/_index.js b/client/src/api/kemono/_index.js deleted file mode 100644 index a41d235..0000000 --- a/client/src/api/kemono/_index.js +++ /dev/null @@ -1,14 +0,0 @@ -import { favorites } from "./favorites"; -import { posts } from "./posts"; -import { api } from "./api"; -import { dms } from "./dms"; - -/** - * @type {KemonoAPI} - */ -export const kemonoAPI = { - favorites, - posts, - api, - dms, -}; diff --git a/client/src/api/kemono/api.js b/client/src/api/kemono/api.js deleted file mode 100644 index 7031be8..0000000 --- a/client/src/api/kemono/api.js +++ /dev/null @@ -1,100 +0,0 @@ -import { KemonoError } from "@wp/utils"; -import { kemonoFetch } from "./kemono-fetch"; -import { CREATORS_LOCATION } from "@wp/env/env-vars"; - -export const api = { - bans, - bannedArtist, - creators, - logs, -}; - -async function bans() { - try { - const response = await kemonoFetch("/api/v1/creators/bans", { method: "GET" }); - - if (!response || !response.ok) { - alert(new KemonoError(6)); - return null; - } - - /** - * @type {KemonoAPI.API.BanItem[]} - */ - const banItems = await response.json(); - - return banItems; - } catch (error) { - console.error(error); - } -} - -/** - * @param {string} id - * @param {string} service - */ -async function bannedArtist(id, service) { - const params = new URLSearchParams([["service", service]]).toString(); - - try { - const response = await kemonoFetch(`/api/v1/lookup/cache/${id}?${params}`); - - if (!response || !response.ok) { - alert(new KemonoError(7)); - return null; - } - - /** - * @type {KemonoAPI.API.BannedArtist} - */ - const artist = await response.json(); - - return artist; - } catch (error) { - console.error(error); - } -} - -async function creators() { - try { - const response = await kemonoFetch(CREATORS_LOCATION || "/api/v1/creators", { - method: "GET", - }); - - if (!response || !response.ok) { - alert(new KemonoError(8)); - return null; - } - - /** - * @type {KemonoAPI.User[]} - */ - const artists = await response.json(); - - return artists; - } catch (error) { - console.error(error); - } -} - -async function logs(importID) { - try { - const response = await kemonoFetch(`/api/v1/importer/logs/${importID}`, { - method: "GET", - }); - - if (!response || !response.ok) { - alert(new KemonoError(9)); - return null; - } - - /** - * @type {KemonoAPI.API.LogItem[]} - */ - const logs = await response.json(); - - return logs; - } catch (error) { - console.error(error); - } -} diff --git a/client/src/api/kemono/dms.js b/client/src/api/kemono/dms.js deleted file mode 100644 index 6f4dd78..0000000 --- a/client/src/api/kemono/dms.js +++ /dev/null @@ -1,22 +0,0 @@ -import { KemonoError } from "@wp/utils"; -import { kemonoFetch } from "./kemono-fetch"; - -/** - * @type {KemonoAPI.DMs} - */ -export const dms = { - retrieveHasPendingDMs, -}; - -async function retrieveHasPendingDMs() { - try { - const response = await kemonoFetch(`/api/v1/has_pending_dms`); - - if (!response || !response.ok) { - throw new Error(`Error ${response.status}: ${response.statusText}`); - } - return await response.json(); - } catch (error) { - console.error(error); - } -} diff --git a/client/src/api/kemono/favorites.js b/client/src/api/kemono/favorites.js deleted file mode 100644 index 6b87f84..0000000 --- a/client/src/api/kemono/favorites.js +++ /dev/null @@ -1,142 +0,0 @@ -import { KemonoError } from "@wp/utils"; -import { kemonoFetch } from "./kemono-fetch"; - -/** - * @type {KemonoAPI.Favorites} - */ -export const favorites = { - retrieveFavoriteArtists, - favoriteArtist, - unfavoriteArtist, - retrieveFavoritePosts, - favoritePost, - unfavoritePost, -}; - -async function retrieveFavoriteArtists() { - const params = new URLSearchParams([["type", "artist"]]).toString(); - - try { - const response = await kemonoFetch(`/api/v1/account/favorites?${params}`); - - if (!response || !response.ok) { - throw new Error(`Error ${response.status}: ${response.statusText}`); - } - /** - * @type {string} - */ - const favs = await response.text(); - return favs; - } catch (error) { - console.error(error); - } -} - -/** - * @param {string} service - * @param {string} userID - */ -async function favoriteArtist(service, userID) { - try { - const response = await kemonoFetch(`/api/v1/favorites/creator/${service}/${userID}`, { method: "POST" }); - - if (!response || !response.ok) { - alert(new KemonoError(3)); - return false; - } - - return true; - } catch (error) { - console.error(error); - } -} - -/** - * @param {string} service - * @param {string} userID - */ -async function unfavoriteArtist(service, userID) { - try { - const response = await kemonoFetch(`/api/v1/favorites/creator/${service}/${userID}`, { method: "DELETE" }); - - if (!response || !response.ok) { - alert(new KemonoError(4)); - return false; - } - - return true; - } catch (error) { - console.error(error); - } -} - -async function retrieveFavoritePosts() { - const params = new URLSearchParams([["type", "post"]]).toString(); - - try { - const response = await kemonoFetch(`/api/v1/account/favorites?${params}`); - - if (!response || !response.ok) { - throw new Error(`Error ${response.status}: ${response.statusText}`); - } - - /** - * @type {KemonoAPI.Post[]} - */ - const favs = await response.json(); - /** - * @type {KemonoAPI.Favorites.Post[]} - */ - const transformedFavs = favs.map((post) => { - return { - id: post.id, - service: post.service, - user: post.user, - }; - }); - - return JSON.stringify(transformedFavs); - } catch (error) { - console.error(error); - } -} - -/** - * @param {string} service - * @param {string} user - * @param {string} post_id - */ -async function favoritePost(service, user, post_id) { - try { - const response = await kemonoFetch(`/api/v1/favorites/post/${service}/${user}/${post_id}`, { method: "POST" }); - - if (!response || !response.ok) { - alert(new KemonoError(1)); - return false; - } - - return true; - } catch (error) { - console.error(error); - } -} - -/** - * @param {string} service - * @param {string} user - * @param {string} post_id - */ -async function unfavoritePost(service, user, post_id) { - try { - const response = await kemonoFetch(`/api/v1/favorites/post/${service}/${user}/${post_id}`, { method: "DELETE" }); - - if (!response || !response.ok) { - alert(new KemonoError(2)); - return false; - } - - return true; - } catch (error) { - console.error(error); - } -} diff --git a/client/src/api/kemono/kemono-fetch.js b/client/src/api/kemono/kemono-fetch.js deleted file mode 100644 index 539609a..0000000 --- a/client/src/api/kemono/kemono-fetch.js +++ /dev/null @@ -1,46 +0,0 @@ -import { isLoggedIn } from "@wp/js/account"; - -/** - * Generic request for Kemono API. - * @param {RequestInfo} endpoint - * @param {RequestInit} options - * @returns {Promise} - */ -export async function kemonoFetch(endpoint, options) { - try { - const response = await fetch(endpoint, options); - - // doing this because the server returns `401` before redirecting - // in case of favs - if (response.status === 401) { - // server logged the account out - if (isLoggedIn) { - localStorage.removeItem("logged_in"); - localStorage.removeItem("role"); - localStorage.removeItem("favs"); - localStorage.removeItem("post_favs"); - location.href = "/account/logout"; - return; - } - const loginURL = new URL("/account/login", location.origin).toString(); - location = addURLParam(loginURL, "location", location.pathname); - return; - } - - return response; - } catch (error) { - console.error(`Kemono request error: ${error}`); - } -} - -/** - * @param {string} url - * @param {string} paramName - * @param {string} paramValue - * @returns {string} - */ -function addURLParam(url, paramName, paramValue) { - var newURL = new URL(url); - newURL.searchParams.set(paramName, paramValue); - return newURL.toString(); -} diff --git a/client/src/api/kemono/posts.js b/client/src/api/kemono/posts.js deleted file mode 100644 index b9f97bb..0000000 --- a/client/src/api/kemono/posts.js +++ /dev/null @@ -1,26 +0,0 @@ -import { kemonoFetch } from "./kemono-fetch"; -import { KemonoError } from "@wp/utils"; - -export const posts = { - attemptFlag, -}; - -/** - * @param {string} service - * @param {string} user - * @param {string} post_id - */ -async function attemptFlag(service, user, post_id) { - try { - const response = await kemonoFetch(`/api/v1/${service}/user/${user}/post/${post_id}/flag`, { method: "POST" }); - - if (!response || !response.ok) { - alert(new KemonoError(5)); - return false; - } - - return true; - } catch (error) { - console.error(error); - } -} diff --git a/client/src/api/paysites/_index.js b/client/src/api/paysites/_index.js deleted file mode 100644 index 0e1948b..0000000 --- a/client/src/api/paysites/_index.js +++ /dev/null @@ -1 +0,0 @@ -export const paysitesAPI = {}; diff --git a/client/src/api/posts/announcements.ts b/client/src/api/posts/announcements.ts new file mode 100644 index 0000000..10ace35 --- /dev/null +++ b/client/src/api/posts/announcements.ts @@ -0,0 +1,9 @@ +import { apiFetch } from "#lib/api"; +import { IAnnouncement } from "#entities/posts"; + +export async function fetchAnnouncements(service: string, profileID: string) { + const path = `/${service}/user/${profileID}/announcements`; + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/posts/flag.ts b/client/src/api/posts/flag.ts new file mode 100644 index 0000000..c7ea1fc --- /dev/null +++ b/client/src/api/posts/flag.ts @@ -0,0 +1,14 @@ +import { apiFetch } from "#lib/api"; + +interface FlagPostParams { + service: string; + creatorId: string; + postId: string; + reason: string; +} + +export async function flagPost({ service, creatorId, postId, reason }: FlagPostParams): Promise { + let path = `/${service}/user/${creatorId}/post/${postId}/flag`; + + return await apiFetch(path, { method: "POST", body: { reason } }); +} diff --git a/client/src/api/posts/index.ts b/client/src/api/posts/index.ts new file mode 100644 index 0000000..22767b0 --- /dev/null +++ b/client/src/api/posts/index.ts @@ -0,0 +1,7 @@ +export { fetchPosts } from "./posts"; +export { fetchPost, fetchPostComments, fetchPostData } from "./post"; +export { fetchPostRevision } from "./revision"; +export { fetchPopularPosts } from "./popular"; +export { fetchAnnouncements } from "./announcements"; +export { fetchRandomPost } from "./random"; +export { flagPost } from "./flag"; diff --git a/client/src/api/posts/popular.ts b/client/src/api/posts/popular.ts new file mode 100644 index 0000000..f3d4c0e --- /dev/null +++ b/client/src/api/posts/popular.ts @@ -0,0 +1,74 @@ +import { apiFetch } from "#lib/api"; +import { IPopularPostsPeriod, IPost } from "#entities/posts"; + +interface IResult { + info: { + /** + * Datetime string. + */ + date: string; + /** + * Datetime string. + */ + min_date: string; + /** + * Datetime string. + */ + max_date: string; + /** + * Value is a tuple of date strings. + */ + navigation_dates: Record; + /** + * Human description of range. + */ + range_desc: string; + scale: IPopularPostsPeriod; + }; + props: { + currentPage: "popular_posts"; + /** + * Date string. + */ + today: string; + /** + * Date string. + */ + earliest_date_for_popular: string; + limit: number; + count: number; + }; + results: IPost[]; + base: {}; + result_previews: ( + | { type: "thumbnail"; server: string; name: string; path: string } + | { type: "embed"; url: string; subject: string; description: string } + )[]; + result_attachments: { server: string; name: string; path: string }[]; + result_is_image: boolean; +} + +export async function fetchPopularPosts( + date?: string, + scale?: IPopularPostsPeriod, + offset?: number +) { + const path = `/posts/popular`; + const params = new URLSearchParams(); + + if (date && scale !== "recent") { + params.set("date", date); + } + + if (scale) { + params.set("period", scale); + } + + if (offset) { + params.set("o", String(offset)); + } + + const result = await apiFetch(path, { method: "GET" }, params); + + return result; +} diff --git a/client/src/api/posts/post.ts b/client/src/api/posts/post.ts new file mode 100644 index 0000000..569800b --- /dev/null +++ b/client/src/api/posts/post.ts @@ -0,0 +1,71 @@ +import { apiFetch } from "#lib/api"; +import { + IComment, + IPost, + IPostAttachment, + IPostPreview, + IPostRevision, + IPostVideo, +} from "#entities/posts"; + +interface IResult { + post: IPost; + attachments: IPostAttachment[]; + previews: IPostPreview[]; + videos: IPostVideo[]; + props: { + service: string; + flagged: string | null; + revisions: [number, IPost][]; + }; +} + +export async function fetchPost( + service: string, + profileID: string, + postID: string +) { + const path = `/${service}/user/${profileID}/post/${postID}`; + const ifModifiedDate = new Date(); + + ifModifiedDate.setFullYear(ifModifiedDate.getFullYear() - 1); + + const headers = new Headers([ + ["If-Modified-Since", ifModifiedDate.toUTCString()], + ]); + const result = await apiFetch(path, { method: "GET", headers }); + + return result; +} + +export async function fetchPostComments( + service: string, + profileID: string, + postID: string +) { + const path = `/${service}/user/${profileID}/post/${postID}/comments`; + const ifModifiedDate = new Date(); + + ifModifiedDate.setFullYear(ifModifiedDate.getFullYear() - 1); + + const headers = new Headers([ + ["If-Modified-Since", ifModifiedDate.toUTCString()], + ]); + const result = await apiFetch(path, { method: "GET", headers }); + + return result; +} + +interface IPostData { + service: string; + artist_id: string; + post_id: string; +} + +export async function fetchPostData(service: string, postID: string) { + const path = `/${service}/post/${postID}`; + + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/posts/posts.ts b/client/src/api/posts/posts.ts new file mode 100644 index 0000000..4ede419 --- /dev/null +++ b/client/src/api/posts/posts.ts @@ -0,0 +1,35 @@ +import { apiFetch } from "#lib/api"; +import { IPost } from "#entities/posts"; + +interface IResult { + count: number; + true_count: number; + posts: IPost[]; +} + +export async function fetchPosts( + offset?: number, + query?: string, + tags?: string[] +) { + const path = "/posts"; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + if (query) { + params.set("q", query); + } + + if (tags) { + for (const tag of tags) { + params.set("tag", tag); + } + } + + const result = await apiFetch(path, { method: "GET" }, params); + + return result; +} diff --git a/client/src/api/posts/random.ts b/client/src/api/posts/random.ts new file mode 100644 index 0000000..8414e18 --- /dev/null +++ b/client/src/api/posts/random.ts @@ -0,0 +1,15 @@ +import { apiFetch } from "#lib/api"; + +interface IResult { + service: string; + artist_id: string; + post_id: string; +} + +export async function fetchRandomPost() { + const path = `/posts/random`; + + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/posts/revision.ts b/client/src/api/posts/revision.ts new file mode 100644 index 0000000..61a88eb --- /dev/null +++ b/client/src/api/posts/revision.ts @@ -0,0 +1,39 @@ +import { apiFetch } from "#lib/api"; +import { IArtistDetails } from "#entities/profiles"; +import { + IComment, + IPost, + IPostAttachment, + IPostPreview, + IPostRevision, + IPostVideo, +} from "#entities/posts"; + +interface IResult { + props: { + currentPage: "revisions"; + service: string; + artist: IArtistDetails; + flagged: string | null; + revisions: [number, IPostRevision][]; + }; + post: IPost; + comments: IComment[]; + result_previews: IPostPreview[]; + result_attachments: IPostAttachment[]; + videos: IPostVideo[]; + archives_enabled: boolean; +} + +export async function fetchPostRevision( + service: string, + profileID: string, + postID: string, + revisionID: string +) { + const path = `/${service}/user/${profileID}/post/${postID}/revision/${revisionID}`; + + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/profiles/discord/index.ts b/client/src/api/profiles/discord/index.ts new file mode 100644 index 0000000..9874422 --- /dev/null +++ b/client/src/api/profiles/discord/index.ts @@ -0,0 +1,29 @@ +import { apiFetch } from "#lib/api"; +import { IDiscordChannelMessage } from "#entities/posts"; + +export async function fetchDiscordServer(serverID: string) { + const path = `/discord/channel/lookup/${serverID}`; + + const result = await apiFetch<{ id: string; name: string }[]>(path, { + method: "GET", + }); + + return result; +} + +export async function fetchDiscordChannel(channelID: string, offset?: number) { + const path = `/discord/channel/${channelID}`; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + const result = await apiFetch( + path, + { method: "GET" }, + params + ); + + return result; +} diff --git a/client/src/api/profiles/fancards.ts b/client/src/api/profiles/fancards.ts new file mode 100644 index 0000000..a2fea77 --- /dev/null +++ b/client/src/api/profiles/fancards.ts @@ -0,0 +1,9 @@ +import { apiFetch } from "#lib/api"; +import { IFanCard } from "#entities/files"; + +export async function fetchFanboxProfileFancards(profileID: string) { + const path = `/fanbox/user/${profileID}/fancards`; + const cards = await apiFetch(path, { method: "GET" }); + + return cards; +} diff --git a/client/src/api/profiles/index.ts b/client/src/api/profiles/index.ts new file mode 100644 index 0000000..1eedbc8 --- /dev/null +++ b/client/src/api/profiles/index.ts @@ -0,0 +1,6 @@ +export { fetchProfiles } from "./profiles"; +export { fetchRandomArtist } from "./random"; +export { fetchArtistProfile } from "./profile"; +export { fetchFanboxProfileFancards } from "./fancards"; +export { fetchProfileLinks } from "./links"; +export { fetchProfilePosts } from "./posts"; diff --git a/client/src/api/profiles/links.ts b/client/src/api/profiles/links.ts new file mode 100644 index 0000000..a60af6d --- /dev/null +++ b/client/src/api/profiles/links.ts @@ -0,0 +1,21 @@ +import { apiFetch } from "#lib/api"; + +interface IResult + extends Array<{ + id: string; + + public_id: string | null; + service: string; + name: string; + + indexed: string; + + updated: string; + }> {} + +export async function fetchProfileLinks(service: string, profileID: string) { + const path = `/${service}/user/${profileID}/links`; + const links = await apiFetch(path, { method: "GET" }); + + return links; +} diff --git a/client/src/api/profiles/posts.ts b/client/src/api/profiles/posts.ts new file mode 100644 index 0000000..84051ee --- /dev/null +++ b/client/src/api/profiles/posts.ts @@ -0,0 +1,58 @@ +import { apiFetch } from "#lib/api"; +import { IArtist } from "#entities/profiles"; +import { IPost } from "#entities/posts"; + +interface IResult { + props: { + currentPage: "posts"; + id: string; + service: string; + name: string; + count: number; + limit: number; + artist: IArtist; + display_data: { + service: string; + href: string; + }; + dm_count: number; + share_count: number; + has_links: "0" | "✔️"; + }; + + base: Record + results: IPost[] + result_previews: Record[] + result_atachments: Record[] + result_is_image: boolean[] + disable_service_icons: true +} + +export async function fetchProfilePosts( + service: string, + profileID: string, + offset?: number, + query?: string, + tags?: string[] +) { + const path = `/${service}/user/${profileID}/posts-legacy`; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + if (query) { + params.set("q", query); + } + + if (tags && tags.length) { + for (const tag of tags) { + params.append("tag", tag); + } + } + + const result = await apiFetch(path, { method: "GET" }, params); + + return result; +} diff --git a/client/src/api/profiles/profile.ts b/client/src/api/profiles/profile.ts new file mode 100644 index 0000000..4dbef88 --- /dev/null +++ b/client/src/api/profiles/profile.ts @@ -0,0 +1,22 @@ +import { apiFetch } from "#lib/api"; +import { IArtistDetails } from "#entities/profiles"; + +export async function fetchArtistProfile( + service: string, + artistID: string +): Promise { + const path = `/${service}/user/${artistID}/profile`; + const ifModifiedDate = new Date(); + + ifModifiedDate.setFullYear(ifModifiedDate.getFullYear() - 1); + + const headers = new Headers([ + ["If-Modified-Since", ifModifiedDate.toUTCString()], + ]); + const result = await apiFetch(path, { + method: "GET", + headers, + }); + + return result; +} diff --git a/client/src/api/profiles/profiles.ts b/client/src/api/profiles/profiles.ts new file mode 100644 index 0000000..ef37500 --- /dev/null +++ b/client/src/api/profiles/profiles.ts @@ -0,0 +1,12 @@ +import { apiFetch } from "#lib/api"; +import { IArtistWithFavs } from "#entities/profiles"; +import { IS_DEVELOPMENT } from "#env/derived-vars"; + +export async function fetchProfiles(): Promise { + const path = IS_DEVELOPMENT ? "/creators" : "/creators.txt"; + const result = await apiFetch(path, { + method: "GET", + }); + + return result; +} diff --git a/client/src/api/profiles/random.ts b/client/src/api/profiles/random.ts new file mode 100644 index 0000000..cc12a58 --- /dev/null +++ b/client/src/api/profiles/random.ts @@ -0,0 +1,14 @@ +import { apiFetch } from "#lib/api"; + +interface IArtistData { + service: string; + artist_id: string; +} + +export async function fetchRandomArtist(): Promise { + const result = await apiFetch("/artists/random", { + method: "GET", + }); + + return result; +} diff --git a/client/src/api/shares/index.ts b/client/src/api/shares/index.ts new file mode 100644 index 0000000..d2f68bf --- /dev/null +++ b/client/src/api/shares/index.ts @@ -0,0 +1,3 @@ +export { fetchShares } from "./shares"; +export { fetchShare } from "./share"; +export { fetchProfileShares } from "./profile"; diff --git a/client/src/api/shares/profile.ts b/client/src/api/shares/profile.ts new file mode 100644 index 0000000..12acbee --- /dev/null +++ b/client/src/api/shares/profile.ts @@ -0,0 +1,37 @@ +import { apiFetch } from "#lib/api"; +import { IArtist } from "#entities/profiles"; +import { IShare } from "#entities/files"; + +interface IResult { + results: IShare[]; + base: Record; + props: { + display_data: { + service: string; + href: string; + }; + service: string; + artist: IArtist; + id: string; + dm_count: number; + share_count: number; + has_links: "✔️" | "0"; + }; +} + +export async function fetchProfileShares( + service: string, + profileID: string, + offset?: number +) { + const path = `/${service}/user/${profileID}/shares`; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + const result = await apiFetch(path, { method: "GET" }, params); + + return result; +} diff --git a/client/src/api/shares/share.ts b/client/src/api/shares/share.ts new file mode 100644 index 0000000..5a8f783 --- /dev/null +++ b/client/src/api/shares/share.ts @@ -0,0 +1,15 @@ +import { apiFetch } from "#lib/api"; +import { IShare, IShareFile } from "#entities/files"; + +interface IResult { + share: IShare; + share_files: IShareFile[]; + base: unknown; +} + +export async function fetchShare(shareID: string) { + const path = `/share/${shareID}`; + const result = await apiFetch(path, { method: "GET" }); + + return result; +} diff --git a/client/src/api/shares/shares.ts b/client/src/api/shares/shares.ts new file mode 100644 index 0000000..26ca2af --- /dev/null +++ b/client/src/api/shares/shares.ts @@ -0,0 +1,24 @@ +import { apiFetch } from "#lib/api"; +import { IShare } from "#entities/files"; + +interface IResult { + base: Record; + props: { + currentPage: "shares"; + count: number; + shares: IShare[]; + }; +} + +export async function fetchShares(offset?: number) { + const path = `/shares`; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + const result = await apiFetch(path, { method: "GET" }, params); + + return result; +} diff --git a/client/src/api/tags/all.ts b/client/src/api/tags/all.ts new file mode 100644 index 0000000..09ac55b --- /dev/null +++ b/client/src/api/tags/all.ts @@ -0,0 +1,14 @@ +import { apiFetch } from "#lib/api"; +import { ITag } from "#entities/tags" + +interface IResult { + props: { currentPage: "tags" } + tags: ITag[] +} + +export async function fetchTags() { + const path = "/posts/tags" + const result = await apiFetch(path, { method: "GET" }) + + return result +} diff --git a/client/src/api/tags/index.ts b/client/src/api/tags/index.ts new file mode 100644 index 0000000..dbba2e3 --- /dev/null +++ b/client/src/api/tags/index.ts @@ -0,0 +1,2 @@ +export { fetchTags } from "./all"; +export { fetchProfileTags } from "./profile"; diff --git a/client/src/api/tags/profile.ts b/client/src/api/tags/profile.ts new file mode 100644 index 0000000..12bc242 --- /dev/null +++ b/client/src/api/tags/profile.ts @@ -0,0 +1,29 @@ +import { apiFetch } from "#lib/api"; +import { IArtist } from "#entities/profiles"; +import { ITag } from "#entities/tags"; + +interface IResult { + props: { + display_data: { + service: string; + href: string; + }; + artist: IArtist; + service: string; + id: string; + share_count: number; + dm_count: number; + has_links: "✔️" | "0"; + }; + + tags: ITag[]; + service: string; + artist: IArtist; +} + +export async function fetchProfileTags(service: string, profileID: string) { + const path = `/${service}/user/${profileID}/tags`; + const tags = await apiFetch(path, { method: "GET" }); + + return tags; +} diff --git a/client/src/browser/hooks/index.ts b/client/src/browser/hooks/index.ts new file mode 100644 index 0000000..fdb7ad5 --- /dev/null +++ b/client/src/browser/hooks/index.ts @@ -0,0 +1,3 @@ +export { ClientProvider, useClient } from "./use-client"; +export { useRoutePathPattern } from "./use-route-path-pattern"; +export { useInterval } from "./use-interval"; diff --git a/client/src/browser/hooks/use-client.tsx b/client/src/browser/hooks/use-client.tsx new file mode 100644 index 0000000..3552d76 --- /dev/null +++ b/client/src/browser/hooks/use-client.tsx @@ -0,0 +1,38 @@ +import { + ReactNode, + createContext, + useContext, + useEffect, + useState, +} from "react"; +import { isRegisteredAccount } from "#entities/account"; + +type IClientContext = undefined | { isRegistered: boolean }; + +const ClientContext = createContext(undefined); + +interface IProps { + children?: ReactNode; +} + +export function ClientProvider({ children }: IProps) { + const [client, changeClient] = useState(); + + useEffect(() => { + (async () => { + const isRegistered = isRegisteredAccount(); + const clientData: IClientContext = { isRegistered }; + changeClient(clientData); + })(); + }, []); + + return ( + {children} + ); +} + +export function useClient(): IClientContext { + const context = useContext(ClientContext); + + return context; +} diff --git a/client/src/browser/hooks/use-interval.tsx b/client/src/browser/hooks/use-interval.tsx new file mode 100644 index 0000000..bc4b1f3 --- /dev/null +++ b/client/src/browser/hooks/use-interval.tsx @@ -0,0 +1,27 @@ +import { useEffect, useRef } from "react"; + +/** + * Stolen from + * https://overreacted.io/making-setinterval-declarative-with-react-hooks/ + */ +export function useInterval(callback: () => void, delay: number | null) { + const savedCallback = useRef(); + + // Remember the latest callback. + useEffect(() => { + savedCallback.current = callback; + }, [callback]); + + // Set up the interval. + useEffect(() => { + if (delay !== null) { + let id = setInterval(tick, delay); + + return () => clearInterval(id); + } + + function tick() { + savedCallback.current!(); + } + }, [delay]); +} diff --git a/client/src/browser/hooks/use-route-path-pattern.tsx b/client/src/browser/hooks/use-route-path-pattern.tsx new file mode 100644 index 0000000..bf7a70b --- /dev/null +++ b/client/src/browser/hooks/use-route-path-pattern.tsx @@ -0,0 +1,11 @@ +import { useLocation } from "react-router"; + +/** + * TODO: path pattern without circular reference + * on the route config object. + */ +export function useRoutePathPattern(): string { + const location = useLocation(); + + return location.pathname; +} diff --git a/client/src/browser/storage/local/index.ts b/client/src/browser/storage/local/index.ts new file mode 100644 index 0000000..c1d1ef0 --- /dev/null +++ b/client/src/browser/storage/local/index.ts @@ -0,0 +1,81 @@ +const storageNames = [ + "favorites", + "logged_in", + "role", + "favs", + "post_favs", + "has_pending_review_dms", + "last_checked_has_pending_review_dms", + "sidebar_state", +] as const; + +export interface ILocalStorageSchema { + favs: { + service: string; + id: string; + }[]; + post_favs: { + id: string; + service: string; + user: string; + }[]; +} + +type ILocalStorageName = (typeof storageNames)[number]; + +let localStorageAvailable: boolean | null = null; + +function checkLocalStorageAvailability(): boolean { + if (localStorageAvailable === null) { + try { + localStorage.setItem("__storage_test__", "__storage_test__"); + localStorage.removeItem("__storage_test__"); + localStorageAvailable = true; + } catch (error) { + localStorageAvailable = false; + } + } + return localStorageAvailable; +} + +export function getLocalStorageItem(name: ILocalStorageName): string | null { + if (!checkLocalStorageAvailability()) { + console.warn("LocalStorage is not available."); + return null; + } + return localStorage.getItem(name); +} + +export function setLocalStorageItem(name: ILocalStorageName, value: string): void { + if (!checkLocalStorageAvailability()) { + console.warn("LocalStorage is not available."); + return; + } + try { + localStorage.setItem(name, value); + } catch (error) { + console.error("Failed to set item in LocalStorage:", error); + } +} + +export function deleteLocalStorageItem(name: ILocalStorageName): void { + if (!checkLocalStorageAvailability()) { + console.warn("LocalStorage is not available."); + return; + } + try { + localStorage.removeItem(name); + } catch (error) { + console.error("Failed to remove item from LocalStorage:", error); + } +} + +export function isLocalStorageAvailable() { + try { + localStorage.setItem("__storage_test__", "__storage_test__"); + localStorage.removeItem("__storage_test__"); + return true; + } catch (error) { + return false; + } +} diff --git a/client/src/components/_index.scss b/client/src/components/_index.scss new file mode 100644 index 0000000..686afef --- /dev/null +++ b/client/src/components/_index.scss @@ -0,0 +1,11 @@ +@use "layout"; +@use "pages"; +@use "images"; +@use "links"; +@use "dates"; +@use "cards"; +@use "loading"; +@use "buttons"; +@use "tooltip"; +@use "pagination"; +@use "importer_states"; diff --git a/client/src/components/advs/ads.tsx b/client/src/components/advs/ads.tsx new file mode 100644 index 0000000..a187e21 --- /dev/null +++ b/client/src/components/advs/ads.tsx @@ -0,0 +1,82 @@ +import { useLocation } from "react-router"; +import { HEADER_AD, MIDDLE_AD, FOOTER_AD, SLIDER_AD } from "#env/env-vars"; +import { DangerousContent } from "#components/dangerous-content"; +import { useEffect } from "react"; + +export function HeaderAd() { + const location = useLocation(); + const key = `${location.pathname}${location.search}`; + + return !HEADER_AD ? undefined : ( + + ); +} + +export function MiddleAd() { + const location = useLocation(); + const key = `${location.pathname}${location.search}`; + + return !MIDDLE_AD ? undefined : ( + + ); +} + +export function FooterAd() { + const location = useLocation(); + const key = `${location.pathname}${location.search}`; + + return !FOOTER_AD ? undefined : ( + + ); +} + +export function SliderAd() { + const location = useLocation(); + const key = `${location.pathname}${location.search}`; + + const observer = new MutationObserver((mutationsList) => { + for (const mutation of mutationsList) { + if (mutation.type === "childList") { + const slideAnimationElements = document.querySelectorAll('[class*="slideAnimation"]'); + const elementsToRemove = Array.from(slideAnimationElements).slice(1); + elementsToRemove.forEach((element) => { + element.remove(); + }); + } + } + }); + + observer.observe(document.body, { childList: true, subtree: true }); + + useEffect(() => { + return () => { + observer.disconnect(); + document.querySelectorAll('[class*="slideAnimation"]').forEach((element) => { + element.remove(); + }); + }; + }, []); + + return !SLIDER_AD ? undefined : ( + + ); +} diff --git a/client/src/components/advs/index.ts b/client/src/components/advs/index.ts new file mode 100644 index 0000000..7bb70ee --- /dev/null +++ b/client/src/components/advs/index.ts @@ -0,0 +1 @@ +export { MiddleAd, HeaderAd, FooterAd, SliderAd } from "./ads"; diff --git a/client/src/components/buttons/_index.scss b/client/src/components/buttons/_index.scss new file mode 100644 index 0000000..7051716 --- /dev/null +++ b/client/src/components/buttons/_index.scss @@ -0,0 +1 @@ +@use "./buttons"; diff --git a/client/src/pages/components/buttons.scss b/client/src/components/buttons/buttons.scss similarity index 100% rename from client/src/pages/components/buttons.scss rename to client/src/components/buttons/buttons.scss diff --git a/client/src/components/buttons/buttons.tsx b/client/src/components/buttons/buttons.tsx new file mode 100644 index 0000000..9d5b083 --- /dev/null +++ b/client/src/components/buttons/buttons.tsx @@ -0,0 +1,21 @@ +import { ReactNode } from "react"; +import { IBlockProps, createBlockComponent } from "#components/meta"; + +/** + * TODO: `onClick` required + */ +interface IProps extends IBlockProps<"button"> { + className?: string; + isFocusable?: boolean; + children?: ReactNode; +} + +export const Button = createBlockComponent("button", Component); + +export function Component({ isFocusable = true, children, ...props }: IProps) { + return ( + + ); +} diff --git a/client/src/components/buttons/index.ts b/client/src/components/buttons/index.ts new file mode 100644 index 0000000..ee532b9 --- /dev/null +++ b/client/src/components/buttons/index.ts @@ -0,0 +1 @@ +export { Button } from "./buttons"; diff --git a/client/src/pages/components/cards/_index.scss b/client/src/components/cards/_index.scss similarity index 62% rename from client/src/pages/components/cards/_index.scss rename to client/src/components/cards/_index.scss index 545d0b3..37b0a13 100644 --- a/client/src/pages/components/cards/_index.scss +++ b/client/src/components/cards/_index.scss @@ -1,6 +1,6 @@ +@use "card_list"; @use "base"; -@use "account"; @use "post"; -@use "user"; +@use "profile"; @use "dm"; @use "no_results"; diff --git a/client/src/pages/components/cards/base.scss b/client/src/components/cards/base.scss similarity index 94% rename from client/src/pages/components/cards/base.scss rename to client/src/components/cards/base.scss index 08990e1..ecdfffa 100644 --- a/client/src/pages/components/cards/base.scss +++ b/client/src/components/cards/base.scss @@ -1,4 +1,4 @@ -@use "../../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .card { display: grid; diff --git a/client/src/components/cards/base.tsx b/client/src/components/cards/base.tsx new file mode 100644 index 0000000..c5c6774 --- /dev/null +++ b/client/src/components/cards/base.tsx @@ -0,0 +1,41 @@ +import clsx from "clsx"; +import { ReactNode } from "react"; + +interface ICardProps { + className?: string; + children?: ReactNode; +} + +interface ICardHeaderProps { + className?: string; + children?: ReactNode; +} + +interface ICardBodyProps { + className?: string; + children?: ReactNode; +} + +interface ICardFooterProps { + className?: string; + children?: ReactNode; +} + +export function Card({ className, children }: ICardProps) { + return
{children}
; +} +export function CardHeader({ className, children }: ICardHeaderProps) { + return ( +
{children}
+ ); +} +export function CardBody({ className, children }: ICardBodyProps) { + return ( +
{children}
+ ); +} +export function CardFooter({ className, children }: ICardFooterProps) { + return ( +
{children}
+ ); +} diff --git a/client/src/pages/components/card_list.scss b/client/src/components/cards/card_list.scss similarity index 86% rename from client/src/pages/components/card_list.scss rename to client/src/components/cards/card_list.scss index 4b13e69..6727058 100644 --- a/client/src/pages/components/card_list.scss +++ b/client/src/components/cards/card_list.scss @@ -1,4 +1,4 @@ -@use "../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .card-list { --local-flex-flow: row wrap; @@ -43,6 +43,13 @@ } } + &--loading { + * { + opacity: 0.8; + pointer-events: none; + } + } + &__item { &--no-results { --card-size: $width-phone; diff --git a/client/src/components/cards/card_list.tsx b/client/src/components/cards/card_list.tsx new file mode 100644 index 0000000..b3c465c --- /dev/null +++ b/client/src/components/cards/card_list.tsx @@ -0,0 +1,122 @@ +import clsx from "clsx"; +import { ReactNode, useEffect, useRef } from "react"; + +interface IProps { + layout?: "legacy" | "phone"; + className?: string; + children: ReactNode; +} + +const defaultThumbSize = 180; + +export function CardList({ layout = "legacy", className, children }: IProps) { + const cardListRef = useRef(null); + + useEffect(() => { + if (layout === "phone") { + return; + } + + const ref = cardListRef.current; + + if (!ref) { + return; + } + + try { + const cookies = getCookies(); + const thumbSizeValue = parseInt(cookies?.thumbSize); + let thumbSizeSetting = isNaN(thumbSizeValue) ? undefined : thumbSizeValue; + + if (!thumbSizeSetting) { + thumbSizeSetting = defaultThumbSize; + addCookie("thumbSize", String(defaultThumbSize), 399); + } + + const thumbSize = + parseInt(String(thumbSizeSetting)) === + parseInt(String(defaultThumbSize)) + ? undefined + : thumbSizeSetting; + + function handleResize() { + updateThumbsizes(ref!, defaultThumbSize, thumbSize); + } + + updateThumbsizes(ref!, defaultThumbSize, thumbSize); + window.addEventListener("resize", handleResize); + + return () => { + window.removeEventListener("resize", handleResize); + }; + } catch (error) { + return console.error(error); + } + }, []); + + return ( +
+
+
+ {children} +
+
+ ); +} + +function getCookies(): Record { + const cookies = document.cookie.split(";").reduce( + (cookies, cookie) => ( + // @ts-expect-error whatever + (cookies[cookie.split("=")[0].trim()] = decodeURIComponent( + cookie.split("=")[1] + )), + cookies + ), + {} + ); + + return cookies; +} + +function setCookie(name: "thumbSize", value: string, daysToExpire: number) { + const date = new Date(); + date.setTime(date.getTime() + daysToExpire * 24 * 60 * 60 * 1000); + const expires = "expires=" + date.toUTCString(); + document.cookie = name + "=" + value + "; " + expires + ";path=/"; +} + +function addCookie(name: "thumbSize", newValue: string, daysToExpire: number) { + const existingCookie = document.cookie + .split(";") + .find((cookie) => cookie.trim().startsWith(name + "=")); + + if (!existingCookie) { + setCookie(name, newValue, daysToExpire); + } +} + +/** + * TODO: move into card component + */ +function updateThumbsizes( + element: HTMLDivElement, + defaultSize: number, + thumbSizeSetting?: number +) { + let thumbSize = thumbSizeSetting ? thumbSizeSetting : defaultSize; + + if (!thumbSizeSetting) { + let viewportWidth = window.innerWidth; + let offset = 24; + let viewportWidthExcludingMargin = viewportWidth - offset; + let howManyFit = viewportWidthExcludingMargin / thumbSize; + + if (howManyFit < 2.0 && 1.5 < howManyFit) { + thumbSize = viewportWidthExcludingMargin / 2; + } else if (howManyFit > 12) { + thumbSize = defaultSize * 1.5; + } + } + element.style.setProperty("--card-size", `${thumbSize}px`); +} diff --git a/client/src/components/cards/dm.module.scss b/client/src/components/cards/dm.module.scss new file mode 100644 index 0000000..3855c0e --- /dev/null +++ b/client/src/components/cards/dm.module.scss @@ -0,0 +1,3 @@ +.content { + font-family: inherit; +} diff --git a/client/src/pages/components/cards/dm.scss b/client/src/components/cards/dm.scss similarity index 94% rename from client/src/pages/components/cards/dm.scss rename to client/src/components/cards/dm.scss index 2f57bb7..d073c8c 100644 --- a/client/src/pages/components/cards/dm.scss +++ b/client/src/components/cards/dm.scss @@ -1,4 +1,4 @@ -@use "../../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .dm-card { position: relative; diff --git a/client/src/components/cards/dm.tsx b/client/src/components/cards/dm.tsx new file mode 100644 index 0000000..b0f625a --- /dev/null +++ b/client/src/components/cards/dm.tsx @@ -0,0 +1,86 @@ +import clsx from "clsx"; +import { createProfilePageURL } from "#lib/urls"; +import { IArtist } from "#entities/profiles"; +import { IApprovedDM } from "#entities/dms"; +import { paysites } from "#entities/paysites"; +import { FancyLink } from "../links"; + +import * as styles from "./dm.module.scss" + +interface IProps { + dm: IApprovedDM; + isPrivate?: boolean; + isGlobal?: boolean; + artist?: IArtist; + className?: string; +} + +export function DMCard({ + dm, + isGlobal = false, + isPrivate = false, + artist, + className, +}: IProps) { + const { service, user } = dm; + const paysite = paysites[service]; + const profilePageURL = String( + createProfilePageURL({ service, profileID: user }) + ); + const remoteProfilePageURL = paysite.user.profile(artist?.id ?? user); + + return ( +
+ {!isGlobal ? undefined : ( +
+ + {artist?.name ?? user} + + + ({paysite.title}) + +
+ )} + + {!isPrivate ? undefined : ( +
+ + {artist?.name ?? user} + + + ({paysite.title}) + +
+ )} + +
+
+
{dm.content}
+
+
+ +
+ {dm.published ? ( +
+ Published: {dm.published.slice(0, 7)} +
+ ) : /* this is to detect if its not DM */ dm.user_id ? ( +
Added: {dm.added.slice(0, 7)}
+ ) : ( +
Added: {dm.added}
+ )} +
+
+ ); +} diff --git a/client/src/components/cards/index.ts b/client/src/components/cards/index.ts new file mode 100644 index 0000000..c38a563 --- /dev/null +++ b/client/src/components/cards/index.ts @@ -0,0 +1,7 @@ +export { CardList } from "./card_list"; +export { NoResults } from "./no_results"; +export { Card, CardHeader, CardBody, CardFooter } from "./base"; +export { PostCard } from "./post"; +export { ArtistCard } from "./profile"; +export { DMCard } from "./dm"; +export { ShareCard } from "./share"; diff --git a/client/src/pages/components/cards/no_results.scss b/client/src/components/cards/no_results.scss similarity index 66% rename from client/src/pages/components/cards/no_results.scss rename to client/src/components/cards/no_results.scss index 9b12b98..7d53f03 100644 --- a/client/src/pages/components/cards/no_results.scss +++ b/client/src/components/cards/no_results.scss @@ -1,4 +1,4 @@ -@use "../../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .card--no-results { flex: 0 1 $width-phone; diff --git a/client/src/components/cards/no_results.tsx b/client/src/components/cards/no_results.tsx new file mode 100644 index 0000000..4c9e632 --- /dev/null +++ b/client/src/components/cards/no_results.tsx @@ -0,0 +1,21 @@ +import { Card, CardBody, CardHeader } from "./base"; + +interface IProps { + title?: string; + message?: string; +} + +export function NoResults({ + title = "Nobody here but us chickens!", + message = "There are no items found.", +}: IProps) { + return ( + + +

{title}

+
+ + {message} +
+ ); +} diff --git a/client/src/pages/components/cards/post.scss b/client/src/components/cards/post.scss similarity index 74% rename from client/src/pages/components/cards/post.scss rename to client/src/components/cards/post.scss index 79c0459..4006ad2 100644 --- a/client/src/pages/components/cards/post.scss +++ b/client/src/components/cards/post.scss @@ -1,12 +1,9 @@ -@use "../../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .post-card { width: var(--card-size); height: var(--card-size); - text-shadow: - -1px -1px 0 #000, - 1px -1px 0 #000, - -1px 1px 0 #000, + text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; color: white; font-size: 80%; @@ -17,6 +14,12 @@ border-width: 2px; } + &--fav-profile { + border-bottom-color: var(--favourite-colour2-secondary); + border-bottom-style: solid; + border-bottom-width: 2px; + } + &:hover { & > a { top: -5px; @@ -52,9 +55,7 @@ padding: 0; position: relative; top: 0; - transition: - top ease 0.1s, - background ease 0.1s, + transition: top ease 0.1s, background ease 0.1s, border-bottom-color ease 0.1s; &:not(:hover):not(:active):not(:focus) { @@ -100,4 +101,15 @@ align-items: center; } } + + &__profile { + color: white; + border-color: transparent; + border-style: solid; + border-width: 2px; + + &--fav { + border-color: var(--favourite-colour2-primary); + } + } } diff --git a/client/src/components/cards/post.tsx b/client/src/components/cards/post.tsx new file mode 100644 index 0000000..e2fce08 --- /dev/null +++ b/client/src/components/cards/post.tsx @@ -0,0 +1,133 @@ +import clsx from "clsx"; +import { THUMBNAILS_PREPEND } from "#env/env-vars"; +import { createPostURL } from "#lib/urls"; +import { Timestamp } from "#components/dates"; +import { KemonoLink } from "#components/links"; +import { IPost } from "#entities/posts"; + +interface IProps { + post: IPost; + isFavourite?: boolean; + isServiceIconsDisabled?: boolean; + isFavouriteProfile?: boolean; + showFavCount?: boolean; +} + +const fileExtensions = [".gif", ".jpeg", ".jpg", ".jpe", ".png", ".webp"]; +const someServices = ["fansly", "candfans", "boosty", "gumroad"]; + +export function PostCard({ + post, + isServiceIconsDisabled, + isFavourite = false, + isFavouriteProfile, + showFavCount, +}: IProps) { + const { + service, + user: profileID, + id, + title, + content, + published, + attachments, + fav_count, + } = post; + const postLink = String(createPostURL(service, profileID, id)); + const srcNS = findNamespace(post); + const blockClassName = clsx( + "post-card", + "post-card--preview", + ); + const blockClassNameHeader = clsx( + "post-card__header", + (isFavourite || isFavouriteProfile) && "post-card__header--fav" + ); + const blockClassNameFooter = clsx( + "post-card__footer", + (isFavourite || isFavouriteProfile) && "post-card__footer--fav" + ); + const trimmedTitle = title?.trim(); + const parsedTitle = !trimmedTitle + ? undefined + : trimmedTitle.length > 50 + ? `${trimmedTitle.slice(0, 50)}...` + : trimmedTitle; + + return ( +
+ +
+ {parsedTitle && parsedTitle !== "DM" + ? parsedTitle + : !content || content?.length < 50 + ? content + : `${content.slice(0, 50)}...`} +
+ + {!srcNS.src ? undefined : ( +
+ +
+ )} + +
+
+
+ {!published ? undefined : } +
+ {!attachments?.length ? ( + <>No attachments + ) : ( + <> + {attachments.length}{" "} + {attachments.length === 1 ? "attachment" : "attachments"} + + )} + + {showFavCount && ( + <> +
+ {Math.floor(fav_count ?? 0)}{" "} + {fav_count === 1 ? "favorite" : "favorites"} + + )} +
+
+ {isServiceIconsDisabled ? undefined : ( + + )} +
+
+
+
+ ); +} + +function findNamespace(post: IPost) { + const srcNS: { found: boolean; src?: string } = { found: false }; + const path = post.file?.path?.toLowerCase(); + const isValidpath = path && fileExtensions.find((ext) => path.endsWith(ext)); + + if (isValidpath) { + srcNS.src = path; + } + + if (!isValidpath && someServices.includes(post.service)) { + const matchedFile = post.attachments.find((file) => + fileExtensions.find((ext) => file.path?.endsWith(ext)) + ); + + srcNS.src = matchedFile?.path; + } + + return srcNS; +} diff --git a/client/src/pages/components/cards/user.scss b/client/src/components/cards/profile.scss similarity index 96% rename from client/src/pages/components/cards/user.scss rename to client/src/components/cards/profile.scss index 10602a1..8539387 100644 --- a/client/src/pages/components/cards/user.scss +++ b/client/src/components/cards/profile.scss @@ -1,4 +1,4 @@ -@use "../../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .user-card { position: relative; diff --git a/client/src/components/cards/profile.tsx b/client/src/components/cards/profile.tsx new file mode 100644 index 0000000..27e23c9 --- /dev/null +++ b/client/src/components/cards/profile.tsx @@ -0,0 +1,132 @@ +import clsx from "clsx"; +import { IArtist, IArtistWithFavs } from "#entities/profiles"; +import { paysites } from "#entities/paysites"; +import { + createBannerURL, + createIconURL, + createProfilePageURL, +} from "#lib/urls"; +import { useClient } from "#hooks"; +import { Image } from "#components/images"; +import { Timestamp } from "#components/dates"; +import { KemonoLink } from "#components/links"; + +interface IProps { + artist: IArtist | IArtistWithFavs; + isUpdated?: boolean; + isIndexed?: boolean; + isCount?: boolean; + isFavorite?: boolean; + singleOf?: string; + pluralOf?: string; + isDate?: boolean; + className?: string; +} + +interface IHeaderProps { + isCount?: boolean; + isDate?: boolean; +} + +export function ArtistCard({ + artist, + isUpdated = false, + isIndexed = false, + isCount = false, + isFavorite = false, + singleOf, + pluralOf, + isDate = false, + className, +}: IProps) { + const isClient = useClient(); + const profileLink = String( + createProfilePageURL({ + service: artist.service, + profileID: artist.id, + }) + ); + const profileIcon = createIconURL(artist.service, artist.id); + const profileBanner = createBannerURL(artist.service, artist.id); + const updatedDateTime = new Date(Number(artist.updated) * 1000).toISOString(); + const indexedDateTime = new Date(Number(artist.indexed) * 1000).toISOString(); + + return ( + + {/* Icon. */} +
+
+ +
+
+ + {/* Secondary identifiers and elements. */} +
+ + {paysites[artist.service].title} + + +
{artist.name}
+ + {isUpdated && ( +
+ +
+ )} + + {isIndexed && ( +
+ +
+ )} + + {!isCount ? undefined : ( +
+ {"favorited" in artist ? ( + <> + {artist.favorited}{" "} + {artist.favorited > 1 ? pluralOf : singleOf} + + ) : ( + <>No {pluralOf ? pluralOf : "None"} + )} +
+ )} +
+
+ ); +} + +export function ArtistCardHeader({ + isCount = false, + isDate = false, +}: IHeaderProps) { + return ( +
+
Icon
+
Name
+
Service
+ + {!isCount ? undefined : ( +
Times favorited
+ )} + + {!isDate ? undefined :
Updated
} +
+ ); +} diff --git a/client/src/components/cards/share.tsx b/client/src/components/cards/share.tsx new file mode 100644 index 0000000..e83d1c0 --- /dev/null +++ b/client/src/components/cards/share.tsx @@ -0,0 +1,28 @@ +import { IShare } from "#entities/files"; +import { createSharePageURL } from "#lib/urls"; + +interface IProps { + share: IShare; +} + +export function ShareCard({ share }: IProps) { + const { id, name, description, added } = share; + + return ( + + ); +} diff --git a/client/src/components/dangerous-content/dangerous.tsx b/client/src/components/dangerous-content/dangerous.tsx new file mode 100644 index 0000000..1a022a9 --- /dev/null +++ b/client/src/components/dangerous-content/dangerous.tsx @@ -0,0 +1,44 @@ +import { + createElement, + useEffect, + useRef, + ComponentPropsWithoutRef, +} from "react"; + +interface IProps + extends Omit, "dangerouslySetInnerHTML"> { + html: string; + allowRerender?: boolean; +} + +/** + * [`dangerouslySetInnerHTML`](https://react.dev/reference/react-dom/components/common#dangerously-setting-the-inner-html) + * but also runs ` +
    + {videos.map((video) => ( + + ))} +
+ + )} + + {attachments && attachments.length !== 0 && ( + <> +

Downloads

+
    + {attachments.map((attachment, index) => ( + + ))} +
+ + )} + + {incomplete_rewards && ( +
+
{incomplete_rewards}
+
+ )} + + {poll && } + + {content && ( + <> +

Content

+ {/* TODO: rewrite without this */} +
+

+          
+ + )} + + {previews && } + + ); +} + +interface IPostAttachmentProps + extends Pick { + attachment: IPostAttachment; +} + +const archiveFileExtension = [".zip", ".rar", ".7z"]; + +function PostAttachment({ + attachment, + archives_enabled, +}: IPostAttachmentProps) { + const { name, path, server, extension, name_extension, stem } = attachment; + const isArchiveFile = Boolean( + archives_enabled && + (archiveFileExtension.includes(extension) || + archiveFileExtension.includes(name_extension)) + ); + + return ( +
  • + + Download {name} + + {isArchiveFile && ( + <> + {" "}( + browse ») + + )} +
  • + ); +} + +interface IPostPollProps { + poll: IPostPoll; +} + +function PostPoll({ poll }: IPostPollProps) { + const { + title, + description, + choices, + total_votes, + created_at, + closes_at, + allow_multiple, + } = poll; + + return ( + <> +

    Poll

    + +
    +
    +

    {title}

    + {!description ? undefined :

    {description}

    } +
    + +
      + {choices.map((choice) => { + const percentage = (choice.votes / (total_votes ?? 1)) * 100; + + return ( +
    • + {choice.text} + {choice.votes} + +
    • + ); + })} +
    + +
    +
      +
    • + {created_at} +
    • + {closes_at && ( +
    • + —{closes_at} +
    • + )} + + {allow_multiple && ( + <> + +
    • multiple choice
    • + + )} + + +
    • {total_votes} votes
    • +
    +
    +
    + {String(poll)} + + ); +} + +interface IPostPreviewsProps + extends Pick, "previews"> {} + +function PostPreviews({ previews }: IPostPreviewsProps) { + return ( + <> +

    Files

    +
    + {previews.map((preview, index) => + preview.type === "thumbnail" ? ( + + ) : ( + + ) + )} +
    + + ); +} + +interface IPreviewThumbnailProps { + preview: IPreviewThumbnail; +} + +function PreviewThumbnail({ preview }: IPreviewThumbnailProps) { + const [isExpanded, switchExpansion] = useState(false); + const { server, path, name, caption } = preview; + const url = String(createPreviewURL(path, name, server)); + const downloadName = encodeURIComponent(name); + const thumbnailRef = useRef(null); + + return ( + + ); +} + +interface IPreviewEmbedProps { + preview: IPreviewEmbed; +} + +function PreviewEmbed({ preview }: IPreviewEmbedProps) { + const { url, description, subject } = preview; + + return ( + +
    +

    + {!subject ? "(No title)" : subject} +

    + {description &&

    {description}

    } +
    +
    + ); +} + +interface IActionsProps { + service: string; + profileID: string; + postID: string; + flagged?: 0; +} diff --git a/client/src/entities/posts/overview/clean-body.ts b/client/src/entities/posts/overview/clean-body.ts new file mode 100644 index 0000000..a4f5775 --- /dev/null +++ b/client/src/entities/posts/overview/clean-body.ts @@ -0,0 +1,111 @@ +import { paysites } from "#entities/paysites"; + +/** + * Apply some fixes to the content of the post. + */ +export function cleanupBody(postBody: HTMLElement, service: string) { + const postContent = postBody.querySelector( + ".post__content > pre" + ); + const isNoPostContent = + !postContent || + (!postContent.childElementCount && !postContent.childNodes.length); + + // content is empty + if (isNoPostContent) { + return; + } + + // pixiv post + if (service === "fanbox") { + // its contents is a text node + if (!postContent.childElementCount && postContent.childNodes.length === 1) { + // wrap the text node into `
    `
    +      const [textNode] = Array.from(postContent.childNodes);
    +      const pre = document.createElement("pre");
    +      textNode.after(pre);
    +      pre.appendChild(textNode);
    +    }
    +
    +    // remove paragraphs with only `
    ` in them + const paragraphs = postContent.querySelectorAll("p"); + paragraphs.forEach((para) => { + if ( + para.childElementCount === 1 && + para.firstElementChild?.tagName === "BR" + ) { + para.remove(); + } + }); + } + + if (service === "onlyfans") { + // replace links to profiles with internal links + const links = postContent.querySelectorAll("a"); + + Array.from(links).forEach((anchour) => { + const literalHref = anchour.getAttribute("href")!; + + // it's not an internal href + if (!literalHref.startsWith("/")) { + return; + } + + const url = new URL(literalHref, anchour.href); + const pathname = url.pathname; + const pathnameSegments = url.pathname + .split("/") + .slice(1, pathname.endsWith("/") ? -1 : undefined); + + // url is not a profile + if (pathnameSegments.length !== 0) { + return; + } + + const profileID = pathnameSegments[0]; + const fixedURL = paysites["onlyfans"].user.profile(profileID); + anchour.href = fixedURL; + }); + } + + Array.from(document.links).forEach((anchour) => { + // remove links to fanbox from the post + const hostname = anchour.hostname; + if (hostname.includes("downloads.fanbox.cc")) { + if (anchour.classList.contains("image-link")) { + anchour.remove(); + } else { + let el = document.createElement("span"); + el.textContent = anchour.textContent; + anchour.replaceWith(el); + } + } else if (hostname.includes("fanbox.cc")) { + anchour.href = anchour.href.replace( + /https?:\/\/(?:[a-zA-Z0-9-]*.)?fanbox\.cc\/(?:(?:manage\/)|(?:@[a-zA-Z\d]+\/)|)posts\/(\d+)/g, + "/fanbox/post/$1" + ); + } else if (hostname.includes("patreon.com")) { + anchour.href = anchour.href.replace( + /https?:\/\/(?:[\w-]*.)?patreon\.com\/posts\/.*\b(\d+)\b(?:\?.*)?/g, + "/patreon/post/$1" + ); + } + }); + + // Remove needless spaces and empty paragraphs. + /** + * @type {NodeListOf { + if ( + paragraph.nextElementSibling && + paragraph.nextElementSibling.tagName === "BR" + ) { + paragraph.nextElementSibling.remove(); + paragraph.remove(); + } else { + paragraph.remove(); + } + }); +} diff --git a/client/src/entities/posts/overview/flag-button.module.scss b/client/src/entities/posts/overview/flag-button.module.scss new file mode 100644 index 0000000..dcffc45 --- /dev/null +++ b/client/src/entities/posts/overview/flag-button.module.scss @@ -0,0 +1,183 @@ +.button { + // display: flex; + // flex-flow: row nowrap; + // gap: 0.5em; + // justify-content: center; + // align-items: center; + // min-width: 6em; + color: hsl(0, 0%, 100%); + border: transparent; + background: transparent; + font-weight: bold; + text-shadow: + hsl(0, 0%, 0%) 0px 0px 3px, + hsl(0, 0%, 0%) -1px -1px 0px, + hsl(0, 0%, 0%) 1px 1px 0px; +} + +.disabled { + color: grey; +} + +.modal { + color: var(--colour0-primary); + background-color: var(--colour1-primary); + padding: 0; + font-size: 80%; + + form { + div { + width: 100%; + } + + label { + display: block; + width: 100%; + padding: 2px; + } + + input[type="radio"] { + display: none; + } + + input[type="radio"] ~ label:hover { + background-color: var(--colour0-tertirary); + } + + input[type="radio"]:checked ~ label { + background-color: var(--anchour-internal-colour2-primary); + } + + section { + &:first-child { + div:not(:last-child) { + border-bottom: 1px solid var(--colour0-tertirary); + } + } + + &:last-child div label { + color: var(--colour0-secondary); + } + } + } + + @media only screen and (max-width: 720px) { + @media (max-width: 400px) { + width: 90vw; + } + + height: 60vh; + + form { + height: 100%; + display: flex; + flex-direction: column; + + section { + &:first-child { + margin-bottom: 0.25em; + border-bottom: 1px solid var(--colour0-tertirary); + + div:not(:last-child) { + border-bottom: 1px solid var(--colour0-tertirary); + } + } + + &:last-child { + display: inline-flex; + flex-direction: column; + flex-grow: 1; + + div { + // &:not(:last-child) + &:first-child { + height: 100%; + + label { + cursor: default; + position: relative; + top: 50%; + transform: translateY(-50%); + } + } + + &:last-child { + flex-basis: 0; + + button { + width: 50%; + } + } + } + } + } + } + } + + @media only screen and (min-width: 721px) { + @media (max-width: 1200px) { + width: 50vw; + } + @media (max-width: 1600px) { + width: 40vw; + } + @media (min-width: 1600px) { + width: 30vw; + } + + form { + display: flex; + + section { + &:first-child { + // Reason selection box + padding-right: 0.5em; + width: max(30%, 10em); + + div { + > label { + padding-left: 4px; + } + &:first-child > label { + padding-top: 4px; + } + &:last-child > label{ + padding-bottom: 4px; + } + } + } + + &:last-child { + // Details/submit + display: flex; + flex-direction: column; + width: 70%; + margin-right: 2px; + + :first-child { + // Detailed reason box + flex-grow: 1; + top: 5vh; + + label { + cursor: default; + position: relative; + top: 50%; + transform: translateY(-50%); + } + } + + :last-child { + // Buttons' container div + text-align: center; + margin-bottom: 0.25em; + + :first-child { + margin-right: 0.25em; + } + } + } + } + } + } +} diff --git a/client/src/entities/posts/overview/flag-button.tsx b/client/src/entities/posts/overview/flag-button.tsx new file mode 100644 index 0000000..680b993 --- /dev/null +++ b/client/src/entities/posts/overview/flag-button.tsx @@ -0,0 +1,182 @@ +import { FormEvent, MouseEvent, useEffect, useRef, useState } from "react"; +import { flagPost } from "#api/posts"; +import { useClient } from "#hooks"; +import { LoadingIcon } from "#components/loading"; +import { Button } from "#components/buttons"; +import { Modal } from "#components/modal"; +import { IPostActionsProps } from "./types"; + +import * as styles from "./flag-button.module.scss"; + +const REASON_MESSAGES: {[reason: string]: string} = { + "delete-copyright": `Post contains copyrighted material that should not be shared. We will review this post to ensure legal compliance and protect creators' rights. + After submitting the flag to finalize the request please contact us via the contact page.`, + "delete-abuse": `Use this flag if the post includes illegal material or content that violates the law in your country. + After submitting the flag to finalize the request please contact us via the contact page.`, + "missing-password": "Post files or urls requires a password to access content, but no password is provided in the post.", + "offsite-expired": "If the post files rewards exist on an external link that no longer works, select this flag.", + "post-changed": `Use this option if the original post has been edited at the source with new images or URLs, revised content, or updated index posts.`, + "corrupted-files": "Images, videos, or other files that are broken or unreadable.", + "missing-files": "The post is missing files that were expected to be included, such as images, attachments, or URLs.", + "stale-comments": "The comments on the post are outdated and require reimport to give access to passwords or URLs.", + "formatting-error": "Post text has formatting issues, such as text size difference, missing highlighting, incorrect spacing, or broken layout. Reporting this will help development.", + "reason-other": "There was some other problem with this post.", +}; + +interface IFlagButtonProps + extends Pick< + IPostActionsProps, + "flagged" | "service" | "profileID" | "postID" + > {} + +export function FlagButton({ + service, + profileID: creatorId, + postID: postId, + flagged, +}: IFlagButtonProps) { + const client = useClient(); + const [isFlagged, setFlagged] = useState(Boolean(flagged)); + const [isFlagging, setFlagging] = useState(false); + // const [modalOpen, setModalOpen] = useState(false); + // const [reason, setReason] = useState(flagged ?? ""); + // const [reasonDescription, setReasonDescription] = useState(REASON_MESSAGES[reason] ?? "Select a reason") + + useEffect(() => { + setFlagged(Boolean(flagged)); + }, [service, creatorId, postId, flagged]); + + async function handleFlagging(flagReason: string) { + try { + setFlagging(true); + + let result = await flagPost({ service, creatorId, postId, reason: flagReason }); + if (result) { + setFlagged(true); + // setReason(result); + // onModalClose(); + } else { + setFlagged(false); + alert("Error flagging"); + } + } catch (e) { + alert("Error flagging: " + e); + setFlagged(false); + } finally { + setFlagging(false); + } + } + + // function showModal() { + // setModalOpen(true); + // } + + // function onModalClose() { + // setModalOpen(false); + // } + + // function submitFlag(event: MouseEvent) { + // event.preventDefault(); + // handleFlagging(reason); + // } + + // function cancelClicked(event: MouseEvent) { + // event.preventDefault(); + // setModalOpen(false); + // } + + // function reasonChanged(event: FormEvent) { + // let reasonId = (event.target as HTMLElement).id; + // setReason(reasonId); + // setReasonDescription(REASON_MESSAGES[reasonId] ?? "Invalid reason selected"); + // } + + function flagClicked(event: MouseEvent) { + event.preventDefault(); + handleFlagging("reason-other") + } + + if (!client) { + return ( + Loading... + ); + } else if (!client.isRegistered) { + return ( + ⚑ Flag + ); + } else if (isFlagging) { + return ( + Flagging... + ); + } else if (isFlagged) { + return ( + ⚑ Flagged + ); + } else { + return ( + <> + + {/* +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    + +
    +
    + + +
    +
    +
    +
    */} + + ); + } +} diff --git a/client/src/entities/posts/overview/footer.module.scss b/client/src/entities/posts/overview/footer.module.scss new file mode 100644 index 0000000..3855c0e --- /dev/null +++ b/client/src/entities/posts/overview/footer.module.scss @@ -0,0 +1,3 @@ +.content { + font-family: inherit; +} diff --git a/client/src/entities/posts/overview/footer.tsx b/client/src/entities/posts/overview/footer.tsx new file mode 100644 index 0000000..610c319 --- /dev/null +++ b/client/src/entities/posts/overview/footer.tsx @@ -0,0 +1,186 @@ +import clsx from "clsx"; +import { Suspense } from "react"; +import { Await } from "react-router"; +import MicroModal from "micromodal"; +import { ICONS_PREPEND } from "#env/env-vars"; +import { Image } from "#components/images"; +import { KemonoLink, LocalLink } from "#components/links"; +import { Timestamp } from "#components/dates"; +import { Preformatted } from "#components/formatting"; +import { IComment } from "#entities/posts"; + +import * as styles from "./overview.module.scss"; +import { IPostOverviewProps } from "./types"; + +interface IPostFooterProps extends Pick { + service: string; + profileID: string; + profileName?: string; +} + +export function PostFooter({ + comments, + service, + profileID, + profileName, +}: IPostFooterProps) { + return ( +
    +

    Comments

    + {/* TODO: comment filters */} + Loading comments...

    }> + }> + {(comments: IComment[]) => ( +
    + {!comments ? ( +

    No comments found for this post.

    + ) : ( + comments.map((comment) => ( + + )) + )} +
    + )} +
    +
    +
    + ); +} + +interface IPostCommentProps { + comment: IComment; + postProfileID: string; + postProfileName?: string; + service: string; +} + +function PostComment({ + comment, + postProfileID, + postProfileName, + service, +}: IPostCommentProps) { + const { + id, + commenter, + commenter_name, + revisions, + parent_id, + content, + published, + } = comment; + const isProfileComment = commenter === postProfileID; + const modalID = `comment-revisions-${id}`; + + return ( +
    +
    + {!isProfileComment ? ( + + {commenter_name ?? "Anonymous"} + + ) : ( + <> + {/* TODO: a proper local link */} + + + + + {postProfileName ?? "Post's profile"} + + + )} + + {revisions && revisions.length !== 0 && ( + <> + MicroModal.show(modalID)} + > + ( + + edited + + ) + +
    +
    +
    +
    +
    +

    + Comment edits +

    + + +
    + +
    + {[...revisions, comment].map((revision) => ( +
    + + {revision.published ?? revision.added} + + {revision.content} +
    + ))} +
    +
    +
    +
    +
    + + )} +
    + +
    + {parent_id && ( + + )} + +

    + {service !== "boosty" ? ( + content + ) : ( + + )} +

    +
    +
    + +
    + +
    +
    + ); +} diff --git a/client/src/entities/posts/overview/header.tsx b/client/src/entities/posts/overview/header.tsx new file mode 100644 index 0000000..550a765 --- /dev/null +++ b/client/src/entities/posts/overview/header.tsx @@ -0,0 +1,276 @@ +import clsx from "clsx"; +import { useEffect, useState } from "react"; +import { useNavigate } from "react-router"; +import { + createBannerURL, + createIconURL, + createPostRevisionPageURL, + createPostURL, + createProfileTagURL, + createProfilePageURL, +} from "#lib/urls"; +import { ImageBackground, ImageLink } from "#components/images"; +import { KemonoLink } from "#components/links"; +import { IPaySite } from "#entities/paysites"; +import { + addPostToFavourites, + isFavouritePost, + isRegisteredAccount, + removePostFromFavourites, +} from "#entities/account"; +import { IPostActionsProps, IPostOverviewProps } from "./types"; +import { FlagButton } from "./flag-button"; +import { Timestamp } from "#components/dates"; + +interface IPostHeaderProps + extends Pick< + IPostOverviewProps, + "post" | "profile" | "revisions" | "flagged" + > { + postTitle: string; + paysite: IPaySite; +} + +export function PostHeader({ + post, + profile, + postTitle, + paysite, + revisions, + flagged, +}: IPostHeaderProps) { + const navigate = useNavigate(); + const profileURL = String( + createProfilePageURL({ service: post.service, profileID: post.user }) + ); + const profileIcon = createIconURL(post.service, post.user); + const bannerURL = createBannerURL(post.service, post.user); + + return ( +
    +
    + + + +
    + + {!profile ? `Profile page` : profile.name} + +
    +
    + +
    +

    + {postTitle} ({paysite.title}) +

    + + {!post.published ? undefined : ( +
    +
    + Published: +
    {" "} + +
    + )} + + {!post.edited || post.edited === post.published ? undefined : ( +
    +
    + Edited: +
    {" "} + +
    + )} + +
    + {revisions.length < 2 ? ( + +
    + Imported:{" "} +
    {" "} + {post.added?.slice(0, 7) ?? "Unknown"} +
    + ) : ( + <> +
    + Imported: +
    + + + + + )} +
    + + {post.tags && post.tags.length !== 0 && ( +
    + Tags: +
    + {post.tags.map((tag, index) => ( + + {tag} + + ))} +
    +
    + )} + + +
    +
    + ); +} + +function PostActions({ + service, + profileID, + postID, + flagged, +}: IPostActionsProps) { + return ( +
    + + +
    + ); +} + +interface IFavoriteButtonProps { + service: string; + profileID: string; + postID: string; +} + +function FavoriteButton({ service, profileID, postID }: IFavoriteButtonProps) { + const [isFavorite, switchFavorite] = useState(false); + const [isLoading, switchLoading] = useState(true); + const renderKey = `${postID}${profileID}${service}`; + + useEffect(() => { + (async () => { + try { + switchLoading(true); + + const isLoggedIn = isRegisteredAccount(); + + if (!isLoggedIn) { + return; + } + + const isFav = await isFavouritePost(service, profileID, postID); + + switchFavorite(isFav); + } catch (error) { + // TODO: better error handling + console.error(error); + } finally { + switchLoading(false); + } + })(); + }, [service, profileID, postID]); + + async function handleFavorite() { + try { + switchLoading(true); + await addPostToFavourites(service, profileID, postID); + switchFavorite(true); + } catch (error) { + // TODO: better error handling + console.error(error); + } finally { + switchLoading(false); + } + } + async function handleUnfavorite() { + try { + switchLoading(true); + await removePostFromFavourites(service, profileID, postID); + switchFavorite(false); + } catch (error) { + // TODO: better error handling + console.error(error); + } finally { + switchLoading(false); + } + } + + return isFavorite ? ( + + ) : ( + + ); +} diff --git a/client/src/entities/posts/overview/overview.module.scss b/client/src/entities/posts/overview/overview.module.scss new file mode 100644 index 0000000..79c6283 --- /dev/null +++ b/client/src/entities/posts/overview/overview.module.scss @@ -0,0 +1,7 @@ +@use "../../../css/config/variables/sass.scss" as *; + +.list { + display: flex; + flex-flow: column nowrap; + gap: $size-normal; +} diff --git a/client/src/entities/posts/overview/overview.tsx b/client/src/entities/posts/overview/overview.tsx new file mode 100644 index 0000000..80a2375 --- /dev/null +++ b/client/src/entities/posts/overview/overview.tsx @@ -0,0 +1,92 @@ +import { useEffect } from "react"; +import { PostHeader } from "./header"; +import { PostBody } from "./body"; +import { PostFooter } from "./footer"; +import { IPostOverviewProps } from "./types"; + +import "fluid-player/src/css/fluidplayer.css"; + +export function PostOverview({ + post, + profile, + revisions, + flagged, + videos, + attachments, + previews, + archives_enabled, + comments, + postTitle, + paysite, +}: IPostOverviewProps) { + useEffect(() => { + document.addEventListener("DOMContentLoaded", handleShowTagsButton); + window.addEventListener("resize", handleShowTagsButton); + + return () => { + document.removeEventListener("DOMContentLoaded", handleShowTagsButton); + window.removeEventListener("resize", handleShowTagsButton); + }; + }, []); + + function handleShowTagsButton() { + addShowTagsButton(); + } + + return ( + <> + + + + + + + ); +} + +function addShowTagsButton() { + let div = document.querySelector("#post-tags > div"); + + if (document.getElementById("show-tag-overflow-button")) { + // @ts-expect-error no fucking idea what it does + document.getElementById("show-tag-overflow-button").remove(); + } + // @ts-expect-error no fucking idea what it does + + if (div && div.offsetWidth < div.scrollWidth) { + // tags overflow + let button = document.createElement("a"); + button.href = "javascript:void 0"; + button.id = "show-tag-overflow-button"; + button.textContent = "Show all »"; + button.onclick = (e) => { + if (div.classList.contains("show-overflow")) { + div.classList.remove("show-overflow"); + button.textContent = "Show all»"; + } else { + div.classList.add("show-overflow"); + button.textContent = "« Hide"; + } + }; + // @ts-expect-error no fucking idea what it does + div.parentElement.appendChild(button); + } +} diff --git a/client/src/entities/posts/overview/types.ts b/client/src/entities/posts/overview/types.ts new file mode 100644 index 0000000..f1c8885 --- /dev/null +++ b/client/src/entities/posts/overview/types.ts @@ -0,0 +1,32 @@ +import { fetchPost } from "#api/posts"; +import { IPaySite } from "#entities/paysites"; +import { + IComment, + IPost, + IPostAttachment, + IPostPreview, + IPostVideo, +} from "#entities/posts"; +import { IArtistDetails } from "#entities/profiles"; + +export interface IPostOverviewProps { + post: IPost; + + profile: IArtistDetails; + revisions: Awaited>["props"]["revisions"]; + + flagged: string | null; + videos?: IPostVideo[]; + attachments?: IPostAttachment[]; + previews?: IPostPreview[]; + archives_enabled?: boolean; + comments: Promise; + postTitle: string; + paysite: IPaySite; +} + +export interface IPostActionsProps extends Pick { + service: string; + profileID: string; + postID: string; +} diff --git a/client/src/entities/posts/overview/video.tsx b/client/src/entities/posts/overview/video.tsx new file mode 100644 index 0000000..3b6a396 --- /dev/null +++ b/client/src/entities/posts/overview/video.tsx @@ -0,0 +1,96 @@ +import { useEffect, useRef } from "react"; +import { VIDEO_AD } from "#env/env-vars"; +import { IPostVideo } from "#entities/posts"; + +interface IPostVideoProps { + video: IPostVideo; +} + +export function PostVideo({ video }: IPostVideoProps) { + const videoRef = useRef(null); + + useEffect(() => { + const videoElement = videoRef.current; + + if (!videoElement) { + return; + } + + let fluidPlayer: FluidPlayerInstance | undefined = undefined; + + console.time(`${video.path}-create`); + console.time(`${video.path}-vast`); + import("fluid-player") + .then(({ default: fluidPlayerModule }) => { + fluidPlayer = fluidPlayerModule(videoElement, { + layoutControls: { + fillToContainer: false, + preload: "none", + }, + vastOptions: { + adList: JSON.parse(atob(VIDEO_AD)), + adTextPosition: "top left", + maxAllowedVastTagRedirects: 2, + vastAdvanced: { + vastLoadedCallback: () => { + console.timeLog(`${video.path}-vast`, "Loaded VAST video."); + }, + noVastVideoCallback: () => { + console.timeLog(`${video.path}-vast`, "No VAST video loaded."); + }, + vastVideoSkippedCallback: () => { + console.timeLog(`${video.path}-vast`, "Skipped VAST video."); + }, + vastVideoEndedCallback: () => { + console.timeLog(`${video.path}-vast`, "VAST video ended."); + }, + }, + }, + } satisfies Partial); + }) + .then(() => { + console.timeEnd(`${video.path}-create`); + }) + .catch((error) => { + const message = `Failed to initialize Fluid Player for video "${video.path}".`; + console.error(new Error(message, { cause: error })); + }); + + return () => { + const onEndedEvent = new Event("ended") + videoRef.current?.dispatchEvent(onEndedEvent) + // will not fix the issue of a possible memory leak + // but will stop the video from playing + videoRef.current?.pause() + + if (fluidPlayer) { + console.time(`${video.path}-destroy`); + fluidPlayer.destroy(); + console.timeEnd(`${video.path}-destroy`); + console.timeEnd(`${video.path}-vast`); + } + }; + }, [video.path]); + + return ( +
  • + {video.name} + + {!video.caption ? undefined : {video.caption}} + + +
  • + ); +} diff --git a/client/src/entities/posts/period.ts b/client/src/entities/posts/period.ts new file mode 100644 index 0000000..8e9754f --- /dev/null +++ b/client/src/entities/posts/period.ts @@ -0,0 +1,15 @@ +const periods = ["recent", "day", "week", "month"] as const; + +export type IPopularPostsPeriod = (typeof periods)[number]; + +export function isValidPeriod(value: unknown): value is IPopularPostsPeriod { + return periods.includes(value as IPopularPostsPeriod); +} + +export function validatePeriod( + value: unknown +): asserts value is IPopularPostsPeriod { + if (!isValidPeriod(value)) { + throw new Error(`"${value}" is not a valid period.`); + } +} diff --git a/client/src/entities/posts/types.ts b/client/src/entities/posts/types.ts new file mode 100644 index 0000000..8f578a9 --- /dev/null +++ b/client/src/entities/posts/types.ts @@ -0,0 +1,153 @@ +export interface IPost { + service: string; + /** + * ID of the profile. + */ + user: string; + id: string; + title?: string; + content?: string; + file?: { + path?: string; + name: string; + }; + shared_file: boolean; + embed: {}; + attachments: IPostAttachment[]; + added?: string; + published?: string; + edited?: string; + prev?: string; + next?: string; + revision_id?: string; + tags: string[] | null; + incomplete_rewards?: string; + poll?: IPostPoll; + + fav_count?: number; + isFavourite?: boolean; + isFavouriteProfile?: boolean; +} + +export interface IPostRevision { + revision_id?: string; + added?: string; +} + +export interface IPostVideo { + index: string; + name: string; + caption: string; + extension: string; + server?: string; + path: string; +} + +export interface IPostAttachment { + path: string; + name: string; + server?: string; + extension: string; + name_extension: string; + stem: string; +} + +export interface IPostPoll { + title: string; + description?: string; + total_votes?: number; + choices: { votes: number; text: string }[]; + created_at: string; + closes_at: string; + allow_multiple?: boolean; +} + +export type IPostPreview = IPreviewThumbnail | IPreviewEmbed; + +export interface IPreviewThumbnail { + type: "thumbnail"; + server?: string; + path: string; + name: string; + caption?: string; +} + +export interface IPreviewEmbed { + type: "embed"; + url: string; + subject?: string; + description?: string; +} + +export interface IComment { + id: string; + commenter: string; + commenter_name?: string; + revisions?: ICommentRevision[]; + parent_id?: string; + published: string; + added?: string; + content: string; +} + +export interface ICommentRevision { + id: string; + published?: string; + added?: string; + content: string; +} + +export interface IAnnouncement { + service: string; + /** + * ID of profile. + */ + user_id: string; + /** + * SHA-256 hash. + */ + hash: string; + content: string; + /** + * ISO datetime without timezone. + */ + added: string; + /** + * ISO datetime without timezone. + */ + published?: string; +} + +export interface IDiscordChannelMessage { + id: string; + author: IDiscordChannelMessageAuthor; + server: string; + channel: string; + content: string; + added: string; + published: string; + edited: string; + embeds: IDiscordEmbed[]; + mentions: unknown[]; + attachments: IDiscordAttachment[]; +} + +export interface IDiscordChannelMessageAuthor { + id: string; + avatar: string; + username: string; + public_flags: number; + + discriminator: string; +} + +export interface IDiscordAttachment { + name: string; + path: string; +} + +export interface IDiscordEmbed { + url: string; + title?: string; + description?: string; +} diff --git a/client/src/entities/profiles/headers.tsx b/client/src/entities/profiles/headers.tsx new file mode 100644 index 0000000..4a7643a --- /dev/null +++ b/client/src/entities/profiles/headers.tsx @@ -0,0 +1,185 @@ +import clsx from "clsx"; +import { useEffect, useState } from "react"; +import { + createBannerURL, + createFileUploadPageURL, + createIconURL, + createProfilePageURL, +} from "#lib/urls"; +import { ImageBackground, ImageLink } from "#components/images"; +import { paysites } from "#entities/paysites"; +import { + addProfileToFavourites, + isFavouriteProfile, + isRegisteredAccount, + removeProfileFromFavourites, +} from "#entities/account"; + +interface IProps { + service: string; + profileID: string; + profileName?: string; +} + +/** + * TODO: asset imports instead of literal paths + */ +const paysiteIcons = { + patreon: "/static/patreon.svg", + fanbox: "/static/fanbox.svg", + boosty: "/static/boosty.svg", + gumroad: "/static/gumroad.svg", + subscribestar: "/static/subscribestar.png", + dlsite: "/static/dlsite.png", + fantia: "/static/fantia.png", + onlyfans: "/static/onlyfans.svg", + fansly: "/static/fansly.svg", + candfans: "/static/candfans.png", +} as const; + +export function ProfileHeader({ service, profileID, profileName }: IProps) { + const artistIcon = createIconURL(service, profileID); + const artistBanner = createBannerURL(service, profileID); + const externalProfileURL = paysites[service].user.profile(profileID); + const paysiteIconURL = paysiteIcons[service as keyof typeof paysiteIcons]; + + return ( +
    + + {/* TODO: remove self-referencing link */} + + + +
    + ); +} + +interface IFavouriteButtonProps { + service: string; + profileID: string; +} + +function FavouriteButton({ service, profileID }: IFavouriteButtonProps) { + const [isFavourited, switchFavourite] = useState(false); + const [isLoading, switchLoading] = useState(true); + const renderKey = `${service}${profileID}`; + + useEffect(() => { + (async () => { + try { + switchLoading(true); + const isLoggedIn = isRegisteredAccount(); + + if (!isLoggedIn) { + return; + } + + const result = await isFavouriteProfile(service, profileID); + + switchFavourite(result); + } catch (error) { + // TODO: better error handling + console.error(error); + } finally { + switchLoading(false); + } + })(); + }, [service, profileID]); + + async function handleFavouriting() { + try { + switchLoading(true); + await addProfileToFavourites(service, profileID); + switchFavourite(true); + } catch (error) { + // TODO: better error handling + console.error(error); + } finally { + switchLoading(false); + } + } + + async function handleUnfavouriting() { + try { + switchLoading(true); + await removeProfileFromFavourites(service, profileID); + switchFavourite(false); + } catch (error) { + // TODO: better error handling + console.error(error); + } finally { + switchLoading(false); + } + } + + return !isFavourited ? ( + + ) : ( + + ); +} diff --git a/client/src/entities/profiles/index.ts b/client/src/entities/profiles/index.ts new file mode 100644 index 0000000..92f7f68 --- /dev/null +++ b/client/src/entities/profiles/index.ts @@ -0,0 +1,4 @@ +export { getArtists, getArtist } from "./lib/get"; +export { ProfileHeader } from "./headers"; +export { Tabs } from "./tabs"; +export type { IArtistDetails, IArtist, IArtistWithFavs } from "./types"; diff --git a/client/src/entities/profiles/lib/get.ts b/client/src/entities/profiles/lib/get.ts new file mode 100644 index 0000000..ff75385 --- /dev/null +++ b/client/src/entities/profiles/lib/get.ts @@ -0,0 +1,152 @@ +import { PAGINATION_LIMIT } from "#lib/pagination"; +import { fetchArtistProfile, fetchProfiles } from "#api/profiles"; +import { findFavouriteProfiles } from "#entities/account"; +import { IArtistDetails, IArtistWithFavs } from "../types"; + +// the original page is a clusterfuck which pulls an entire artist list +// and does sorting/ordering/filtering on client +// rewriting it requires rewriting backend endpoints +// so for now it does the same +// TODO: rewrite it on backend +let allArtists: Awaited> | undefined = + undefined; + +export interface IGetArtistsArgs { + service?: string; + offset?: number; + order?: "asc" | "desc"; + sort_by?: "favorited" | "indexed" | "updated" | "name" | "service"; + query?: string; +} + +interface IGetArtistsResult { + artists: (IArtistWithFavs & { isFavourite: boolean })[]; + count: number; +} + +export async function getArtists({ + offset = 0, + service, + order = "desc", + sort_by = "favorited", + query, +}: IGetArtistsArgs): Promise { + if (!allArtists) { + allArtists = await fetchProfiles(); + } + + const normalizedQuery = query?.trim().toLowerCase(); + // MDN recommends doing this for large arrays + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare + const compare = new Intl.Collator().compare; + + const filteredArtists = allArtists + .filter((profile) => { + let isServiceMatched = true + + if (service) { + isServiceMatched = profile.service === service; + } + + let isQueryMatched = true + + if (normalizedQuery) { + const normalizedName = profile.name.trim().toLowerCase(); + const normalizedID = profile.id.trim().toLowerCase(); + + isQueryMatched = normalizedID.includes(normalizedQuery) || normalizedName.includes(normalizedQuery); + } + + return isServiceMatched && isQueryMatched; + }) + .sort((prev, next) => { + switch (sort_by) { + case "favorited": { + return prev.favorited === next.favorited + ? 0 + : prev.favorited > next.favorited + ? 1 + : -1; + } + + case "service": { + return compare(prev.service, next.service); + } + + case "name": { + return compare(prev.name, next.name); + } + + case "indexed": { + // @ts-expect-error fuck dates + const prevIndexed = prev.indexed * 1000; + // @ts-expect-error fuck dates + const nextIndexed = next.indexed * 1000; + + return prevIndexed === nextIndexed + ? 0 + : prevIndexed > nextIndexed + ? 1 + : -1; + } + case "updated": { + // @ts-expect-error fuck dates + const prevUpdated = prev.updated * 1000; + // @ts-expect-error fuck dates + const nextUpdated = next.updated * 1000; + + return prevUpdated === nextUpdated + ? 0 + : prevUpdated > nextUpdated + ? 1 + : -1; + } + + default: { + throw new Error(`Unknown sorting type "${sort_by satisfies never}".`); + } + } + }); + + // artists are only sorted by one field + // so we can get away with "desc" just slicing off the end + // without changing sorting logic + const slicedArtists = + order === "asc" + ? filteredArtists.slice(offset, offset + PAGINATION_LIMIT) + : filteredArtists + .slice( + -offset + -PAGINATION_LIMIT, + offset === 0 ? undefined : -offset + ) + .reverse(); + const profilesData: Parameters[0] = + slicedArtists.map(({ id, service }) => { + return { id, service }; + }); + const favArtists = await findFavouriteProfiles(profilesData); + const resultArtists: IGetArtistsResult["artists"] = slicedArtists.map( + (artist) => { + const fav = favArtists.find( + ({ id, service }) => id === artist.id && service === artist.service + ); + + return { + ...artist, + isFavourite: fav === undefined ? false : true, + }; + } + ); + const count = filteredArtists.length; + + return { artists: resultArtists, count }; +} + +export async function getArtist( + service: string, + id: string +): Promise { + const profile = await fetchArtistProfile(service, id); + + return profile; +} diff --git a/client/src/entities/profiles/tabs.tsx b/client/src/entities/profiles/tabs.tsx new file mode 100644 index 0000000..313279e --- /dev/null +++ b/client/src/entities/profiles/tabs.tsx @@ -0,0 +1,119 @@ +import { ReactNode } from "react"; +import { + createProfileAnnouncementsURL, + createProfileDMsURL, + createProfileFancardsURL, + createProfileLinksURL, + createProfileSharesURL, + createProfileTagsURL, + createProfilePageURL, +} from "#lib/urls"; +import { KemonoLink } from "#components/links"; + +interface IProps { + currentPage: + | "posts" + | "fancards" + | "announcements" + | "tabs" + | "dms" + | "shares" + | "linked_accounts"; + service: string; + artistID: string; + dmCount?: number; + shareCount?: number; + hasLinks?: boolean; +} + +interface ITabProps { + href: string; + isActive?: boolean; + children: ReactNode; +} + +const announcementServices = ["fanbox", "patreon"]; +const tabServices = ["patreon", "onlyfans", "fansly", "candfans"]; + +export function Tabs({ + currentPage, + service, + artistID, + dmCount, + shareCount, + hasLinks, +}: IProps) { + return ( +
      + + Posts + + + {service !== "fanbox" ? undefined : ( + + Fancards + + )} + + {!announcementServices.includes(service) ? undefined : ( + + Announcements + + )} + + {/* TODO: fix the typos mismatch */} + {!tabServices.includes(service) ? undefined : ( + + Tags + + )} + + {!dmCount ? undefined : ( + + DMs ({dmCount}) + + )} + + {!shareCount ? undefined : ( + + Uploads ({shareCount}) + + )} + + + {!hasLinks ? <>Linked Accounts : <>Linked Accounts (✔️)} + +
    + ); +} + +function Tab({ href, isActive, children }: ITabProps) { + return ( +
  • + + {children} + +
  • + ); +} diff --git a/client/src/entities/profiles/types.ts b/client/src/entities/profiles/types.ts new file mode 100644 index 0000000..60162b7 --- /dev/null +++ b/client/src/entities/profiles/types.ts @@ -0,0 +1,23 @@ +export interface IArtistDetails { + id: string + public_id: string | null + service: string + name: string + indexed: string + updated: string +} + +export interface IArtist { + id: string; + name: string; + service: string; + indexed: string; + updated: string; + public_id: string; + relation_id: number; +} + +export interface IArtistWithFavs extends IArtist { + count: number; + favorited: number +} diff --git a/client/src/entities/tags/index.ts b/client/src/entities/tags/index.ts new file mode 100644 index 0000000..18cafdc --- /dev/null +++ b/client/src/entities/tags/index.ts @@ -0,0 +1,2 @@ +export { getTags } from "./lib/get"; +export type { ITag } from "./types"; diff --git a/client/src/entities/tags/lib/get.ts b/client/src/entities/tags/lib/get.ts new file mode 100644 index 0000000..c290e30 --- /dev/null +++ b/client/src/entities/tags/lib/get.ts @@ -0,0 +1,7 @@ +import { fetchProfileTags } from "#api/tags"; + +export async function getTags(service: string, profileID: string) { + const result = await fetchProfileTags(service, profileID); + + return result; +} diff --git a/client/src/entities/tags/types.ts b/client/src/entities/tags/types.ts new file mode 100644 index 0000000..c89621e --- /dev/null +++ b/client/src/entities/tags/types.ts @@ -0,0 +1,4 @@ +export interface ITag { + tag: string; + post_count: number; +} diff --git a/client/src/env/derived-vars.js b/client/src/env/derived-vars.js deleted file mode 100644 index 674271a..0000000 --- a/client/src/env/derived-vars.js +++ /dev/null @@ -1,4 +0,0 @@ -import { KEMONO_SITE, NODE_ENV } from "./env-vars.js"; - -export const IS_DEVELOPMENT = NODE_ENV === "development"; -export const SITE_HOSTNAME = new URL(KEMONO_SITE).hostname; diff --git a/client/src/env/derived-vars.ts b/client/src/env/derived-vars.ts new file mode 100644 index 0000000..0212991 --- /dev/null +++ b/client/src/env/derived-vars.ts @@ -0,0 +1,30 @@ +import { + KEMONO_SITE, + NODE_ENV, + PAYSITE_LIST, + ARTISTS_OR_CREATORS, + API_SERVER_BASE_URL, + API_SERVER_PORT, +} from "./env-vars"; +import { IPaySite, paysites } from "#entities/paysites"; + +export const IS_DEVELOPMENT = NODE_ENV === "development"; +export const SITE_HOSTNAME = new URL(KEMONO_SITE).hostname; +export const AVAILABLE_PAYSITES = PAYSITE_LIST.reduce( + (availablePaysites, paysiteName) => { + const paysite = paysites[paysiteName]; + availablePaysites[paysiteName] = paysite; + + return availablePaysites; + }, + {} +); +export const AVAILABLE_PAYSITE_LIST = PAYSITE_LIST.map< + IPaySite & { name: string } +>((paysiteName) => { + return { ...AVAILABLE_PAYSITES[paysiteName], name: paysiteName }; +}); +export const ARTISTS_OR_CREATORS_LOWERCASE = ARTISTS_OR_CREATORS.toLowerCase(); +export const API_SERVER_URL = !API_SERVER_BASE_URL + ? "" + : `${API_SERVER_BASE_URL}${!API_SERVER_PORT ? "" : `:${API_SERVER_PORT}`}`; diff --git a/client/src/env/env-vars.js b/client/src/env/env-vars.js deleted file mode 100644 index 50a3f5d..0000000 --- a/client/src/env/env-vars.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - https://webpack.js.org/plugins/define-plugin/ -*/ - -/** - * @type {string} - */ -export const KEMONO_SITE = BUNDLER_ENV_KEMONO_SITE; -/** - * @type {string} - */ -export const NODE_ENV = BUNDLER_ENV_NODE_ENV; -/** - * @type {string} - */ -export const ICONS_PREPEND = BUNDLER_ENV_ICONS_PREPEND; -/** - * @type {string} - */ -export const BANNERS_PREPEND = BUNDLER_ENV_BANNERS_PREPEND; -/** - * @type {string} - */ -export const THUMBNAILS_PREPEND = BUNDLER_ENV_THUMBNAILS_PREPEND; -/** - * @type {string} - */ -export const CREATORS_LOCATION = BUNDLER_ENV_CREATORS_LOCATION; -/** - * @type {string} - */ diff --git a/client/src/env/env-vars.ts b/client/src/env/env-vars.ts new file mode 100644 index 0000000..a646c51 --- /dev/null +++ b/client/src/env/env-vars.ts @@ -0,0 +1,139 @@ +/* + https://webpack.js.org/plugins/define-plugin/ +*/ + +import type { INavItem } from "#components/layout"; + +export const KEMONO_SITE = BUNDLER_ENV_KEMONO_SITE; + +export const SENTRY_DSN = BUNDLER_ENV_SENTRY_DSN; + +export const SITE_NAME = BUNDLER_ENV_SITE_NAME; + +export const NODE_ENV = process.env.NODE_ENV; + +export const ICONS_PREPEND = BUNDLER_ENV_ICONS_PREPEND; + +export const BANNERS_PREPEND = BUNDLER_ENV_BANNERS_PREPEND; + +export const THUMBNAILS_PREPEND = BUNDLER_ENV_THUMBNAILS_PREPEND; + +export const ARTISTS_OR_CREATORS = BUNDLER_ENV_ARTISTS_OR_CREATORS; + +export const DISABLE_DMS = BUNDLER_ENV_DISABLE_DMS; + +export const DISABLE_FAQ = BUNDLER_ENV_DISABLE_FAQ; + +export const DISABLE_FILEHAUS = BUNDLER_ENV_DISABLE_FILEHAUS; + +export const SIDEBAR_ITEMS = BUNDLER_ENV_SIDEBAR_ITEMS; + +export const FOOTER_ITEMS = BUNDLER_ENV_FOOTER_ITEMS; + +/** + * b64-encoded string + */ +export const BANNER_GLOBAL = BUNDLER_ENV_BANNER_GLOBAL; + +/** + * b64-encoded string + */ +export const ANNOUNCEMENT_BANNER_GLOBAL = BUNDLER_ENV_ANNOUNCEMENT_BANNER_GLOBAL; + +/** + * b64-encoded string + */ +export const BANNER_WELCOME = BUNDLER_ENV_BANNER_WELCOME; + +export const HOME_BACKGROUND_IMAGE = BUNDLER_ENV_HOME_BACKGROUND_IMAGE; + +export const HOME_MASCOT_PATH = BUNDLER_ENV_HOME_MASCOT_PATH; + +export const HOME_LOGO_PATH = BUNDLER_ENV_HOME_LOGO_PATH; + +/** + * b64-encoded string + */ +export const HOME_WELCOME_CREDITS = BUNDLER_ENV_HOME_WELCOME_CREDITS; + +export const PAYSITE_LIST = BUNDLER_ENV_PAYSITE_LIST; + +/** + * b64-encoded string + */ +export const HEADER_AD = BUNDLER_ENV_HEADER_AD; + +/** + * b64-encoded string + */ +export const MIDDLE_AD = BUNDLER_ENV_MIDDLE_AD; + +/** + * b64-encoded string + */ +export const FOOTER_AD = BUNDLER_ENV_FOOTER_AD; + +/** + * b64-encoded string + */ +export const SLIDER_AD = BUNDLER_ENV_SLIDER_AD; + +/** + * b64-encoded JSON string + */ +export const VIDEO_AD = BUNDLER_ENV_VIDEO_AD; + +export const IS_ARCHIVER_ENABLED = BUNDLER_ENV_IS_ARCHIVER_ENABLED; + +export const API_SERVER_BASE_URL = BUNDLER_ENV_API_SERVER_BASE_URL; + +export const API_SERVER_PORT = BUNDLER_ENV_API_SERVER_PORT; + +export const GIT_COMMIT_HASH = BUNDLER_ENV_GIT_COMMIT_HASH; + +export const BUILD_DATE = BUNDLER_ENV_BUILD_DATE; + +export const IS_FILE_SERVING_ENABLED = BUNDLER_ENV_IS_FILE_SERVING_ENABLED; + +// stolen from https://stackoverflow.com/a/76844373 +declare global { + const BUNDLER_ENV_KEMONO_SITE: string; + const BUNDLER_ENV_SENTRY_DSN: string | undefined; + const BUNDLER_ENV_SITE_NAME: string; + const BUNDLER_ENV_ICONS_PREPEND: string; + const BUNDLER_ENV_BANNERS_PREPEND: string; + const BUNDLER_ENV_THUMBNAILS_PREPEND: string; + const BUNDLER_ENV_CREATORS_LOCATION: string; + const BUNDLER_ENV_ARTISTS_OR_CREATORS: string; + const BUNDLER_ENV_DISABLE_DMS: boolean; + const BUNDLER_ENV_DISABLE_FAQ: boolean; + const BUNDLER_ENV_DISABLE_FILEHAUS: boolean; + const BUNDLER_ENV_SIDEBAR_ITEMS: INavItem[]; + const BUNDLER_ENV_FOOTER_ITEMS: unknown[] | undefined; + const BUNDLER_ENV_BANNER_GLOBAL: string | undefined; + const BUNDLER_ENV_ANNOUNCEMENT_BANNER_GLOBAL: string | undefined; + const BUNDLER_ENV_BANNER_WELCOME: string | undefined; + const BUNDLER_ENV_HOME_BACKGROUND_IMAGE: string | undefined; + const BUNDLER_ENV_HOME_MASCOT_PATH: string | undefined; + const BUNDLER_ENV_HOME_LOGO_PATH: string | undefined; + const BUNDLER_ENV_HOME_WELCOME_CREDITS: string; + const BUNDLER_ENV_PAYSITE_LIST: string[]; + const BUNDLER_ENV_HOME_ANNOUNCEMENTS: IAnnouncement[] | undefined; + const BUNDLER_ENV_HEADER_AD: string; + const BUNDLER_ENV_MIDDLE_AD: string; + const BUNDLER_ENV_FOOTER_AD: string; + const BUNDLER_ENV_SLIDER_AD: string; + const BUNDLER_ENV_VIDEO_AD: string; + const BUNDLER_ENV_IS_ARCHIVER_ENABLED: boolean; + const BUNDLER_ENV_API_SERVER_BASE_URL: string | undefined; + const BUNDLER_ENV_API_SERVER_PORT: number | undefined; + const BUNDLER_ENV_GIT_COMMIT_HASH: string | undefined; + const BUNDLER_ENV_BUILD_DATE: string | undefined; + const BUNDLER_ENV_IS_FILE_SERVING_ENABLED: boolean; +} + +interface IAnnouncement { + title: string; + date: string; + content: string; +} diff --git a/client/src/index.scss b/client/src/index.scss new file mode 100644 index 0000000..d344024 --- /dev/null +++ b/client/src/index.scss @@ -0,0 +1,3 @@ +@use "./css"; +@use "./components"; +@use "./pages"; diff --git a/client/src/index.tsx b/client/src/index.tsx new file mode 100644 index 0000000..79b44e8 --- /dev/null +++ b/client/src/index.tsx @@ -0,0 +1,24 @@ +// TODO: nuke/inline these styles +import "purecss/build/base-min.css"; +import "purecss/build/grids-min.css"; +import "purecss/build/grids-responsive-min.css"; + +import "./index.scss"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { RouterProvider } from "react-router/dom"; +import { router } from "./router"; + +const rootElement = document.getElementById("root"); + +if (!rootElement) { + throw new Error("Root element is missing."); +} + +const root = createRoot(rootElement); + +root.render( + + + +); diff --git a/client/src/js/account.js b/client/src/js/account.js deleted file mode 100644 index 9701d8f..0000000 --- a/client/src/js/account.js +++ /dev/null @@ -1 +0,0 @@ -export const isLoggedIn = localStorage.getItem("logged_in") === "yes"; diff --git a/client/src/js/admin.js b/client/src/js/admin.js deleted file mode 100644 index 99fd033..0000000 --- a/client/src/js/admin.js +++ /dev/null @@ -1,7 +0,0 @@ -import "./admin.scss"; -import { fixImageLinks } from "@wp/utils"; -import { initSections } from "./page-loader"; -import { adminPageScripts } from "@wp/pages"; - -fixImageLinks(document.images); -initSections(adminPageScripts); diff --git a/client/src/js/admin.scss b/client/src/js/admin.scss deleted file mode 100644 index 9a46059..0000000 --- a/client/src/js/admin.scss +++ /dev/null @@ -1,3 +0,0 @@ -@use "../css"; -@use "../pages/components"; -@use "../pages/account/administrator"; diff --git a/client/src/js/component-factory.js b/client/src/js/component-factory.js deleted file mode 100644 index 8dfaabb..0000000 --- a/client/src/js/component-factory.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * @type {Map} - */ -const components = new Map(); - -/** - * @param {HTMLElement} footer - */ -export function initComponentFactory(footer) { - const container = footer.querySelector(".component-container"); - /** - * @type {NodeListOf *`); - - componentElements.forEach((component) => { - components.set(component.className.trim(), component); - }); - container.remove(); -} - -/** - * @param {string} className - */ -export function createComponent(className) { - const componentSkeleton = components.get(className); - - if (!componentSkeleton) { - return console.error(`Component "${className}" doesn't exist.`); - } - - const newInstance = componentSkeleton.cloneNode(true); - - return newInstance; -} diff --git a/client/src/js/favorites.js b/client/src/js/favorites.js deleted file mode 100644 index e678435..0000000 --- a/client/src/js/favorites.js +++ /dev/null @@ -1,207 +0,0 @@ -import { kemonoAPI } from "@wp/api"; - -export async function initFavorites() { - let artistFavs = localStorage.getItem("favs"); - let postFavs = localStorage.getItem("post_favs"); - - if (!artistFavs || artistFavs === "undefined") { - /** - * @type {string} - */ - const favs = await kemonoAPI.favorites.retrieveFavoriteArtists(); - - if (favs) { - localStorage.setItem("favs", favs); - } - } - - if (!postFavs || postFavs === "undefined") { - /** - * @type {string} - */ - const favs = await kemonoAPI.favorites.retrieveFavoritePosts(); - - if (favs) { - localStorage.setItem("post_favs", favs); - } - } -} - -async function saveFavouriteArtists() { - try { - const favs = await kemonoAPI.favorites.retrieveFavoriteArtists(); - - if (!favs) { - alert("Could not retrieve favorite artists"); - return false; - } - - localStorage.setItem("favs", favs); - return true; - } catch (error) { - console.error(error); - } -} - -async function saveFavouritePosts() { - try { - const favs = await kemonoAPI.favorites.retrieveFavoritePosts(); - - if (!favs) { - alert("Could not retrieve favorite posts"); - return false; - } - - localStorage.setItem("post_favs", favs); - return true; - } catch (error) { - console.error(error); - } -} - -/** - * @param {string} id - * @param {string} service - * @returns {Promise | undefined} - */ -export async function findFavouriteArtist(id, service) { - /** - * @type {KemonoAPI.Favorites.User[]} - */ - let favList; - - try { - favList = JSON.parse(localStorage.getItem("favs")); - } catch (error) { - // corrupted entry - if (error instanceof SyntaxError) { - const isSaved = await saveFavouriteArtists(); - - if (!isSaved) { - return undefined; - } - - return await findFavouriteArtist(id, service); - } - } - - if (!favList) { - return undefined; - } - - const favArtist = favList.find((favItem) => { - return favItem.id === id && favItem.service === service; - }); - - return favArtist; -} - -/** - * @param {string} service - * @param {string} user - * @param {string} postID - * @returns {Promise | undefined} - */ -export async function findFavouritePost(service, user, postID) { - /** - * @type {KemonoAPI.Favorites.Post[]} - */ - let favList; - - try { - favList = JSON.parse(localStorage.getItem("post_favs")); - - if (!favList) { - return undefined; - } - - const favPost = favList.find((favItem) => { - const isMatch = favItem.id === postID && favItem.service === service && favItem.user === user; - return isMatch; - }); - - return favPost; - } catch (error) { - // corrupted entry - if (error instanceof SyntaxError) { - const isSaved = await saveFavouritePosts(); - - if (!isSaved) { - return undefined; - } - - return await findFavouritePost(service, user, postID); - } - } -} - -/** - * @param {string} id - * @param {string} service - */ -export async function addFavouriteArtist(id, service) { - const isFavorited = await kemonoAPI.favorites.favoriteArtist(service, id); - - if (!isFavorited) { - return false; - } - - const newFavs = await kemonoAPI.favorites.retrieveFavoriteArtists(); - localStorage.setItem("favs", newFavs); - - return true; -} - -/** - * @param {string} id - * @param {string} service - */ -export async function removeFavouriteArtist(id, service) { - const isUnfavorited = await kemonoAPI.favorites.unfavoriteArtist(service, id); - - if (!isUnfavorited) { - return false; - } - - const favItems = await kemonoAPI.favorites.retrieveFavoriteArtists(); - localStorage.setItem("favs", favItems); - - return true; -} - -/** - * @param {string} service - * @param {string} user - * @param {string} postID - */ -export async function addFavouritePost(service, user, postID) { - const isFavorited = await kemonoAPI.favorites.favoritePost(service, user, postID); - - if (!isFavorited) { - return false; - } - - const newFavs = await kemonoAPI.favorites.retrieveFavoritePosts(); - localStorage.setItem("post_favs", newFavs); - - return true; -} - -/** - * @param {string} service - * @param {string} user - * @param {string} postID - * @returns - */ -export async function removeFavouritePost(service, user, postID) { - const isUnfavorited = await kemonoAPI.favorites.unfavoritePost(service, user, postID); - - if (!isUnfavorited) { - return false; - } - - const favItems = await kemonoAPI.favorites.retrieveFavoritePosts(); - localStorage.setItem("post_favs", favItems); - - return true; -} diff --git a/client/src/js/feature-detect.js b/client/src/js/feature-detect.js deleted file mode 100644 index 0286d95..0000000 --- a/client/src/js/feature-detect.js +++ /dev/null @@ -1,13 +0,0 @@ -export const features = { - localStorage: isLocalStorageAvailable(), -}; - -function isLocalStorageAvailable() { - try { - localStorage.setItem("__storage_test__", "__storage_test__"); - localStorage.removeItem("__storage_test__"); - return true; - } catch (error) { - return false; - } -} diff --git a/client/src/js/global.js b/client/src/js/global.js deleted file mode 100644 index 333a110..0000000 --- a/client/src/js/global.js +++ /dev/null @@ -1,18 +0,0 @@ -import "./global.scss"; -import "purecss/build/base-min.css"; -import "purecss/build/grids-min.css"; -import "purecss/build/grids-responsive-min.css"; -import 'whatwg-fetch'; /* fetch polyfill */ -import { isLoggedIn } from "@wp/js/account"; -import { initFavorites } from "@wp/js/favorites"; -import { fixImageLinks } from "@wp/utils"; -import { globalPageScripts } from "@wp/pages"; -import { initSections } from "./page-loader"; -import { initPendingReviewDms } from "@wp/js/pending-review-dms"; - -if (isLoggedIn) { - initFavorites(); - initPendingReviewDms(); -} -fixImageLinks(document.images); -initSections(globalPageScripts); diff --git a/client/src/js/global.scss b/client/src/js/global.scss deleted file mode 100644 index a6e8a86..0000000 --- a/client/src/js/global.scss +++ /dev/null @@ -1,2 +0,0 @@ -@use "../css"; -@use "../pages"; diff --git a/client/src/js/moderator.js b/client/src/js/moderator.js deleted file mode 100644 index ed160e6..0000000 --- a/client/src/js/moderator.js +++ /dev/null @@ -1,7 +0,0 @@ -import "./moderator.scss"; -import { fixImageLinks } from "@wp/utils"; -import { initSections } from "./page-loader"; -import { moderatorPageScripts } from "@wp/pages"; - -fixImageLinks(document.images); -initSections(moderatorPageScripts); diff --git a/client/src/js/moderator.scss b/client/src/js/moderator.scss deleted file mode 100644 index ab8a9c1..0000000 --- a/client/src/js/moderator.scss +++ /dev/null @@ -1 +0,0 @@ -@use "../pages/moderator"; diff --git a/client/src/js/page-loader.js b/client/src/js/page-loader.js deleted file mode 100644 index 46c7d8c..0000000 --- a/client/src/js/page-loader.js +++ /dev/null @@ -1,37 +0,0 @@ -import { initShell } from "@wp/components"; -import { initComponentFactory } from "./component-factory"; - -/** - * Initialises the scripts on the page. - * @param {Map void>} pages The map of page names and their callbacks. - */ -export function initSections(pages) { - const sidebar = document.querySelector(".global-sidebar"); - const main = document.querySelector("main"); - /** - * @type {HTMLElement} - */ - const footer = document.querySelector(".global-footer"); - /** - * @type {NodeListOf} - */ - const sections = main.querySelectorAll("main > .site-section"); - - initComponentFactory(footer); - initShell(sidebar); - sections.forEach((section) => { - const sectionNames = section.className.match(/site-section--([a-z\-]+)/ig); - - if (sectionNames && sectionNames.length > 0) { - sectionNames.forEach((sectionName) => { - sectionName = sectionName.replace('site-section--', ''); - if (pages.has(sectionName)) { - const sectionCallbacks = pages.get(sectionName); - sectionCallbacks.forEach((sectionCallback) => { - sectionCallback(section); - }); - } - }); - } - }); -} diff --git a/client/src/js/pending-review-dms.js b/client/src/js/pending-review-dms.js deleted file mode 100644 index ff04258..0000000 --- a/client/src/js/pending-review-dms.js +++ /dev/null @@ -1,19 +0,0 @@ -import { kemonoAPI } from "@wp/api"; - -export async function initPendingReviewDms(forceReload= false, minutesForRecheck = 30) { - let HasPendingReviewDms = localStorage.getItem("has_pending_review_dms") === "true"; - let LastCheckedHasPendingReviewDms = parseInt(localStorage.getItem("last_checked_has_pending_review_dms")); - - if (forceReload || !LastCheckedHasPendingReviewDms || (LastCheckedHasPendingReviewDms < Date.now() - minutesForRecheck * 60 * 1000)) { - /** - * @type {string} - */ - HasPendingReviewDms = await kemonoAPI.dms.retrieveHasPendingDMs(); - localStorage.setItem("has_pending_review_dms", HasPendingReviewDms.toString()); - localStorage.setItem("last_checked_has_pending_review_dms", Date.now().toString()); - } - if (HasPendingReviewDms) - document.querySelector(".review_dms > img").src = "/static/menu/red_dm.svg"; - else - document.querySelector(".review_dms > img").src = "/static/menu/dm.svg"; -} diff --git a/client/src/js/resumable.js b/client/src/js/resumable.js deleted file mode 100644 index bf05040..0000000 --- a/client/src/js/resumable.js +++ /dev/null @@ -1,1242 +0,0 @@ -/* - * MIT Licensed - * http://www.23developer.com/opensource - * http://github.com/23/resumable.js - * Steffen Tiedemann Christensen, steffen@23company.com - */ - -(function () { - "use strict"; - - var Resumable = function (opts) { - if (!(this instanceof Resumable)) { - return new Resumable(opts); - } - this.version = 1.0; - // SUPPORTED BY BROWSER? - // Check if these features are support by the browser: - // - File object type - // - Blob object type - // - FileList object type - // - slicing files - this.support = - typeof File !== "undefined" && - typeof Blob !== "undefined" && - typeof FileList !== "undefined" && - (!!Blob.prototype.webkitSlice || !!Blob.prototype.mozSlice || !!Blob.prototype.slice || false); - if (!this.support) return false; - - // PROPERTIES - var $ = this; - $.files = []; - $.defaults = { - chunkSize: 1 * 1024 * 1024, - forceChunkSize: false, - simultaneousUploads: 3, - fileParameterName: "file", - chunkNumberParameterName: "resumableChunkNumber", - chunkSizeParameterName: "resumableChunkSize", - currentChunkSizeParameterName: "resumableCurrentChunkSize", - totalSizeParameterName: "resumableTotalSize", - typeParameterName: "resumableType", - identifierParameterName: "resumableIdentifier", - fileNameParameterName: "resumableFilename", - relativePathParameterName: "resumableRelativePath", - totalChunksParameterName: "resumableTotalChunks", - dragOverClass: "dragover", - throttleProgressCallbacks: 0.5, - query: {}, - headers: {}, - preprocess: null, - preprocessFile: null, - method: "multipart", - uploadMethod: "POST", - testMethod: "GET", - prioritizeFirstAndLastChunk: false, - target: "/", - testTarget: null, - parameterNamespace: "", - testChunks: true, - generateUniqueIdentifier: null, - getTarget: null, - maxChunkRetries: 100, - chunkRetryInterval: undefined, - permanentErrors: [400, 401, 403, 404, 409, 415, 500, 501], - maxFiles: undefined, - withCredentials: false, - xhrTimeout: 0, - clearInput: true, - chunkFormat: "blob", - setChunkTypeFromFile: false, - maxFilesErrorCallback: function (files, errorCount) { - var maxFiles = $.getOpt("maxFiles"); - alert("Please upload no more than " + maxFiles + " file" + (maxFiles === 1 ? "" : "s") + " at a time."); - }, - minFileSize: 1, - minFileSizeErrorCallback: function (file, errorCount) { - alert( - file.fileName || - file.name + - " is too small, please upload files larger than " + - $h.formatSize($.getOpt("minFileSize")) + - ".", - ); - }, - maxFileSize: undefined, - maxFileSizeErrorCallback: function (file, errorCount) { - alert( - file.fileName || - file.name + " is too large, please upload files less than " + $h.formatSize($.getOpt("maxFileSize")) + ".", - ); - }, - fileType: [], - fileTypeErrorCallback: function (file, errorCount) { - alert( - file.fileName || - file.name + " has type not allowed, please upload files of type " + $.getOpt("fileType") + ".", - ); - }, - }; - $.opts = opts || {}; - $.getOpt = function (o) { - var $opt = this; - // Get multiple option if passed an array - if (o instanceof Array) { - var options = {}; - $h.each(o, function (option) { - options[option] = $opt.getOpt(option); - }); - return options; - } - // Otherwise, just return a simple option - if ($opt instanceof ResumableChunk) { - if (typeof $opt.opts[o] !== "undefined") { - return $opt.opts[o]; - } else { - $opt = $opt.fileObj; - } - } - if ($opt instanceof ResumableFile) { - if (typeof $opt.opts[o] !== "undefined") { - return $opt.opts[o]; - } else { - $opt = $opt.resumableObj; - } - } - if ($opt instanceof Resumable) { - if (typeof $opt.opts[o] !== "undefined") { - return $opt.opts[o]; - } else { - return $opt.defaults[o]; - } - } - }; - $.indexOf = function (array, obj) { - if (array.indexOf) { - return array.indexOf(obj); - } - for (var i = 0; i < array.length; i++) { - if (array[i] === obj) { - return i; - } - } - return -1; - }; - - // EVENTS - // catchAll(event, ...) - // fileSuccess(file), fileProgress(file), fileAdded(file, event), filesAdded(files, filesSkipped), fileRetry(file), - // fileError(file, message), complete(), progress(), error(message, file), pause() - $.events = []; - $.on = function (event, callback) { - $.events.push(event.toLowerCase(), callback); - }; - $.fire = function () { - // `arguments` is an object, not array, in FF, so: - var args = []; - for (var i = 0; i < arguments.length; i++) args.push(arguments[i]); - // Find event listeners, and support pseudo-event `catchAll` - var event = args[0].toLowerCase(); - for (var i = 0; i <= $.events.length; i += 2) { - if ($.events[i] == event) $.events[i + 1].apply($, args.slice(1)); - if ($.events[i] == "catchall") $.events[i + 1].apply(null, args); - } - if (event == "fileerror") $.fire("error", args[2], args[1]); - if (event == "fileprogress") $.fire("progress"); - }; - - // INTERNAL HELPER METHODS (handy, but ultimately not part of uploading) - var $h = { - stopEvent: function (e) { - e.stopPropagation(); - e.preventDefault(); - }, - each: function (o, callback) { - if (typeof o.length !== "undefined") { - for (var i = 0; i < o.length; i++) { - // Array or FileList - if (callback(o[i]) === false) return; - } - } else { - for (i in o) { - // Object - if (callback(i, o[i]) === false) return; - } - } - }, - generateUniqueIdentifier: function (file, event) { - var custom = $.getOpt("generateUniqueIdentifier"); - if (typeof custom === "function") { - return custom(file, event); - } - var relativePath = file.webkitRelativePath || file.relativePath || file.fileName || file.name; // Some confusion in different versions of Firefox - var size = file.size; - return size + "-" + relativePath.replace(/[^0-9a-zA-Z_-]/gim, ""); - }, - contains: function (array, test) { - var result = false; - - $h.each(array, function (value) { - if (value == test) { - result = true; - return false; - } - return true; - }); - - return result; - }, - formatSize: function (size) { - if (size < 1024) { - return size + " bytes"; - } else if (size < 1024 * 1024) { - return (size / 1024.0).toFixed(0) + " KB"; - } else if (size < 1024 * 1024 * 1024) { - return (size / 1024.0 / 1024.0).toFixed(1) + " MB"; - } else { - return (size / 1024.0 / 1024.0 / 1024.0).toFixed(1) + " GB"; - } - }, - getTarget: function (request, params) { - var target = $.getOpt("target"); - - if (request === "test" && $.getOpt("testTarget")) { - target = $.getOpt("testTarget") === "/" ? $.getOpt("target") : $.getOpt("testTarget"); - } - - if (typeof target === "function") { - return target(params); - } - - var separator = target.indexOf("?") < 0 ? "?" : "&"; - var joinedParams = params.join("&"); - - if (joinedParams) target = target + separator + joinedParams; - - return target; - }, - }; - - var onDrop = function (e) { - e.currentTarget.classList.remove($.getOpt("dragOverClass")); - $h.stopEvent(e); - - //handle dropped things as items if we can (this lets us deal with folders nicer in some cases) - if (e.dataTransfer && e.dataTransfer.items) { - loadFiles(e.dataTransfer.items, e); - } - //else handle them as files - else if (e.dataTransfer && e.dataTransfer.files) { - loadFiles(e.dataTransfer.files, e); - } - }; - var onDragLeave = function (e) { - e.currentTarget.classList.remove($.getOpt("dragOverClass")); - }; - var onDragOverEnter = function (e) { - e.preventDefault(); - var dt = e.dataTransfer; - if ($.indexOf(dt.types, "Files") >= 0) { - // only for file drop - e.stopPropagation(); - dt.dropEffect = "copy"; - dt.effectAllowed = "copy"; - e.currentTarget.classList.add($.getOpt("dragOverClass")); - } else { - // not work on IE/Edge.... - dt.dropEffect = "none"; - dt.effectAllowed = "none"; - } - }; - - /** - * processes a single upload item (file or directory) - * @param {Object} item item to upload, may be file or directory entry - * @param {string} path current file path - * @param {File[]} items list of files to append new items to - * @param {Function} cb callback invoked when item is processed - */ - function processItem(item, path, items, cb) { - var entry; - if (item.isFile) { - // file provided - return item.file(function (file) { - file.relativePath = path + file.name; - items.push(file); - cb(); - }); - } else if (item.isDirectory) { - // item is already a directory entry, just assign - entry = item; - } else if (item instanceof File) { - items.push(item); - } - if ("function" === typeof item.webkitGetAsEntry) { - // get entry from file object - entry = item.webkitGetAsEntry(); - } - if (entry && entry.isDirectory) { - // directory provided, process it - return processDirectory(entry, path + entry.name + "/", items, cb); - } - if ("function" === typeof item.getAsFile) { - // item represents a File object, convert it - item = item.getAsFile(); - if (item instanceof File) { - item.relativePath = path + item.name; - items.push(item); - } - } - cb(); // indicate processing is done - } - - /** - * cps-style list iteration. - * invokes all functions in list and waits for their callback to be - * triggered. - * @param {Function[]} items list of functions expecting callback parameter - * @param {Function} cb callback to trigger after the last callback has been invoked - */ - function processCallbacks(items, cb) { - if (!items || items.length === 0) { - // empty or no list, invoke callback - return cb(); - } - // invoke current function, pass the next part as continuation - items[0](function () { - processCallbacks(items.slice(1), cb); - }); - } - - /** - * recursively traverse directory and collect files to upload - * @param {Object} directory directory to process - * @param {string} path current path - * @param {File[]} items target list of items - * @param {Function} cb callback invoked after traversing directory - */ - function processDirectory(directory, path, items, cb) { - var dirReader = directory.createReader(); - var allEntries = []; - - function readEntries() { - dirReader.readEntries(function (entries) { - if (entries.length) { - allEntries = allEntries.concat(entries); - return readEntries(); - } - - // process all conversion callbacks, finally invoke own one - processCallbacks( - allEntries.map(function (entry) { - // bind all properties except for callback - return processItem.bind(null, entry, path, items); - }), - cb, - ); - }); - } - - readEntries(); - } - - /** - * process items to extract files to be uploaded - * @param {File[]} items items to process - * @param {Event} event event that led to upload - */ - function loadFiles(items, event) { - if (!items.length) { - return; // nothing to do - } - $.fire("beforeAdd"); - var files = []; - processCallbacks( - Array.prototype.map.call(items, function (item) { - // bind all properties except for callback - var entry = item; - if ("function" === typeof item.webkitGetAsEntry) { - entry = item.webkitGetAsEntry(); - } - return processItem.bind(null, entry, "", files); - }), - function () { - if (files.length) { - // at least one file found - appendFilesFromFileList(files, event); - } - }, - ); - } - - var appendFilesFromFileList = function (fileList, event) { - // check for uploading too many files - var errorCount = 0; - var o = $.getOpt([ - "maxFiles", - "minFileSize", - "maxFileSize", - "maxFilesErrorCallback", - "minFileSizeErrorCallback", - "maxFileSizeErrorCallback", - "fileType", - "fileTypeErrorCallback", - ]); - if (typeof o.maxFiles !== "undefined" && o.maxFiles < fileList.length + $.files.length) { - // if single-file upload, file is already added, and trying to add 1 new file, simply replace the already-added file - if (o.maxFiles === 1 && $.files.length === 1 && fileList.length === 1) { - $.removeFile($.files[0]); - } else { - o.maxFilesErrorCallback(fileList, errorCount++); - return false; - } - } - var files = [], - filesSkipped = [], - remaining = fileList.length; - var decreaseReamining = function () { - if (!--remaining) { - // all files processed, trigger event - if (!files.length && !filesSkipped.length) { - // no succeeded files, just skip - return; - } - window.setTimeout(function () { - $.fire("filesAdded", files, filesSkipped); - }, 0); - } - }; - $h.each(fileList, function (file) { - var fileName = file.name; - var fileType = file.type; // e.g video/mp4 - if (o.fileType.length > 0) { - var fileTypeFound = false; - for (var index in o.fileType) { - // For good behaviour we do some inital sanitizing. Remove spaces and lowercase all - o.fileType[index] = o.fileType[index].replace(/\s/g, "").toLowerCase(); - - // Allowing for both [extension, .extension, mime/type, mime/*] - var extension = (o.fileType[index].match(/^[^.][^/]+$/) ? "." : "") + o.fileType[index]; - - if ( - fileName.substr(-1 * extension.length).toLowerCase() === extension || - //If MIME type, check for wildcard or if extension matches the files tiletype - (extension.indexOf("/") !== -1 && - ((extension.indexOf("*") !== -1 && - fileType.substr(0, extension.indexOf("*")) === extension.substr(0, extension.indexOf("*"))) || - fileType === extension)) - ) { - fileTypeFound = true; - break; - } - } - if (!fileTypeFound) { - o.fileTypeErrorCallback(file, errorCount++); - return true; - } - } - - if (typeof o.minFileSize !== "undefined" && file.size < o.minFileSize) { - o.minFileSizeErrorCallback(file, errorCount++); - return true; - } - if (typeof o.maxFileSize !== "undefined" && file.size > o.maxFileSize) { - o.maxFileSizeErrorCallback(file, errorCount++); - return true; - } - - function addFile(uniqueIdentifier) { - if (!$.getFromUniqueIdentifier(uniqueIdentifier)) { - (function () { - file.uniqueIdentifier = uniqueIdentifier; - var f = new ResumableFile($, file, uniqueIdentifier); - $.files.push(f); - files.push(f); - f.container = typeof event != "undefined" ? event.srcElement : null; - window.setTimeout(function () { - $.fire("fileAdded", f, event); - }, 0); - })(); - } else { - filesSkipped.push(file); - } - decreaseReamining(); - } - // directories have size == 0 - var uniqueIdentifier = $h.generateUniqueIdentifier(file, event); - if (uniqueIdentifier && typeof uniqueIdentifier.then === "function") { - // Promise or Promise-like object provided as unique identifier - uniqueIdentifier.then( - function (uniqueIdentifier) { - // unique identifier generation succeeded - addFile(uniqueIdentifier); - }, - function () { - // unique identifier generation failed - // skip further processing, only decrease file count - decreaseReamining(); - }, - ); - } else { - // non-Promise provided as unique identifier, process synchronously - addFile(uniqueIdentifier); - } - }); - }; - - // INTERNAL OBJECT TYPES - function ResumableFile(resumableObj, file, uniqueIdentifier) { - var $ = this; - $.opts = {}; - $.getOpt = resumableObj.getOpt; - $._prevProgress = 0; - $.resumableObj = resumableObj; - $.file = file; - $.fileName = file.fileName || file.name; // Some confusion in different versions of Firefox - $.size = file.size; - $.relativePath = file.relativePath || file.webkitRelativePath || $.fileName; - $.uniqueIdentifier = uniqueIdentifier; - $._pause = false; - $.container = ""; - $.preprocessState = 0; // 0 = unprocessed, 1 = processing, 2 = finished - var _error = uniqueIdentifier !== undefined; - - // Callback when something happens within the chunk - var chunkEvent = function (event, message) { - // event can be 'progress', 'success', 'error' or 'retry' - switch (event) { - case "progress": - $.resumableObj.fire("fileProgress", $, message); - break; - case "error": - $.abort(); - _error = true; - $.chunks = []; - $.resumableObj.fire("fileError", $, message); - break; - case "success": - if (_error) return; - $.resumableObj.fire("fileProgress", $, message); // it's at least progress - if ($.isComplete()) { - $.resumableObj.fire("fileSuccess", $, message); - } - break; - case "retry": - $.resumableObj.fire("fileRetry", $); - break; - } - }; - - // Main code to set up a file object with chunks, - // packaged to be able to handle retries if needed. - $.chunks = []; - $.abort = function () { - // Stop current uploads - var abortCount = 0; - $h.each($.chunks, function (c) { - if (c.status() == "uploading") { - c.abort(); - abortCount++; - } - }); - if (abortCount > 0) $.resumableObj.fire("fileProgress", $); - }; - $.cancel = function () { - // Reset this file to be void - var _chunks = $.chunks; - $.chunks = []; - // Stop current uploads - $h.each(_chunks, function (c) { - if (c.status() == "uploading") { - c.abort(); - $.resumableObj.uploadNextChunk(); - } - }); - $.resumableObj.removeFile($); - $.resumableObj.fire("fileProgress", $); - }; - $.retry = function () { - $.bootstrap(); - var firedRetry = false; - $.resumableObj.on("chunkingComplete", function () { - if (!firedRetry) $.resumableObj.upload(); - firedRetry = true; - }); - }; - $.bootstrap = function () { - $.abort(); - _error = false; - // Rebuild stack of chunks from file - $.chunks = []; - $._prevProgress = 0; - var round = $.getOpt("forceChunkSize") ? Math.ceil : Math.floor; - var maxOffset = Math.max(round($.file.size / $.getOpt("chunkSize")), 1); - for (var offset = 0; offset < maxOffset; offset++) { - (function (offset) { - $.chunks.push(new ResumableChunk($.resumableObj, $, offset, chunkEvent)); - $.resumableObj.fire("chunkingProgress", $, offset / maxOffset); - })(offset); - } - window.setTimeout(function () { - $.resumableObj.fire("chunkingComplete", $); - }, 0); - }; - $.progress = function () { - if (_error) return 1; - // Sum up progress across everything - var ret = 0; - var error = false; - $h.each($.chunks, function (c) { - if (c.status() == "error") error = true; - ret += c.progress(true); // get chunk progress relative to entire file - }); - ret = error ? 1 : ret > 0.99999 ? 1 : ret; - ret = Math.max($._prevProgress, ret); // We don't want to lose percentages when an upload is paused - $._prevProgress = ret; - return ret; - }; - $.isUploading = function () { - var uploading = false; - $h.each($.chunks, function (chunk) { - if (chunk.status() == "uploading") { - uploading = true; - return false; - } - }); - return uploading; - }; - $.isComplete = function () { - var outstanding = false; - if ($.preprocessState === 1) { - return false; - } - $h.each($.chunks, function (chunk) { - var status = chunk.status(); - if (status == "pending" || status == "uploading" || chunk.preprocessState === 1) { - outstanding = true; - return false; - } - }); - return !outstanding; - }; - $.pause = function (pause) { - if (typeof pause === "undefined") { - $._pause = $._pause ? false : true; - } else { - $._pause = pause; - } - }; - $.isPaused = function () { - return $._pause; - }; - $.preprocessFinished = function () { - $.preprocessState = 2; - $.upload(); - }; - $.upload = function () { - var found = false; - if ($.isPaused() === false) { - var preprocess = $.getOpt("preprocessFile"); - if (typeof preprocess === "function") { - switch ($.preprocessState) { - case 0: - $.preprocessState = 1; - preprocess($); - return true; - case 1: - return true; - case 2: - break; - } - } - $h.each($.chunks, function (chunk) { - if (chunk.status() == "pending" && chunk.preprocessState !== 1) { - chunk.send(); - found = true; - return false; - } - }); - } - return found; - }; - $.markChunksCompleted = function (chunkNumber) { - if (!$.chunks || $.chunks.length <= chunkNumber) { - return; - } - for (var num = 0; num < chunkNumber; num++) { - $.chunks[num].markComplete = true; - } - }; - - // Bootstrap and return - $.resumableObj.fire("chunkingStart", $); - $.bootstrap(); - return this; - } - - function ResumableChunk(resumableObj, fileObj, offset, callback) { - var $ = this; - $.opts = {}; - $.getOpt = resumableObj.getOpt; - $.resumableObj = resumableObj; - $.fileObj = fileObj; - $.fileObjSize = fileObj.size; - $.fileObjType = fileObj.file.type; - $.offset = offset; - $.callback = callback; - $.lastProgressCallback = new Date(); - $.tested = false; - $.retries = 0; - $.pendingRetry = false; - $.preprocessState = 0; // 0 = unprocessed, 1 = processing, 2 = finished - $.markComplete = false; - - // Computed properties - var chunkSize = $.getOpt("chunkSize"); - $.loaded = 0; - $.startByte = $.offset * chunkSize; - $.endByte = Math.min($.fileObjSize, ($.offset + 1) * chunkSize); - if ($.fileObjSize - $.endByte < chunkSize && !$.getOpt("forceChunkSize")) { - // The last chunk will be bigger than the chunk size, but less than 2*chunkSize - $.endByte = $.fileObjSize; - } - $.xhr = null; - - // test() makes a GET request without any data to see if the chunk has already been uploaded in a previous session - $.test = function () { - // Set up request and listen for event - $.xhr = new XMLHttpRequest(); - - var testHandler = function (e) { - $.tested = true; - var status = $.status(); - if (status == "success") { - $.callback(status, $.message()); - $.resumableObj.uploadNextChunk(); - } else { - $.send(); - } - }; - $.xhr.addEventListener("load", testHandler, false); - $.xhr.addEventListener("error", testHandler, false); - $.xhr.addEventListener("timeout", testHandler, false); - - // Add data from the query options - var params = []; - var parameterNamespace = $.getOpt("parameterNamespace"); - var customQuery = $.getOpt("query"); - if (typeof customQuery == "function") customQuery = customQuery($.fileObj, $); - $h.each(customQuery, function (k, v) { - params.push([encodeURIComponent(parameterNamespace + k), encodeURIComponent(v)].join("=")); - }); - // Add extra data to identify chunk - params = params.concat( - [ - // define key/value pairs for additional parameters - ["chunkNumberParameterName", $.offset + 1], - ["chunkSizeParameterName", $.getOpt("chunkSize")], - ["currentChunkSizeParameterName", $.endByte - $.startByte], - ["totalSizeParameterName", $.fileObjSize], - ["typeParameterName", $.fileObjType], - ["identifierParameterName", $.fileObj.uniqueIdentifier], - ["fileNameParameterName", $.fileObj.fileName], - ["relativePathParameterName", $.fileObj.relativePath], - ["totalChunksParameterName", $.fileObj.chunks.length], - ] - .filter(function (pair) { - // include items that resolve to truthy values - // i.e. exclude false, null, undefined and empty strings - return $.getOpt(pair[0]); - }) - .map(function (pair) { - // map each key/value pair to its final form - return [parameterNamespace + $.getOpt(pair[0]), encodeURIComponent(pair[1])].join("="); - }), - ); - // Append the relevant chunk and send it - $.xhr.open($.getOpt("testMethod"), $h.getTarget("test", params)); - $.xhr.timeout = $.getOpt("xhrTimeout"); - $.xhr.withCredentials = $.getOpt("withCredentials"); - // Add data from header options - var customHeaders = $.getOpt("headers"); - if (typeof customHeaders === "function") { - customHeaders = customHeaders($.fileObj, $); - } - $h.each(customHeaders, function (k, v) { - $.xhr.setRequestHeader(k, v); - }); - $.xhr.send(null); - }; - - $.preprocessFinished = function () { - $.preprocessState = 2; - $.send(); - }; - - // send() uploads the actual data in a POST call - $.send = function () { - var preprocess = $.getOpt("preprocess"); - if (typeof preprocess === "function") { - switch ($.preprocessState) { - case 0: - $.preprocessState = 1; - preprocess($); - return; - case 1: - return; - case 2: - break; - } - } - if ($.getOpt("testChunks") && !$.tested) { - $.test(); - return; - } - - // Set up request and listen for event - $.xhr = new XMLHttpRequest(); - - // Progress - $.xhr.upload.addEventListener( - "progress", - function (e) { - if (new Date() - $.lastProgressCallback > $.getOpt("throttleProgressCallbacks") * 1000) { - $.callback("progress"); - $.lastProgressCallback = new Date(); - } - $.loaded = e.loaded || 0; - }, - false, - ); - $.loaded = 0; - $.pendingRetry = false; - $.callback("progress"); - - // Done (either done, failed or retry) - var doneHandler = function (e) { - var status = $.status(); - if (status == "success" || status == "error") { - $.callback(status, $.message()); - $.resumableObj.uploadNextChunk(); - } else { - $.callback("retry", $.message()); - $.abort(); - $.retries++; - var retryInterval = $.getOpt("chunkRetryInterval"); - if (retryInterval !== undefined) { - $.pendingRetry = true; - setTimeout($.send, retryInterval); - } else { - $.send(); - } - } - }; - $.xhr.addEventListener("load", doneHandler, false); - $.xhr.addEventListener("error", doneHandler, false); - $.xhr.addEventListener("timeout", doneHandler, false); - - // Set up the basic query data from Resumable - var query = [ - ["chunkNumberParameterName", $.offset + 1], - ["chunkSizeParameterName", $.getOpt("chunkSize")], - ["currentChunkSizeParameterName", $.endByte - $.startByte], - ["totalSizeParameterName", $.fileObjSize], - ["typeParameterName", $.fileObjType], - ["identifierParameterName", $.fileObj.uniqueIdentifier], - ["fileNameParameterName", $.fileObj.fileName], - ["relativePathParameterName", $.fileObj.relativePath], - ["totalChunksParameterName", $.fileObj.chunks.length], - ] - .filter(function (pair) { - // include items that resolve to truthy values - // i.e. exclude false, null, undefined and empty strings - return $.getOpt(pair[0]); - }) - .reduce(function (query, pair) { - // assign query key/value - query[$.getOpt(pair[0])] = pair[1]; - return query; - }, {}); - // Mix in custom data - var customQuery = $.getOpt("query"); - if (typeof customQuery == "function") customQuery = customQuery($.fileObj, $); - $h.each(customQuery, function (k, v) { - query[k] = v; - }); - - var func = $.fileObj.file.slice - ? "slice" - : $.fileObj.file.mozSlice - ? "mozSlice" - : $.fileObj.file.webkitSlice - ? "webkitSlice" - : "slice"; - var bytes = $.fileObj.file[func]( - $.startByte, - $.endByte, - $.getOpt("setChunkTypeFromFile") ? $.fileObj.file.type : "", - ); - var data = null; - var params = []; - - var parameterNamespace = $.getOpt("parameterNamespace"); - if ($.getOpt("method") === "octet") { - // Add data from the query options - data = bytes; - $h.each(query, function (k, v) { - params.push([encodeURIComponent(parameterNamespace + k), encodeURIComponent(v)].join("=")); - }); - } else { - // Add data from the query options - data = new FormData(); - $h.each(query, function (k, v) { - data.append(parameterNamespace + k, v); - params.push([encodeURIComponent(parameterNamespace + k), encodeURIComponent(v)].join("=")); - }); - if ($.getOpt("chunkFormat") == "blob") { - data.append(parameterNamespace + $.getOpt("fileParameterName"), bytes, $.fileObj.fileName); - } else if ($.getOpt("chunkFormat") == "base64") { - var fr = new FileReader(); - fr.onload = function (e) { - data.append(parameterNamespace + $.getOpt("fileParameterName"), fr.result); - $.xhr.send(data); - }; - fr.readAsDataURL(bytes); - } - } - - var target = $h.getTarget("upload", params); - var method = $.getOpt("uploadMethod"); - - $.xhr.open(method, target); - if ($.getOpt("method") === "octet") { - $.xhr.setRequestHeader("Content-Type", "application/octet-stream"); - } - $.xhr.timeout = $.getOpt("xhrTimeout"); - $.xhr.withCredentials = $.getOpt("withCredentials"); - // Add data from header options - var customHeaders = $.getOpt("headers"); - if (typeof customHeaders === "function") { - customHeaders = customHeaders($.fileObj, $); - } - - $h.each(customHeaders, function (k, v) { - $.xhr.setRequestHeader(k, v); - }); - - if ($.getOpt("chunkFormat") == "blob") { - $.xhr.send(data); - } - }; - $.abort = function () { - // Abort and reset - if ($.xhr) $.xhr.abort(); - $.xhr = null; - }; - $.status = function () { - // Returns: 'pending', 'uploading', 'success', 'error' - if ($.pendingRetry) { - // if pending retry then that's effectively the same as actively uploading, - // there might just be a slight delay before the retry starts - return "uploading"; - } else if ($.markComplete) { - return "success"; - } else if (!$.xhr) { - return "pending"; - } else if ($.xhr.readyState < 4) { - // Status is really 'OPENED', 'HEADERS_RECEIVED' or 'LOADING' - meaning that stuff is happening - return "uploading"; - } else { - if ($.xhr.status == 200 || $.xhr.status == 201) { - // HTTP 200, 201 (created) - return "success"; - } else if ( - $h.contains($.getOpt("permanentErrors"), $.xhr.status) || - $.retries >= $.getOpt("maxChunkRetries") - ) { - // HTTP 400, 404, 409, 415, 500, 501 (permanent error) - return "error"; - } else { - // this should never happen, but we'll reset and queue a retry - // a likely case for this would be 503 service unavailable - $.abort(); - return "pending"; - } - } - }; - $.message = function () { - return $.xhr ? $.xhr.responseText : ""; - }; - $.progress = function (relative) { - if (typeof relative === "undefined") relative = false; - var factor = relative ? ($.endByte - $.startByte) / $.fileObjSize : 1; - if ($.pendingRetry) return 0; - if ((!$.xhr || !$.xhr.status) && !$.markComplete) factor *= 0.95; - var s = $.status(); - switch (s) { - case "success": - case "error": - return 1 * factor; - case "pending": - return 0 * factor; - default: - return ($.loaded / ($.endByte - $.startByte)) * factor; - } - }; - return this; - } - - // QUEUE - $.uploadNextChunk = function () { - var found = false; - - // In some cases (such as videos) it's really handy to upload the first - // and last chunk of a file quickly; this let's the server check the file's - // metadata and determine if there's even a point in continuing. - if ($.getOpt("prioritizeFirstAndLastChunk")) { - $h.each($.files, function (file) { - if (file.chunks.length && file.chunks[0].status() == "pending" && file.chunks[0].preprocessState === 0) { - file.chunks[0].send(); - found = true; - return false; - } - if ( - file.chunks.length > 1 && - file.chunks[file.chunks.length - 1].status() == "pending" && - file.chunks[file.chunks.length - 1].preprocessState === 0 - ) { - file.chunks[file.chunks.length - 1].send(); - found = true; - return false; - } - }); - if (found) return true; - } - - // Now, simply look for the next, best thing to upload - $h.each($.files, function (file) { - found = file.upload(); - if (found) return false; - }); - if (found) return true; - - // The are no more outstanding chunks to upload, check is everything is done - var outstanding = false; - $h.each($.files, function (file) { - if (!file.isComplete()) { - outstanding = true; - return false; - } - }); - if (!outstanding) { - // All chunks have been uploaded, complete - $.fire("complete"); - } - return false; - }; - - // PUBLIC METHODS FOR RESUMABLE.JS - $.assignBrowse = function (domNodes, isDirectory) { - if (typeof domNodes.length == "undefined") domNodes = [domNodes]; - $h.each(domNodes, function (domNode) { - var input; - if (domNode.tagName === "INPUT" && domNode.type === "file") { - input = domNode; - } else { - input = document.createElement("input"); - input.setAttribute("type", "file"); - input.style.display = "none"; - domNode.addEventListener( - "click", - function () { - input.style.opacity = 0; - input.style.display = "block"; - input.focus(); - input.click(); - input.style.display = "none"; - }, - false, - ); - domNode.appendChild(input); - } - var maxFiles = $.getOpt("maxFiles"); - if (typeof maxFiles === "undefined" || maxFiles != 1) { - input.setAttribute("multiple", "multiple"); - } else { - input.removeAttribute("multiple"); - } - if (isDirectory) { - input.setAttribute("webkitdirectory", "webkitdirectory"); - } else { - input.removeAttribute("webkitdirectory"); - } - var fileTypes = $.getOpt("fileType"); - if (typeof fileTypes !== "undefined" && fileTypes.length >= 1) { - input.setAttribute( - "accept", - fileTypes - .map(function (e) { - e = e.replace(/\s/g, "").toLowerCase(); - if (e.match(/^[^.][^/]+$/)) { - e = "." + e; - } - return e; - }) - .join(","), - ); - } else { - input.removeAttribute("accept"); - } - // When new files are added, simply append them to the overall list - input.addEventListener( - "change", - function (e) { - appendFilesFromFileList(e.target.files, e); - var clearInput = $.getOpt("clearInput"); - if (clearInput) { - e.target.value = ""; - } - }, - false, - ); - }); - }; - $.assignDrop = function (domNodes) { - if (typeof domNodes.length == "undefined") domNodes = [domNodes]; - - $h.each(domNodes, function (domNode) { - domNode.addEventListener("dragover", onDragOverEnter, false); - domNode.addEventListener("dragenter", onDragOverEnter, false); - domNode.addEventListener("dragleave", onDragLeave, false); - domNode.addEventListener("drop", onDrop, false); - }); - }; - $.unAssignDrop = function (domNodes) { - if (typeof domNodes.length == "undefined") domNodes = [domNodes]; - - $h.each(domNodes, function (domNode) { - domNode.removeEventListener("dragover", onDragOverEnter); - domNode.removeEventListener("dragenter", onDragOverEnter); - domNode.removeEventListener("dragleave", onDragLeave); - domNode.removeEventListener("drop", onDrop); - }); - }; - $.isUploading = function () { - var uploading = false; - $h.each($.files, function (file) { - if (file.isUploading()) { - uploading = true; - return false; - } - }); - return uploading; - }; - $.upload = function () { - // Make sure we don't start too many uploads at once - if ($.isUploading()) return; - // Kick off the queue - $.fire("uploadStart"); - for (var num = 1; num <= $.getOpt("simultaneousUploads"); num++) { - $.uploadNextChunk(); - } - }; - $.pause = function () { - // Resume all chunks currently being uploaded - $h.each($.files, function (file) { - file.abort(); - }); - $.fire("pause"); - }; - $.cancel = function () { - $.fire("beforeCancel"); - for (var i = $.files.length - 1; i >= 0; i--) { - $.files[i].cancel(); - } - $.fire("cancel"); - }; - $.progress = function () { - var totalDone = 0; - var totalSize = 0; - // Resume all chunks currently being uploaded - $h.each($.files, function (file) { - totalDone += file.progress() * file.size; - totalSize += file.size; - }); - return totalSize > 0 ? totalDone / totalSize : 0; - }; - $.addFile = function (file, event) { - appendFilesFromFileList([file], event); - }; - $.addFiles = function (files, event) { - appendFilesFromFileList(files, event); - }; - $.removeFile = function (file) { - for (var i = $.files.length - 1; i >= 0; i--) { - if ($.files[i] === file) { - $.files.splice(i, 1); - } - } - }; - $.getFromUniqueIdentifier = function (uniqueIdentifier) { - var ret = false; - $h.each($.files, function (f) { - if (f.uniqueIdentifier == uniqueIdentifier) ret = f; - }); - return ret; - }; - $.getSize = function () { - var totalSize = 0; - $h.each($.files, function (file) { - totalSize += file.size; - }); - return totalSize; - }; - $.handleDropEvent = function (e) { - onDrop(e); - }; - $.handleChangeEvent = function (e) { - appendFilesFromFileList(e.target.files, e); - e.target.value = ""; - }; - $.updateQuery = function (query) { - $.opts.query = query; - }; - - return this; - }; - - // Node.js-style export for Node and Component - if (typeof module != "undefined") { - // left here for backwards compatibility - module.exports = Resumable; - module.exports.Resumable = Resumable; - } else if (typeof define === "function" && define.amd) { - // AMD/requirejs: Define the module - define(function () { - return Resumable; - }); - } else { - // Browser: Expose to window - window.Resumable = Resumable; - } -})(); diff --git a/client/src/jsconfig.json b/client/src/jsconfig.json deleted file mode 100644 index 2f547e4..0000000 --- a/client/src/jsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilerOptions": { - "baseUrl": ".", - "paths": { - "@wp/pages": ["./pages/_index.js"], - "@wp/components": ["./pages/components/_index.js"], - "@wp/env/*": ["./env/*"], - "@wp/lib/*": ["./lib/*"], - "@wp/js/*": ["./js/*"], - "@wp/css/*": ["./css/*"], - "@wp/assets/*": ["./assets/*"], - "@wp/api": ["./api/_index.js"], - "@wp/utils": ["./utils/_index.js"] - }, - "target": "es6", - "module": "es6", - "lib": ["dom", "dom.iterable"], - "moduleResolution": "node", - "allowSyntheticDefaultImports": true - } -} diff --git a/client/src/lib/_index.js b/client/src/lib/_index.js deleted file mode 100644 index 4e67407..0000000 --- a/client/src/lib/_index.js +++ /dev/null @@ -1 +0,0 @@ -export { validateImportKey } from "./imports/_index.js"; diff --git a/client/src/lib/api/error-v2.ts b/client/src/lib/api/error-v2.ts new file mode 100644 index 0000000..e092c33 --- /dev/null +++ b/client/src/lib/api/error-v2.ts @@ -0,0 +1,42 @@ +import { InvalidErrorType } from "#lib/errors"; +import { IResponseError } from "./types"; + +interface IAPIV2Error extends Error { + pathSpec: string; + request: Request; + response: Response; + error?: IResponseError; +} + +interface IAPIV2ErrorOptions extends ErrorOptions { + pathSpec: string; + request: Request; + response: Response; + error?: IResponseError; +} + +export class APIV2Error extends Error implements IAPIV2Error { + pathSpec: string; + request: Request; + response: Response; + error?: IResponseError; + + constructor(message: string, options: IAPIV2ErrorOptions) { + super(message); + + this.pathSpec = options.pathSpec; + this.request = options.request; + this.response = options.response; + this.error = options.error; + } +} + +export function isAPIV2Error(input: unknown): input is APIV2Error { + return input instanceof APIV2Error; +} + +export function ensureAPIV2Error(input: unknown): asserts input is APIV2Error { + if (!isAPIV2Error(input)) { + throw new InvalidErrorType(input); + } +} diff --git a/client/src/lib/api/error.ts b/client/src/lib/api/error.ts new file mode 100644 index 0000000..da2ac38 --- /dev/null +++ b/client/src/lib/api/error.ts @@ -0,0 +1,33 @@ +import { InvalidErrorType } from "#lib/errors"; + +interface IAPIError extends Error { + request: Request; + response: Response; +} + +interface IAPIErrorOptions extends ErrorOptions { + request: Request; + response: Response; +} + +export class APIError extends Error implements IAPIError { + request: Request; + response: Response; + + constructor(message: string, options: IAPIErrorOptions) { + super(message); + + this.request = options.request; + this.response = options.response; + } +} + +export function isAPIError(input: unknown): input is APIError { + return input instanceof APIError; +} + +export function ensureAPIError(input: unknown): asserts input is APIError { + if (!isAPIError(input)) { + throw new InvalidErrorType(input); + } +} diff --git a/client/src/lib/api/fetch.ts b/client/src/lib/api/fetch.ts new file mode 100644 index 0000000..230c1b1 --- /dev/null +++ b/client/src/lib/api/fetch.ts @@ -0,0 +1,149 @@ +import { logoutAccount } from "#entities/account"; +import { HTTP_STATUS, mergeHeaders } from "#lib/http"; +import { customFetch } from "#lib/fetch"; +import { APIError } from "#lib/api"; + +const urlBase = `/api/v1`; +const jsonHeaders = new Headers(); +jsonHeaders.append("Content-Type", "application/json"); + +/** + * TODO: discriminated union with JSONable body signature + */ +interface IOptions extends Omit { + method: "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "CONNECT" | "OPTIONS" | "TRACE" | "PATCH"; + body?: any; + headers?: Headers; +} + +// TODO: Make this not throw. +/** + * Generic request for Kemono API. + * @param path + * A path to the endpoint, realtive to the base API path. + */ +export async function apiFetch( + path: string, + options: IOptions, + searchParams?: URLSearchParams +): Promise { + // `URL` constructor requires a full origin + // to be present in either of arguments + // but the argument for `fetch()` accepts relative paths just fine + // so we are doing some gymnastics in order not to depend + // on browser context (does not exist on server) + // or an env variable (not needed if the origin is the same). + const url = new URL(`${urlBase}${path}`, "https://example.com"); + url.search = !searchParams ? "" : String(searchParams); + + url.searchParams.sort(); + + const apiPath = `${url.pathname}${ + // `URL.search` param includes `?` even with no params + // so we include it conditionally + searchParams?.size !== 0 ? url.search : "" + }`; + + let finalOptions: RequestInit; + { + if (!options.body) { + finalOptions = { + ...options, + credentials: "same-origin", + }; + } else { + const jsonBody = JSON.stringify(options.body); + finalOptions = { + ...options, + headers: options.headers + ? mergeHeaders(options.headers, jsonHeaders) + : jsonHeaders, + body: jsonBody, + credentials: "same-origin", + }; + } + } + const request = new Request(apiPath, finalOptions); + const response = await customFetch(request); + + if (!response.ok) { + // server logged the account out + if (response.status === 401) { + await logoutAccount(true); + + throw new APIError( + `Failed to fetch from API due to lack of credentials. Reason: ${response.status} - ${response.statusText}.`, + { request, response } + ); + } + + if (response.status === 400 || response.status === 422) { + let body: string | undefined; + // doing it this way because response doesn't allow + // parsing body several times + // and cloning response is a bit too much + const text = (await response.text()).trim(); + + try { + const json = JSON.parse(text); + body = JSON.stringify(json); + } catch (error) { + body = text; + } + + throw new APIError( + `Failed to fetch from API due to client inputs. Reason: ${ + response.status + } - ${response.statusText}.${!body ? "" : ` ${body}`}`, + { request, response } + ); + } + + if (response.status === 404) { + let body: string | undefined; + // doing it this way because response doesn't allow + // parsing body several times + // and cloning response is a bit too much + const text = (await response.text()).trim(); + + try { + const json = JSON.parse(text); + body = JSON.stringify(json); + } catch (error) { + body = text; + } + + throw new APIError( + `Failed to fetch from API because path "${ + response.url + }" doesn't exist. Reason: ${response.status} - ${response.statusText}.${ + !body ? "" : ` ${body}` + }`, + { request, response } + ); + } + + if (response.status === HTTP_STATUS.SERVICE_UNAVAILABLE) { + throw new APIError("API is in maintenance or not available.", { + request, + response, + }); + } + + if (response.status >= 500) { + throw new APIError("Failed to fetch from API due to server error.", { + request, + response, + }); + } + + throw new APIError("Failed to fetch from API for unknown reasons.", { + request, + response, + }); + } + + const resultBody: ReturnShape = await response.json(); + + return resultBody; +} diff --git a/client/src/lib/api/index.ts b/client/src/lib/api/index.ts new file mode 100644 index 0000000..3e7d77a --- /dev/null +++ b/client/src/lib/api/index.ts @@ -0,0 +1,4 @@ +export { apiFetch } from "./fetch"; +export { APIError, ensureAPIError, isAPIError } from "./error"; +export { apiV2Fetch } from "./v2"; +export { APIV2Error, ensureAPIV2Error, isAPIV2Error } from "./error-v2"; diff --git a/client/src/lib/api/types.ts b/client/src/lib/api/types.ts new file mode 100644 index 0000000..a888a98 --- /dev/null +++ b/client/src/lib/api/types.ts @@ -0,0 +1,25 @@ +export type IMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE"; + +export const requestBodyType = "Sneed's Feed & Seed (formerly Chuck's)"; +export const responseBodyTypeSuccess = "Chuck's Fuck & Suck (formerly Boyle's)"; +export const responseBodyTypeError = "Boyle's Foil & Soil (formerly Sneed's)"; + +export interface IRequestBody { + type: typeof requestBodyType; + data?: DataShape; +} + +export interface IResponseBodySuccess { + type: typeof responseBodyTypeSuccess; + data: DataShape; +} + +export interface IResponseBodyError { + type: typeof responseBodyTypeError; + error: IResponseError; +} + +export interface IResponseError { + type: string; + message?: string; +} diff --git a/client/src/lib/api/v2.ts b/client/src/lib/api/v2.ts new file mode 100644 index 0000000..4b62778 --- /dev/null +++ b/client/src/lib/api/v2.ts @@ -0,0 +1,145 @@ +import { HTTP_STATUS, mergeHeaders } from "#lib/http"; +import { customFetch } from "#lib/fetch"; +import { logoutAccount } from "#entities/account"; +import { APIV2Error } from "./error-v2"; +import { + IMethod, + IRequestBody, + IResponseBodySuccess, + IResponseBodyError, + requestBodyType, + IResponseError, +} from "./types"; + +const urlBase = `/api/v2`; +const jsonHeaders = new Headers(); +jsonHeaders.append("Content-Type", "application/json"); + +interface IOptions extends Omit { + body?: any; + headers?: Headers; + searchParams?: URLSearchParams; +} + +/** + * Generic request for API V2. + * @param pathSpec + * @param method + * @param path + * A path to the endpoint, relative to the base API path. + * @param options + */ +export async function apiV2Fetch( + pathSpec: string, + method: IMethod, + path: string, + options?: IOptions +): Promise { + const searchParams = options?.searchParams; + // `URL` constructor requires a full origin + // to be present in either of arguments + // but the argument for `fetch()` accepts relative paths just fine + // so we are doing some gymnastics in order not to depend + // on browser context (does not exist on server) + // or an env variable (not needed if the origin is the same). + const url = new URL(`${urlBase}${path}`, "https://example.com"); + url.search = !searchParams ? "" : String(searchParams); + + url.searchParams.sort(); + + const apiPath = `${url.pathname}${ + // `URL.search` param includes `?` even with no params + // so we include it conditionally + searchParams?.size !== 0 ? url.search : "" + }`; + + let finalOptions: RequestInit; + { + if (!options?.body) { + finalOptions = { + ...options, + method, + credentials: "same-origin", + }; + } else { + const requestBody = { + type: requestBodyType, + data: options.body, + } satisfies IRequestBody; + const jsonBody = JSON.stringify(requestBody); + finalOptions = { + ...options, + method, + headers: options.headers + ? mergeHeaders(options.headers, jsonHeaders) + : jsonHeaders, + body: jsonBody, + credentials: "same-origin", + }; + } + } + + const request = new Request(apiPath, finalOptions); + const response = await customFetch(request); + + if (!response.ok) { + let error: IResponseError | undefined = undefined; + + // doing it this way because response doesn't allow + // parsing body several times + // and cloning response is a bit too much + const text = (await response.text()).trim(); + + try { + const responseBody: IResponseBodyError = JSON.parse(text); + error = responseBody.error; + } catch (error) {} + + let message: string; + + switch (response.status) { + case HTTP_STATUS.BAD_REQUEST: + case HTTP_STATUS.UNPROCESSABLE_CONTENT: { + message = "Failed to fetch from API due to client inputs."; + break; + } + + case HTTP_STATUS.UNAUTHORIZED: { + await logoutAccount(true); + message = "Failed to fetch from API due to lack of credentials."; + break; + } + + case HTTP_STATUS.NOT_FOUND: { + message = `Failed to fetch from API because path "${response.url} doesn't exist.`; + break; + } + + case HTTP_STATUS.SERVICE_UNAVAILABLE: { + message = "API is in maintenance or not available."; + break; + } + + default: { + message = + response.status >= 500 + ? "Failed to fetch from API due to server error." + : "Failed to fetch from API for unknown reasons."; + break; + } + } + + const errorOptions = { + pathSpec, + request, + response, + error, + } satisfies ConstructorParameters["1"]; + + throw new APIV2Error(message, errorOptions); + } + + const result: IResponseBodySuccess = await response.json(); + + return result.data; +} diff --git a/client/src/lib/errors/error.ts b/client/src/lib/errors/error.ts new file mode 100644 index 0000000..7527883 --- /dev/null +++ b/client/src/lib/errors/error.ts @@ -0,0 +1,11 @@ +import { InvalidErrorType } from "./invalid"; + +export function isError(input: unknown): input is Error { + return input instanceof Error; +} + +export function ensureError(input: unknown): asserts input is Error { + if (!isError(input)) { + throw new InvalidErrorType(input); + } +} diff --git a/client/src/lib/errors/index.ts b/client/src/lib/errors/index.ts new file mode 100644 index 0000000..4b08512 --- /dev/null +++ b/client/src/lib/errors/index.ts @@ -0,0 +1,2 @@ +export { isError, ensureError } from "./error"; +export { InvalidErrorType } from "./invalid"; diff --git a/client/src/lib/errors/invalid.ts b/client/src/lib/errors/invalid.ts new file mode 100644 index 0000000..4473fe5 --- /dev/null +++ b/client/src/lib/errors/invalid.ts @@ -0,0 +1,16 @@ +interface IInvalidErrorType extends Error { + payload: unknown; +} + +/** + * An error for when the value thrown is not a subclass of `Error` class. + */ +export class InvalidErrorType extends Error implements IInvalidErrorType { + payload: unknown; + + constructor(payload: unknown) { + super("Invalid input error type."); + + this.payload = payload; + } +} diff --git a/client/src/lib/fetch/errors.ts b/client/src/lib/fetch/errors.ts new file mode 100644 index 0000000..a16d56e --- /dev/null +++ b/client/src/lib/fetch/errors.ts @@ -0,0 +1,36 @@ +import { InvalidErrorType } from "#lib/errors"; + +interface IFetchError extends Error { + request: Request; +} + +interface IFetchErrorOptions extends ErrorOptions { + request: Request; +} + +/** + * `fetch()` by itself doesn't throw, it only does so due to some client settings + * i.e. improperly formed headers/body/url by the client code + * or browser extensions/adblockers terminating it early. + * + * Since it throws before doing any actual request, the response object is not available to it. + */ +export class FetchError extends Error implements IFetchError { + request: Request; + + constructor(message: string, options: IFetchErrorOptions) { + super(message); + + this.request = options.request; + } +} + +export function isFetchError(input: unknown): input is FetchError { + return input instanceof FetchError; +} + +export function ensureFetchError(input: unknown): asserts input is FetchError { + if (!isFetchError(input)) { + throw new InvalidErrorType(input); + } +} diff --git a/client/src/lib/fetch/fetch.ts b/client/src/lib/fetch/fetch.ts new file mode 100644 index 0000000..8825fec --- /dev/null +++ b/client/src/lib/fetch/fetch.ts @@ -0,0 +1,18 @@ +import { FetchError } from "./errors"; + +export async function customFetch(...args: Parameters) { + const request = new Request(...args); + + + try { + const response = await fetch(request); + + return response; + } catch (error) { + + throw new FetchError("Failed to fetch due to client settings.", { + cause: error, + request, + }); + } +} diff --git a/client/src/lib/fetch/index.ts b/client/src/lib/fetch/index.ts new file mode 100644 index 0000000..b584930 --- /dev/null +++ b/client/src/lib/fetch/index.ts @@ -0,0 +1,2 @@ +export { customFetch } from "./fetch"; +export { FetchError, isFetchError, ensureFetchError } from "./errors"; diff --git a/client/src/lib/http/headers.ts b/client/src/lib/http/headers.ts new file mode 100644 index 0000000..adeed42 --- /dev/null +++ b/client/src/lib/http/headers.ts @@ -0,0 +1,12 @@ +export function mergeHeaders( + firstHeaders: Headers, + secondHeaders: Headers +): Headers { + const resultHeaders = new Headers(firstHeaders); + + secondHeaders.forEach((value, key) => { + resultHeaders.append(key, value); + }); + + return resultHeaders; +} diff --git a/client/src/lib/http/index.ts b/client/src/lib/http/index.ts new file mode 100644 index 0000000..a14dead --- /dev/null +++ b/client/src/lib/http/index.ts @@ -0,0 +1,2 @@ +export { HTTP_STATUS } from "./status"; +export { mergeHeaders } from "./headers"; diff --git a/client/src/lib/http/status.ts b/client/src/lib/http/status.ts new file mode 100644 index 0000000..e20801f --- /dev/null +++ b/client/src/lib/http/status.ts @@ -0,0 +1,66 @@ +export const HTTP_STATUS = { + /** + * The request succeeded. The result and meaning of "success" depends on the HTTP method: + * + * `GET`: The resource has been fetched and transmitted in the message body. + * + * `HEAD`: Representation headers are included in the response without any message body. + * + * `PUT` or `POST`: The resource describing the result of the action is transmitted in the message body. + * + * `TRACE`: The message body contains the request as received by the server. + */ + OK: 200, + /** + * The URL of the requested resource has been changed permanently. The new URL is given in the response. + */ + MOVED_PERMANENTLY: 301, + /** + * This response code means that the URI of requested resource has been changed temporarily. Further changes in the URI might be made in the future, so the same URI should be used by the client in future requests. + */ + FOUND: 302, + /** + * The server sent this response to direct the client to get the requested resource at another URI with a GET request. + */ + SEE_OTHER: 303, + /** + * The server sends this response to direct the client to get the requested resource at another URI with the same method that was used in the prior request. This has the same semantics as the 302 Found response code, with the exception that the user agent must not change the HTTP method used: if a POST was used in the first request, a POST must be used in the redirected request. + */ + TEMPORARY_REDIRECT: 307, + /** + * This means that the resource is now permanently located at another URI, specified by the Location response header. This has the same semantics as the 301 Moved Permanently HTTP response code, with the exception that the user agent must not change the HTTP method used: if a POST was used in the first request, a POST must be used in the second request. + */ + PERMANENT_REDIRECT: 308, + /** + * The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing). + */ + BAD_REQUEST: 400, + /** + * Although the HTTP standard specifies "unauthorized", semantically this response means "unauthenticated". That is, the client must authenticate itself to get the requested response. + */ + UNAUTHORIZED: 401, + /** + * The client does not have access rights to the content; that is, it is unauthorized, so the server is refusing to give the requested resource. Unlike 401 Unauthorized, the client's identity is known to the server. + */ + FORBIDDEN: 403, + /** + * The server cannot find the requested resource. In the browser, this means the URL is not recognized. In an API, this can also mean that the endpoint is valid but the resource itself does not exist. Servers may also send this response instead of 403 Forbidden to hide the existence of a resource from an unauthorized client. This response code is probably the most well known due to its frequent occurrence on the web. + */ + NOT_FOUND: 404, + /** + * This response is sent when a request conflicts with the current state of the server. In WebDAV remote web authoring, 409 responses are errors sent to the client so that a user might be able to resolve a conflict and resubmit the request. + */ + CONFLICT: 409, + /** + * The request was well-formed but was unable to be followed due to semantic errors. + */ + UNPROCESSABLE_CONTENT: 422, + /** + * The server has encountered a situation it does not know how to handle. This error is generic, indicating that the server cannot find a more appropriate 5XX status code to respond with. + */ + INTERNAL_SERVER_ERROR: 500, + /** + * The server is not ready to handle the request. Common causes are a server that is down for maintenance or that is overloaded. Note that together with this response, a user-friendly page explaining the problem should be sent. This response should be used for temporary conditions and the Retry-After HTTP header should, if possible, contain the estimated time before the recovery of the service. The webmaster must also take care about the caching-related headers that are sent along with this response, as these temporary condition responses should usually not be cached. + */ + SERVICE_UNAVAILABLE: 503, +} as const; diff --git a/client/src/lib/imports/lib.js b/client/src/lib/imports/lib.js deleted file mode 100644 index e2be172..0000000 --- a/client/src/lib/imports/lib.js +++ /dev/null @@ -1,148 +0,0 @@ -import { isLowerCase } from "@wp/utils"; - -/** - * @typedef ValidationResult - * @property {boolean} isValid - * @property {string[]} [errors] - * @property {any} [result] A modified result, if any. - */ - -/** - * @callback KeyValidator - * @param {string} key - * @param {string[]} errors - * @returns {string[]} An array of error messages, if any. - */ - -const maxLength = 1024; - -/** - * @type {Record} - */ -const serviceConstraints = { - patreon: patreonKey, - fanbox: fanboxKey, - gumroad: gumroadKey, - subscribestar: subscribestarKey, - dlsite: dlsiteKey, - discord: discordKey, - fantia: fantiaKey, -}; - -/** - * Validates the key according to these rules: - * - Trim spaces from both sides. - * @param {string} key - * @param {string} service - * @returns {ValidationResult} - */ -export function validateImportKey(key, service) { - const formattedKey = key.trim(); - const errors = serviceConstraints[service](key, []); - - return { - isValid: !errors.length, - errors, - result: formattedKey, - }; -} - -/** - * @type KeyValidator - */ -function patreonKey(key, errors) { - const reqLength = 43; - if (key.length !== reqLength) { - errors.push(`The key length of "${key.length}" is not a valid Patreon key. Required length: "${reqLength}".`); - } - - return errors; -} - -/** - * @type KeyValidator - */ -function fanboxKey(key, errors) { - const pattern = /^\d+_\w+$/i; - - if (key.length > maxLength) { - errors.push(`The key length of "${key.length}" is over the maximum of "${maxLength}".`); - } - - if (!key.match(pattern)) { - errors.push(`The key doesn't match the required pattern of "${String(pattern)}"`); - } - - return errors; -} - -/** - * @type KeyValidator - */ -function fantiaKey(key, errors) { - const reqLengths = [32, 64]; - - if (reqLengths.map((reqLength) => key.length !== reqLength).every((v) => v === false)) { - errors.push( - `The key length of "${key.length}" is not a valid Fantia key. ` + `Accepted lengths: ${reqLengths.join(", ")}.`, - ); - } - - if (!isLowerCase(key)) { - errors.push(`The key is not in lower case.`); - } - - return errors; -} - -/** - * @type KeyValidator - */ -function gumroadKey(key, errors) { - const minLength = 200; - - if (key.length < minLength) { - errors.push(`The key length of "${key.length}" is less than minimum required "${minLength}".`); - } - - if (key.length > maxLength) { - errors.push(`The key length of "${key.length}" is over the maximum of "${maxLength}".`); - } - - return errors; -} - -/** - * @type KeyValidator - */ -function subscribestarKey(key, errors) { - if (key.length > maxLength) { - errors.push(`The key length of "${key.length}" is over the maximum of "${maxLength}".`); - } - - return errors; -} - -/** - * @type KeyValidator - */ -function dlsiteKey(key, errors) { - if (key.length > maxLength) { - errors.push(`The key length of "${key.length}" is over the maximum of "${maxLength}".`); - } - - return errors; -} - -/** - * @type KeyValidator - */ -function discordKey(key, errors) { - const pattern = /(mfa.[a-z0-9_-]{20,})|([a-z0-9_-]{23,28}.[a-z0-9_-]{6,7}.[a-z0-9_-]{27})/i; - - if (!key.match(pattern)) { - errors.push(`The key doesn't match the required pattern of "${String(pattern)}".`); - } - - return errors; -} diff --git a/client/src/lib/numbers/index.ts b/client/src/lib/numbers/index.ts new file mode 100644 index 0000000..03ff98a --- /dev/null +++ b/client/src/lib/numbers/index.ts @@ -0,0 +1,3 @@ +export function parseInt(value: string) { + return Number.parseInt(value, 10); +} diff --git a/client/src/lib/pagination/index.ts b/client/src/lib/pagination/index.ts new file mode 100644 index 0000000..592b16c --- /dev/null +++ b/client/src/lib/pagination/index.ts @@ -0,0 +1,7 @@ +export { + PAGINATION_LIMIT, + parseOffset, + parsePageNumber, + createPagination, +} from "./lib"; +export type { IPagination } from "./types"; diff --git a/client/src/lib/pagination/lib.ts b/client/src/lib/pagination/lib.ts new file mode 100644 index 0000000..dcc1a28 --- /dev/null +++ b/client/src/lib/pagination/lib.ts @@ -0,0 +1,51 @@ +import { IPagination } from "./types"; + +export const PAGINATION_LIMIT = 50; + +export function parseOffset(offset: string | number, limit = PAGINATION_LIMIT) { + const parsedOffset = + typeof offset === "number" ? offset : parseInt(offset.trim(), 10); + + if (parsedOffset % limit !== 0) { + throw new Error(`Offset ${offset} is not a multiple of ${limit}.`); + } + + return parsedOffset; +} + +export function parsePageNumber(page: string | number | undefined): number { + if (page === undefined) { + throw new Error("Page number is required."); + } + + const parsedPage = + typeof page === "number" ? page : Number.parseInt(page.trim(), 10); + + if (parsedPage < 1) { + throw new Error("Page number must be positive."); + } + + return parsedPage; +} + +export function createPagination( + totalCount: number, + currentPage?: number +): IPagination { + const limit = PAGINATION_LIMIT; + const totalPages = Math.ceil(totalCount / limit); + const current = currentPage ?? totalPages; + const currentMin = Math.min((current - 1) * limit + 1, totalCount); + const currentMax = Math.min(currentMin - 1 + limit, totalCount); + + const pagination: IPagination = { + total_count: totalCount, + limit, + total_pages: totalPages, + current_page: current, + current_min: currentMin, + current_max: currentMax, + }; + + return pagination; +} diff --git a/client/src/lib/pagination/types.ts b/client/src/lib/pagination/types.ts new file mode 100644 index 0000000..a3837f8 --- /dev/null +++ b/client/src/lib/pagination/types.ts @@ -0,0 +1,8 @@ +export interface IPagination { + total_count: number; + limit: number; + current_page: number; + total_pages: number; + current_min: number; + current_max: number; +} diff --git a/client/src/lib/types/index.ts b/client/src/lib/types/index.ts new file mode 100644 index 0000000..8164bbd --- /dev/null +++ b/client/src/lib/types/index.ts @@ -0,0 +1,19 @@ +/** + * Stolen from [StackOverflow answer](https://stackoverflow.com/questions/46376468/how-to-get-type-of-array-items). + */ +export type ElementType> = + ContainerType extends Iterable ? ElementType : never; + +export type StrictOmit = Omit; + +/** + * Make selected keys optional. + */ +export type IPartialSome = Omit & + Pick, Key>; + +/** + * Make selected key required. + */ +export type IRequiredSome = Omit & + Pick, Key>; diff --git a/client/src/lib/urls/account.ts b/client/src/lib/urls/account.ts new file mode 100644 index 0000000..2651147 --- /dev/null +++ b/client/src/lib/urls/account.ts @@ -0,0 +1,94 @@ +import { InternalURL } from "./internal-url"; + +export function createAccountPageURL() { + const path = "/account"; + + return new InternalURL(path); +} + +export function createModeratorPageURL() { + const path = `/account/moderator`; + + return new InternalURL(path); +} + +export function createAdministratorPageURL() { + const path = `/account/administrator`; + + return new InternalURL(path); +} + +export function createAccountNotificationsPageURL() { + const path = `/account/notifications`; + + return new InternalURL(path); +} + +export function createAccountImportKeysPageURL() { + const path = `/account/keys`; + + return new InternalURL(path); +} + +export function createAccountDMsReviewPageURL(status?: string) { + const path = `/account/review_dms`; + const params = new URLSearchParams(); + + if (status) { + params.set("status", status); + } + + return new InternalURL(path, params); +} + +export function createAccountPasswordChangePageURL() { + const path = `/account/change_password`; + + return new InternalURL(path); +} + +export function createAccountFavoriteProfilesPageURL( + offset?: number, + sortBy?: string, + order?: string +) { + const path = "/account/favorites/artists"; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + if (sortBy) { + params.set("sort_by", sortBy); + } + + if (order) { + params.set("order", order); + } + + return new InternalURL(path, params); +} + +export function createAccountFavoritePostsPageURL( + offset?: number, + sortBy?: string, + order?: string +) { + const path = "/account/favorites/posts"; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + if (sortBy) { + params.set("sort_by", sortBy); + } + + if (order) { + params.set("order", order); + } + + return new InternalURL(path, params); +} diff --git a/client/src/lib/urls/administrator.ts b/client/src/lib/urls/administrator.ts new file mode 100644 index 0000000..894be06 --- /dev/null +++ b/client/src/lib/urls/administrator.ts @@ -0,0 +1,29 @@ +import { IAccount } from "#entities/account"; +import { InternalURL } from "./internal-url"; + +export function createAccountsPageURL( + page?: number, + name?: string, + role?: string +) { + const path = !page + ? `/account/administrator/accounts` + : `/account/administrator/accounts/${page}`; + const params = new URLSearchParams(); + + if (name) { + params.set("name", name); + } + + if (role) { + params.set("role", role); + } + + return new InternalURL(path, params); +} + +export function createAccountDetailsPageURL(id: IAccount["id"]) { + const path = `/account/administrator/account/${id}`; + + return new InternalURL(path); +} diff --git a/client/src/lib/urls/artists.ts b/client/src/lib/urls/artists.ts new file mode 100644 index 0000000..e659358 --- /dev/null +++ b/client/src/lib/urls/artists.ts @@ -0,0 +1,45 @@ +import { InternalURL } from "./internal-url"; + +export function createArtistsPageURL( + offset?: number, + query?: string, + service?: string, + sortBy?: string, + order?: string +): InternalURL { + const path = "/artists"; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + if (query) { + params.set("q", query); + } + + if (service) { + params.set("service", service); + } + + if (sortBy) { + params.set("sort_by", sortBy); + } + + if (order) { + params.set("order", order); + } + + return new InternalURL(path, params); +} + +export function createArtistsUpdatedPageURL(offset?: number): InternalURL { + const path = "/artists/updated"; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + return new InternalURL(path, params); +} diff --git a/client/src/lib/urls/authentication.ts b/client/src/lib/urls/authentication.ts new file mode 100644 index 0000000..2c5cdfc --- /dev/null +++ b/client/src/lib/urls/authentication.ts @@ -0,0 +1,21 @@ +import { InternalURL } from "./internal-url"; + +export function createRegistrationPageURL(location: string) { + const path = `/authentication/register`; + const params = new URLSearchParams([["location", location]]); + + return new InternalURL(path, params); +} + +export function createLoginPageURL(location: string) { + const path = `/authentication/login`; + const params = new URLSearchParams([["location", location]]); + + return new InternalURL(path, params); +} + +export function createLogoutPageURL() { + const path = `/authentication/logout`; + + return new InternalURL(path); +} diff --git a/client/src/lib/urls/dms.ts b/client/src/lib/urls/dms.ts new file mode 100644 index 0000000..78e5e10 --- /dev/null +++ b/client/src/lib/urls/dms.ts @@ -0,0 +1,16 @@ +import { InternalURL } from "./internal-url"; + +export function createDMsPageURL(offset?: number, query?: string) { + const path = "/dms"; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + if (query) { + params.set("q", String(query)); + } + + return new InternalURL(path, params); +} diff --git a/client/src/lib/urls/documentation.ts b/client/src/lib/urls/documentation.ts new file mode 100644 index 0000000..d758e8b --- /dev/null +++ b/client/src/lib/urls/documentation.ts @@ -0,0 +1,7 @@ +import { InternalURL } from "./internal-url"; + +export function createAPIDocumentationPageURL() { + const path = `/documentation/api`; + + return new InternalURL(path); +} diff --git a/client/src/lib/urls/files.ts b/client/src/lib/urls/files.ts new file mode 100644 index 0000000..1137da3 --- /dev/null +++ b/client/src/lib/urls/files.ts @@ -0,0 +1,35 @@ +import { InternalURL } from "./internal-url"; + +export function createFileURL(hash: string, extension: string) { + const path = `/${hash.slice(0, 2)}/${hash.slice(2, 4)}/${hash}.${extension}`; + + return new InternalURL(path); +} + +export function createThumbnailURL(filePath: string) { + const path = `/thumbnail/data${filePath}`; + + return new InternalURL(path); +} + +export function createFilePageURL(fileHash: string) { + const path = `/file/${fileHash}`; + + return new InternalURL(path); +} + +export function createArchiveFileURL( + archiveHash: string, + archiveExtension: string, + fileName: string, + password?: string +) { + const path = `/archive_files/${archiveHash}${archiveExtension}`; + const params = new URLSearchParams([["file_name", fileName]]); + + if (password) { + params.set("password", password); + } + + return new InternalURL(path, params); +} diff --git a/client/src/lib/urls/importer.ts b/client/src/lib/urls/importer.ts new file mode 100644 index 0000000..3ad1514 --- /dev/null +++ b/client/src/lib/urls/importer.ts @@ -0,0 +1,7 @@ +import { InternalURL } from "./internal-url"; + +export function createImporterStatusPageURL(importID: string) { + const path = `/importer/status/${importID}`; + + return new InternalURL(path); +} diff --git a/client/src/lib/urls/index.ts b/client/src/lib/urls/index.ts new file mode 100644 index 0000000..e66278f --- /dev/null +++ b/client/src/lib/urls/index.ts @@ -0,0 +1,58 @@ +export { createIconURL, createBannerURL } from "./kemono"; +export { + createProfilePageURL, + createProfileFancardsURL, + createProfileAnnouncementsURL, + createProfileTagsURL, + createProfileTagURL, + createProfileDMsURL, + createProfileSharesURL, + createProfileLinksURL, + createProfileNewLinksPageURL, + createProfilesSharesPageURL, + createDiscordChannelPageURL, + createDiscordServerPageURL, + createProfileTagsPageURL +} from "./profiles"; +export { createArtistsPageURL, createArtistsUpdatedPageURL } from "./artists"; +export { + createPostsPageURL, + createPostURL, + createPostRevisionPageURL, + createFileUploadPageURL, + createAttachmentURL, + createPreviewURL, + createPopularPostsPageURL, +} from "./posts"; +export { createTagPageURL } from "./tags"; +export { createSharePageURL, createSharesPageURL } from "./shares"; +export { createDMsPageURL } from "./dms"; +export { + createRegistrationPageURL, + createLoginPageURL, + createLogoutPageURL, +} from "./authentication"; +export { + createAccountPageURL, + createModeratorPageURL, + createAdministratorPageURL, + createAccountNotificationsPageURL, + createAccountImportKeysPageURL, + createAccountDMsReviewPageURL, + createAccountPasswordChangePageURL, + createAccountFavoriteProfilesPageURL, + createAccountFavoritePostsPageURL, +} from "./account"; +export { + createFileURL, + createThumbnailURL, + createFilePageURL, + createArchiveFileURL, +} from "./files"; +export { createImporterStatusPageURL } from "./importer"; +export { + createAccountsPageURL, + createAccountDetailsPageURL, +} from "./administrator"; +export { createProfileLinkRequestsPageURL } from "./moderator"; +export { createAPIDocumentationPageURL } from "./documentation"; diff --git a/client/src/lib/urls/internal-url.ts b/client/src/lib/urls/internal-url.ts new file mode 100644 index 0000000..c95d109 --- /dev/null +++ b/client/src/lib/urls/internal-url.ts @@ -0,0 +1,40 @@ +export class InternalURL extends URL { + constructor( + pathname: string, + searchParams?: URLSearchParams, + fragment?: string + ) { + // `URL` constructor requires a full origin + // to be present in either of arguments + // but in the context of DOM elements the relative URL is just fine + // so we are doing some gymnastics in order not to depend + // on browser context (does not exist on server) + // or an env variable (not needed if the origin is the same). + super(pathname, "https://example.com"); + + if (searchParams && searchParams.size !== 0) { + this.search = searchParams.toString(); + } + + if (fragment) { + this.hash = fragment; + } + } + + toString(): string { + const isParams = this.searchParams.size !== 0; + + if (isParams) { + this.searchParams.sort(); + } + + const params = !isParams ? "" : this.search; + const fragment = this.hash.slice(1).length === 0 ? "" : this.hash; + + return `${this.pathname}${params}${fragment}`; + } + + toJSON(): string { + return this.toString(); + } +} diff --git a/client/src/lib/urls/kemono.ts b/client/src/lib/urls/kemono.ts new file mode 100644 index 0000000..bab3423 --- /dev/null +++ b/client/src/lib/urls/kemono.ts @@ -0,0 +1,13 @@ +import { BANNERS_PREPEND, ICONS_PREPEND } from "#env/env-vars"; + +export function createIconURL(service: string, artistID: string) { + const path = `${ICONS_PREPEND}/icons/${service}/${artistID}`; + + return path; +} + +export function createBannerURL(service: string, artistID: string) { + const path = `${BANNERS_PREPEND}/banners/${service}/${artistID}`; + + return path; +} diff --git a/client/src/lib/urls/moderator.ts b/client/src/lib/urls/moderator.ts new file mode 100644 index 0000000..a148d57 --- /dev/null +++ b/client/src/lib/urls/moderator.ts @@ -0,0 +1,7 @@ +import { InternalURL } from "./internal-url"; + +export function createProfileLinkRequestsPageURL() { + const path = `/account/moderator/tasks/creator_links`; + + return new InternalURL(path); +} diff --git a/client/src/lib/urls/posts.ts b/client/src/lib/urls/posts.ts new file mode 100644 index 0000000..6bc367b --- /dev/null +++ b/client/src/lib/urls/posts.ts @@ -0,0 +1,113 @@ +import { IPopularPostsPeriod } from "#entities/posts"; +import { InternalURL } from "./internal-url"; + +export function createPostsPageURL( + offset?: number, + query?: string, + tags?: string[] +) { + const path = `posts`; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + if (query) { + params.set("q", query); + } + + if (tags) { + for (const tag of tags) { + params.set("tag", tag); + } + } + + return new InternalURL(path, params); +} + +export function createPostURL( + service: string, + profileID: string, + postID: string +) { + const path = `/${service}/user/${profileID}/post/${postID}`; + + return new InternalURL(path); +} + +export function createPostRevisionPageURL( + service: string, + profileID: string, + postID: string, + revisionID: string +) { + const path = `/${service}/user/${profileID}/post/${postID}/revision/${revisionID}`; + + return new InternalURL(path); +} + +export function createFileUploadPageURL(service: string, profileID: string) { + const path = "/posts/upload"; + const searchParams = new URLSearchParams([ + ["service", service], + ["user", profileID], + ]); + + return new InternalURL(path, searchParams); +} + +export function createAttachmentURL( + path: string, + name: string, + server?: string +) { + const pathname = `/data${path}`; + const params = new URLSearchParams([["f", name]]); + + if (server) { + const url = new URL(pathname, server); + url.search = String(params); + + return url; + } + + return new InternalURL(pathname, params); +} + +export function createPreviewURL(path: string, name: string, server?: string) { + const pathname = `/data${path}`; + const params = new URLSearchParams([["f", name]]); + + if (server) { + const url = new URL(pathname, server); + url.search = String(params); + + return url; + } + + return new InternalURL(pathname, params); +} + +export function createPopularPostsPageURL( + date?: string, + scale?: IPopularPostsPeriod, + offset?: number +) { + const path = `/posts/popular`; + const params = new URLSearchParams(); + + if (date) { + params.set("date", date); + } + + if (scale) { + params.set("period", scale); + } + + if (offset) { + params.set("o", String(offset)); + } + + return new InternalURL(path, params); +} diff --git a/client/src/lib/urls/profiles.ts b/client/src/lib/urls/profiles.ts new file mode 100644 index 0000000..b6c40ed --- /dev/null +++ b/client/src/lib/urls/profiles.ts @@ -0,0 +1,126 @@ +import { InternalURL } from "./internal-url"; + +interface ICreateProfileURLArg { + service: string; + profileID: string; + offset?: number; + query?: string; + tags?: string[]; +} + +export function createProfilePageURL({ + service, + profileID, + offset, + query, + tags, +}: ICreateProfileURLArg) { + const segment = service === "discord" ? "server" : "user"; + const path = `/${service}/${segment}/${profileID}`; + const searchParams = new URLSearchParams(); + + if (offset) { + searchParams.set("o", String(offset)); + } + + if (query) { + searchParams.set("q", query); + } + + if (tags) { + for (const tag of tags) { + searchParams.set("tag", tag); + } + } + + return new InternalURL(path, searchParams); +} + +export function createProfileFancardsURL(service: string, profileID: string) { + const path = `/${service}/user/${profileID}/fancards`; + + return new InternalURL(path); +} + +export function createProfileAnnouncementsURL( + service: string, + profileID: string +) { + return new InternalURL(`/${service}/user/${profileID}/announcements`); +} + +export function createProfileTagsURL(service: string, profileID: string) { + return new InternalURL(`/${service}/user/${profileID}/tags`); +} + +export function createProfileTagURL( + service: string, + profileID: string, + tag: string +) { + const path = `/${service}/user/${profileID}`; + const params = new URLSearchParams([["tag", tag]]); + + return new InternalURL(path, params); +} + +export function createProfileDMsURL(service: string, profileID: string) { + return new InternalURL(`/${service}/user/${profileID}/dms`); +} + +export function createProfileSharesURL(service: string, profileID: string) { + return new InternalURL(`/${service}/user/${profileID}/shares`); +} + +export function createProfileLinksURL(service: string, profileID: string) { + return new InternalURL(`/${service}/user/${profileID}/links`); +} + +export function createProfileNewLinksPageURL( + service: string, + profileID: string +) { + return new InternalURL(`/account/${service}/user/${profileID}/links/new`); +} + +export function createProfilesSharesPageURL( + service: string, + profileID: string, + offset?: number +) { + const path = `/${service}/user/${profileID}/shares`; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + return new InternalURL(path, params); +} + +export function createProfileTagsPageURL(service: string, profileID: string) { + const path = `/${service}/user/${profileID}/tags`; + + return new InternalURL(path) +} + +export function createDiscordServerPageURL(serverID: string) { + const path = `/discord/server/${serverID}`; + + return new InternalURL(path); +} + +export function createDiscordChannelPageURL( + serverID: string, + channelID: string, + offset?: number +) { + const path = `/discord/server/${serverID}/${channelID}`; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + return new InternalURL(path, params); +} diff --git a/client/src/lib/urls/shares.ts b/client/src/lib/urls/shares.ts new file mode 100644 index 0000000..5378fd6 --- /dev/null +++ b/client/src/lib/urls/shares.ts @@ -0,0 +1,21 @@ +import { IShare } from "#entities/files"; +import { InternalURL } from "./internal-url"; + +export function createSharesPageURL( + offset?: number +) { + const path = `/shares`; + const params = new URLSearchParams(); + + if (offset) { + params.set("o", String(offset)); + } + + return new InternalURL(path, params); +} + +export function createSharePageURL(shareID: IShare["id"]) { + const path = `/share/${shareID}`; + + return new InternalURL(path); +} diff --git a/client/src/lib/urls/tags.ts b/client/src/lib/urls/tags.ts new file mode 100644 index 0000000..d9d6992 --- /dev/null +++ b/client/src/lib/urls/tags.ts @@ -0,0 +1,8 @@ +import { InternalURL } from "./internal-url"; + +export function createTagPageURL(tag: string) { + const path = "/posts"; + const searchParams = new URLSearchParams([["tag", tag]]); + + return new InternalURL(path, searchParams); +} diff --git a/client/src/pages/2257.tsx b/client/src/pages/2257.tsx new file mode 100644 index 0000000..131b614 --- /dev/null +++ b/client/src/pages/2257.tsx @@ -0,0 +1,49 @@ +import { PageSkeleton } from "#components/pages"; + +export function Compliance2257Page() { + const title = "18 U.S.C. 2257 Compliance Statement"; + const heading = "18 U.S.C. 2257 Compliance Statement"; + + return ( + +

    + Kemono is not a producer (whether primary or secondary as defined in 18 + U.S.C. 2257) of any of the content found on this website. The website's + activities, with respect to such content, are limited to the + transmission, storage, retrieval, and/or hosting of content on behalf of + third party users. +

    + +

    + Please direct any requests you may have regarding 2257 records in + relation to any content found on Kemono directly to the respective + uploader, artist, or producer of said content. +

    + +

    + Kemono abides by the following procedures regarding uploaded content to + ensure compliance: +

    + +
      +
    • + Requiring all users to be over 18 years old to use the site, register + an account, or upload content. +
    • +
    • + Prohibiting the upload of any photographs or videos of any real person + who is or appears to be under the age of 18. +
    • +
    • + Moderating all uploaded content and expeditiously removing any content + found to be in violation of these policies. +
    • +
    + +

    + For further assistance, or for any questions regarding this notice, + please contact us. +

    +
    + ); +} diff --git a/client/src/pages/_index.js b/client/src/pages/_index.js deleted file mode 100644 index 76948bd..0000000 --- a/client/src/pages/_index.js +++ /dev/null @@ -1,43 +0,0 @@ -import { userPage } from "./user"; -import { viewLinkedAccountsPage } from "./artist/linked_accounts.js"; -import { newLinkedAccountPage } from "./artist/new_linked_account.js"; -import { changePasswordPage, registerPage } from "./account/_index.js"; -import { postPage } from "./post"; -import { importerPage } from "./importer_list"; -import { importerStatusPage } from "./importer_status"; -import { postsPage } from "./posts"; -import { artistsPage } from "./artists"; -import { updatedPage } from "./updated"; -import { uploadPage } from "./upload"; -import { searchHashPage } from "./search_hash"; -import { registerPaginatorKeybinds } from "@wp/components"; -import { reviewDMsPage } from "./review_dms/dms"; -import { creatorLinksPage } from "./account/moderator/creator_links"; - -export { adminPageScripts } from "./account/administrator/_index.js"; -export { moderatorPageScripts } from "./account/moderator/_index.js"; -/** - * The map of page names and their callbacks. - */ -export const globalPageScripts = new Map([ - ["user", [userPage]], - ["register", [registerPage]], - ["change-password", [changePasswordPage]], - ["linked-account", [viewLinkedAccountsPage]], - ["new-linked-account", [newLinkedAccountPage]], - ["post", [postPage]], - ["importer", [importerPage]], - ["importer-status", [importerStatusPage]], - ["posts", [postsPage]], - ["popular-posts", [postsPage]], - ["artists", [artistsPage]], - ["updated", [updatedPage]], - ["upload", [uploadPage]], - ["all-dms", [registerPaginatorKeybinds]], - ["favorites", [registerPaginatorKeybinds]], - ["file-hash-search", [searchHashPage]], - ["review-dms", [reviewDMsPage]], - // trying to load moderator scripts by initSections(moderatorPageScripts) breaks this pile of junk - // so it's going here instead - ["moderator-creator-links", [creatorLinksPage]], -]); diff --git a/client/src/pages/_index.scss b/client/src/pages/_index.scss index 76d2a0e..cf64db7 100644 --- a/client/src/pages/_index.scss +++ b/client/src/pages/_index.scss @@ -1,12 +1,9 @@ -@use "components"; @use "home"; @use "post"; -@use "artist"; -@use "user"; +@use "profile/index"; +@use "profile.scss"; @use "review_dms"; -@use "importer_status"; +@use "importer/importer_status.scss"; @use "posts"; -@use "favorites"; @use "account"; @use "upload"; -@use "tags"; diff --git a/client/src/pages/account/_index.js b/client/src/pages/account/_index.js deleted file mode 100644 index 43d0ac4..0000000 --- a/client/src/pages/account/_index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { registerPage } from "./register.js"; -export { changePasswordPage } from "./change_password.js"; diff --git a/client/src/pages/account/_index.scss b/client/src/pages/account/_index.scss index 78ca863..76df913 100644 --- a/client/src/pages/account/_index.scss +++ b/client/src/pages/account/_index.scss @@ -1,5 +1,5 @@ @use "home"; -@use "components"; @use "notifications"; @use "keys"; @use "moderator"; +@use "register"; diff --git a/client/src/pages/account/administrator/_index.js b/client/src/pages/account/administrator/_index.js deleted file mode 100644 index b892de3..0000000 --- a/client/src/pages/account/administrator/_index.js +++ /dev/null @@ -1,4 +0,0 @@ -/** - * @type {Map void>} - */ -export const adminPageScripts = new Map(); diff --git a/client/src/pages/account/administrator/_index.scss b/client/src/pages/account/administrator/_index.scss index 08e6287..240eaae 100644 --- a/client/src/pages/account/administrator/_index.scss +++ b/client/src/pages/account/administrator/_index.scss @@ -1,2 +1 @@ @use "accounts"; -@use "shell"; diff --git a/client/src/pages/account/administrator/account.module.scss b/client/src/pages/account/administrator/account.module.scss new file mode 100644 index 0000000..81ec887 --- /dev/null +++ b/client/src/pages/account/administrator/account.module.scss @@ -0,0 +1,6 @@ +@use "../../../css/config/variables/sass" as *; + +// TODO: nuke this declaration once page skeleton is a proper grid +.overview { + margin: 0 auto; +} diff --git a/client/src/pages/account/administrator/account.tsx b/client/src/pages/account/administrator/account.tsx new file mode 100644 index 0000000..62702b8 --- /dev/null +++ b/client/src/pages/account/administrator/account.tsx @@ -0,0 +1,102 @@ +import { + ActionFunctionArgs, + LoaderFunctionArgs, + redirect, + useLoaderData, +} from "react-router"; +import { createAccountDetailsPageURL } from "#lib/urls"; +import { + apiChangeTargetAccountRole, + apiFetchAccount, +} from "#api/account/administrator"; +import { + PageSkeleton, + validateAdministratorPageAction, + validateAdministratorPageLoader, +} from "#components/pages"; +import { IAccount, ensureAccountRole } from "#entities/account"; +import { AccountOverview } from "#entities/administrator"; + +import * as styles from "./account.module.scss"; + +interface IProps { + account: IAccount; +} + +export function AdministratorAccountOverviewPage() { + const { account } = useLoaderData() as IProps; + const title = "Account overview"; + const heading = "Account Overview"; + + return ( + + + + ); +} + +export async function loader(args: LoaderFunctionArgs) { + await validateAdministratorPageLoader(args); + + const { params } = args; + + const accountID = params.account_id?.trim(); + + if (!accountID) { + throw new Error("Account ID is required."); + } + + const parsedAccountID = Number(accountID); + + if (parsedAccountID === 0) { + throw new Error("Account ID must be positive."); + } + + const account = await apiFetchAccount(parsedAccountID); + + const props: IProps = { + account, + }; + + return props; +} + +export async function action(args: ActionFunctionArgs) { + try { + await validateAdministratorPageAction(args); + + const { params, request } = args; + + const accountID = params.account_id?.trim(); + + if (!accountID) { + throw new Error("Account ID is required."); + } + + const parsedAccountID = Number(accountID); + + if (parsedAccountID === 0) { + throw new Error("Account ID must be positive."); + } + + const data = await request.formData(); + + const role = (data.get("role") as string | null)?.trim(); + + if (!role) { + throw new Error("Role is required."); + } + + ensureAccountRole(role); + + const targetAccountID = await apiChangeTargetAccountRole( + parsedAccountID, + role + ); + const url = String(createAccountDetailsPageURL(targetAccountID)); + + return redirect(url); + } catch (error) { + return error; + } +} diff --git a/client/src/pages/account/administrator/account_files.html b/client/src/pages/account/administrator/account_files.html deleted file mode 100644 index f3ec702..0000000 --- a/client/src/pages/account/administrator/account_files.html +++ /dev/null @@ -1,20 +0,0 @@ -{% extends 'account/administrator/shell.html' %} - -{% block content %} - -{% endblock content %} diff --git a/client/src/pages/account/administrator/account_info.html b/client/src/pages/account/administrator/account_info.html deleted file mode 100644 index 3fccee2..0000000 --- a/client/src/pages/account/administrator/account_info.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends 'account/administrator/shell.html' %} - -{% from 'components/timestamp.html' import timestamp %} - -{% block content %} - -{% endblock content %} diff --git a/client/src/pages/account/administrator/accounts.html b/client/src/pages/account/administrator/accounts.html deleted file mode 100644 index 4043707..0000000 --- a/client/src/pages/account/administrator/accounts.html +++ /dev/null @@ -1,141 +0,0 @@ -{% extends 'account/administrator/shell.html' %} - -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/account.html' import account_card %} -{% from 'components/paginator_new.html' import paginator, paginator_controller %} - -{% block content %} -
    -
    -

    - Accounts -

    -
    -
    -
    - - -
    -
    - - -
    -
    - -
    -
    - -
    - {{ paginator('account-pages', request, props.pagination) }} - {% call card_list('legacy') %} - {% for account in props.accounts %} - {% if account.role == 'moderator' %} - - {% elif account.role == 'consumer'%} - - {% else %} - {% endif %} - {% else %} -

    No accounts found.

    - {% endfor %} - {% endcall %} - {# {{ paginator('account-pages', request, props.pagination) }} #} - {% if props.accounts | length %} -
    - -
    - {% endif %} -
    - {{ paginator_controller( - 'account-pages', - request, - props.pagination - ) }} -
    -{% endblock content %} diff --git a/client/src/pages/account/administrator/accounts.module.scss b/client/src/pages/account/administrator/accounts.module.scss new file mode 100644 index 0000000..3359c53 --- /dev/null +++ b/client/src/pages/account/administrator/accounts.module.scss @@ -0,0 +1,6 @@ +@use "../../../css/config/variables/sass" as *; + +.filter { + max-width: 360px; + margin: 0 auto; +} diff --git a/client/src/pages/account/administrator/accounts.scss b/client/src/pages/account/administrator/accounts.scss index 4fe69ef..2f1af67 100644 --- a/client/src/pages/account/administrator/accounts.scss +++ b/client/src/pages/account/administrator/accounts.scss @@ -1,4 +1,4 @@ -@use "../../../css/config/variables" as *; +@use "../../../css/config/variables/sass" as *; .site-section--admin-accounts { .account { @@ -54,6 +54,7 @@ transition-duration: var(--duration-global); transition-property: border-color; + // TODO: nuke this declaration after rewriting page-specific styles & .account-card { height: 100%; border-radius: 0; diff --git a/client/src/pages/account/administrator/accounts.tsx b/client/src/pages/account/administrator/accounts.tsx new file mode 100644 index 0000000..7749d29 --- /dev/null +++ b/client/src/pages/account/administrator/accounts.tsx @@ -0,0 +1,174 @@ +import { LoaderFunctionArgs, redirect, useLoaderData } from "react-router"; +import { + IPagination, + createPagination, + parsePageNumber, +} from "#lib/pagination"; +import { createAccountsPageURL } from "#lib/urls"; +import { apiCountAccounts, apiFetchAccounts } from "#api/account/administrator"; +import { FormRouter } from "#components/forms"; +import { Option } from "#components/forms/inputs"; +import { FormSectionSelect, FormSectionText } from "#components/forms/sections"; +import { Pagination, PaginationInfo } from "#components/pagination"; +import { CardList } from "#components/cards"; +import { + PageSkeleton, + validateAdministratorPageLoader, +} from "#components/pages"; +import { Details } from "#components/details"; +import { + AccountPreview, + IAccontRole, + IAccount, + accountRoles, + ensureAccountRole, +} from "#entities/account"; + +import * as styles from "./accounts.module.scss"; + +interface IProps { + name?: string; + role?: IAccontRole; + pagination: IPagination; + accounts: IAccount[]; +} + +export function AdministratorAccountsPage() { + const { name, role, pagination, accounts } = useLoaderData() as IProps; + const title = "Accounts"; + const heading = "Accounts"; + + return ( + +
    + "Search"} + > + + + + + {accountRoles.map((role) => ( + + ))} + + } + /> + +
    + + + + + {accounts.length === 0 ? ( +

    No accounts found.

    + ) : ( + accounts.map((account) => ( + + )) + )} +
    + + String(createAccountsPageURL(page, name, role))} + extraValues={{ name, role }} + /> +
    + ); +} + +export async function loader(args: LoaderFunctionArgs): Promise { + await validateAdministratorPageLoader(args); + + const { request, params } = args; + const searchParams = new URL(request.url).searchParams; + + const page = parsePageNumber(params.page?.trim()); + const name = searchParams.get("name")?.trim(); + + let role: undefined | IAccontRole; + { + const inputValue = searchParams.get("role")?.trim(); + + if (inputValue) { + ensureAccountRole(inputValue); + + role = inputValue; + } + } + + const totalCount = await apiCountAccounts(name, role); + + if (totalCount === 0) { + throw new Error("No accounts found."); + } + + const pagination = createPagination(totalCount, page); + const accounts = await apiFetchAccounts(pagination.current_page, name, role); + + return { + accounts, + pagination, + name, + role, + }; +} + +export async function baseLoader(args: LoaderFunctionArgs) { + await validateAdministratorPageLoader(args); + + const { request } = args; + const searchParams = new URL(request.url).searchParams; + + const name = searchParams.get("name")?.trim(); + + let page: number | undefined = undefined; + { + const inputValue = searchParams.get("page")?.trim(); + if (inputValue) { + page = parsePageNumber(inputValue); + } + } + + let role: undefined | IAccontRole; + { + const inputValue = searchParams.get("role")?.trim(); + + if (inputValue) { + ensureAccountRole(inputValue); + + role = inputValue; + } + } + + const totalCount = await apiCountAccounts(name, role); + + if (totalCount === 0) { + throw new Error("No accounts found."); + } + + const pagination = createPagination(totalCount, page); + const url = String( + createAccountsPageURL(pagination.current_page, name, role) + ); + + return redirect(url); +} diff --git a/client/src/pages/account/administrator/dashboard.html b/client/src/pages/account/administrator/dashboard.html deleted file mode 100644 index 7ba801e..0000000 --- a/client/src/pages/account/administrator/dashboard.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'account/administrator/shell.html' %} - -{% block content %} -
    -
    -

    - Admin dashboard -

    -
    - -
    -{% endblock content %} diff --git a/client/src/pages/account/administrator/dashboard.module.scss b/client/src/pages/account/administrator/dashboard.module.scss new file mode 100644 index 0000000..81ec887 --- /dev/null +++ b/client/src/pages/account/administrator/dashboard.module.scss @@ -0,0 +1,6 @@ +@use "../../../css/config/variables/sass" as *; + +// TODO: nuke this declaration once page skeleton is a proper grid +.overview { + margin: 0 auto; +} diff --git a/client/src/pages/account/administrator/dashboard.tsx b/client/src/pages/account/administrator/dashboard.tsx new file mode 100644 index 0000000..eaee974 --- /dev/null +++ b/client/src/pages/account/administrator/dashboard.tsx @@ -0,0 +1,28 @@ +import { createAccountsPageURL } from "#lib/urls"; +import { createAccountPageLoader, PageSkeleton } from "#components/pages"; +import { KemonoLink } from "#components/links"; +import { Overview, OverviewHeader } from "#components/overviews"; + +import * as styles from "./dashboard.module.scss"; + +export function AdministratorDashboardPage() { + return ( + + + + + + + + ); +} + +export const loader = createAccountPageLoader(); diff --git a/client/src/pages/account/administrator/mods_actions.html b/client/src/pages/account/administrator/mods_actions.html deleted file mode 100644 index 44a8f89..0000000 --- a/client/src/pages/account/administrator/mods_actions.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'account/administrator/shell.html' %} - -{% block content %} -
    -
    -

    - Moderator actions -

    -
    -
      - {% for action in props.actions %} -
    • action
    • - {% else %} -
    • No actions found
    • - {% endfor %} -
    -
    -{% endblock content %} diff --git a/client/src/pages/account/administrator/shell.html b/client/src/pages/account/administrator/shell.html deleted file mode 100644 index 8a8724f..0000000 --- a/client/src/pages/account/administrator/shell.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'components/shell.html' %} - -{# TODO: filter only admin entry #} -{% block bundler_output %} - <% for (const css in htmlWebpackPlugin.files.css) { %> - <% if (htmlWebpackPlugin.files.css[css].startsWith("/static/bundle/css/admin")) { %> - - <% } %> - <% } %> - <% for (const chunk in htmlWebpackPlugin.files.chunks) { %> - - <% } %> - <% for (const scriptPath in htmlWebpackPlugin.files.js) { %> - <% if (htmlWebpackPlugin.files.js[scriptPath].startsWith("/static/bundle/js/admin") || htmlWebpackPlugin.files.js[scriptPath].startsWith("/static/bundle/js/runtime") || htmlWebpackPlugin.files.js[scriptPath].startsWith("/static/bundle/js/vendors")) { %> - - <% } %> - <% } %> -{% endblock bundler_output %} diff --git a/client/src/pages/account/administrator/shell.scss b/client/src/pages/account/administrator/shell.scss deleted file mode 100644 index 0dc0330..0000000 --- a/client/src/pages/account/administrator/shell.scss +++ /dev/null @@ -1 +0,0 @@ -@use "../../components/shell"; diff --git a/client/src/pages/account/change_password.html b/client/src/pages/account/change_password.html deleted file mode 100644 index 5064837..0000000 --- a/client/src/pages/account/change_password.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "components/shell.html" %} - -{% block content %} - -{% endblock %} diff --git a/client/src/pages/account/change_password.js b/client/src/pages/account/change_password.js deleted file mode 100644 index 5119ac6..0000000 --- a/client/src/pages/account/change_password.js +++ /dev/null @@ -1,45 +0,0 @@ -export function changePasswordPage() { - let passwordInput = () => document.getElementById("current-password"); - let newPasswordInput = () => document.getElementById("new-password"); - let newPasswordConfirmationInput = () => document.getElementById("new-password-confirmation"); - let submitButton = () => document.getElementById("submit"); - - let passCharCount = () => document.getElementById("password-char-count"); - let newPassCharCount = () => document.getElementById("new-password-char-count"); - let passMatches = () => document.getElementById("password-confirm-matches"); - - function doValidate(e) { - let password = passwordInput().value; - let newPassword = newPasswordInput().value; - let newPasswordConfirmation = newPasswordConfirmationInput().value; - let errors = false; - - if (password.length < 5) { - errors = true; - passCharCount().classList.add("invalid"); - } else { - passCharCount().classList.remove("invalid"); - } - - if (newPassword.length < 5) { - errors = true; - newPassCharCount().classList.add("invalid"); - } else { - newPassCharCount().classList.remove("invalid"); - } - - if (newPassword != newPasswordConfirmation || newPassword.length < 5) { - errors = true; - passMatches().classList.add("invalid"); - } else { - passMatches().classList.remove("invalid"); - } - - submitButton().disabled = errors; - } - - doValidate(); - passwordInput().addEventListener("input", doValidate); - newPasswordInput().addEventListener("input", doValidate); - newPasswordConfirmationInput().addEventListener("input", doValidate); -} diff --git a/client/src/pages/account/change_password.tsx b/client/src/pages/account/change_password.tsx new file mode 100644 index 0000000..d50fc21 --- /dev/null +++ b/client/src/pages/account/change_password.tsx @@ -0,0 +1,116 @@ +import { ActionFunctionArgs, redirect } from "react-router"; +import { createAccountPageURL } from "#lib/urls"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; +import { FormRouter } from "#components/forms"; +import { fetchAccountChangePassword } from "#api/account"; + +export function AccountChangePasswordPage() { + const title = "Change password"; + const heading = "Change Password"; + + return ( + + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    +
    +
    + ); +} + +export const loader = createAccountPageLoader(); + +export async function action({ request }: ActionFunctionArgs) { + try { + if (request.method !== "POST") { + throw new Error(`Unknown method "${request.method}".`); + } + + const data = await request.formData(); + + const currentPassword = data.get("current-password") as string | null; + + if (!currentPassword) { + throw new Error("Password cannot be empty."); + } + + const newPassword = (data.get("new-password") as string | null)?.trim(); + + if (!newPassword) { + throw new Error("New password cannot be empty."); + } + + if (newPassword.length < 5) { + throw new Error("New password must have at least 5 characters."); + } + + const newPasswordConfirmation = ( + data.get("new-password-confirmation") as string | null + )?.trim(); + + if (newPassword !== newPasswordConfirmation) { + throw new Error("New password and confirmation do not match."); + } + + await fetchAccountChangePassword( + currentPassword, + newPassword, + newPasswordConfirmation + ); + + return redirect(String(createAccountPageURL())); + } catch (error) { + return error; + } +} diff --git a/client/src/pages/account/components/notification.html b/client/src/pages/account/components/notification.html deleted file mode 100644 index 81aaf48..0000000 --- a/client/src/pages/account/components/notification.html +++ /dev/null @@ -1,20 +0,0 @@ -{% from 'components/timestamp.html' import timestamp %} - -{% macro ACCOUNT_ROLE_CHANGE(extra_info) %} - Your role was changed from {{ extra_info.old_role }} to {{ extra_info.new_role }}. -{% endmacro %} - -{% set notification_types = { - 1: ACCOUNT_ROLE_CHANGE -} %} - -{% macro notification_item(notification) %} -
  • - - {{ timestamp(notification.created_at) }} - - - {{ notification_types[notification.type](notification.extra_info) }} - -
  • -{% endmacro %} diff --git a/client/src/pages/account/components/service_key.html b/client/src/pages/account/components/service_key.html deleted file mode 100644 index 0c0d04a..0000000 --- a/client/src/pages/account/components/service_key.html +++ /dev/null @@ -1,50 +0,0 @@ -{% from 'components/cards/base.html' import card, card_header, card_body, card_footer %} -{% from 'components/timestamp.html' import timestamp %} - -{% macro service_key_card(service_key, import_ids, class_name= none) %} - {% set paysite = g.paysites[service_key.service] %} - - {% call card(class_name= class_name) %} - {% call card_header() %} -

    - {{ paysite.title }} -

    - {% endcall %} - - {% call card_body() %} -
    -
    -
    Status:
    - {% if not service_key.dead %} -
    - Alive -
    - {% else %} -
    - Dead -
    - {% endif %} -
    -
    - {% if import_ids %} -
    Logs
    - - {% endif %} -
    -
    - {% endcall %} - - {% call card_footer() %} -
    -
    -
    Added:
    -
    {{ timestamp(service_key.added) }}
    -
    -
    - {% endcall %} - {% endcall %} -{% endmacro %} diff --git a/client/src/pages/account/favorites/legacy.tsx b/client/src/pages/account/favorites/legacy.tsx new file mode 100644 index 0000000..dbb7231 --- /dev/null +++ b/client/src/pages/account/favorites/legacy.tsx @@ -0,0 +1,6 @@ +import { redirect } from "react-router"; +import { createAccountFavoriteProfilesPageURL } from "#lib/urls"; + +export async function loader() { + return redirect(String(createAccountFavoriteProfilesPageURL())); +} diff --git a/client/src/pages/account/favorites/posts.module.scss b/client/src/pages/account/favorites/posts.module.scss new file mode 100644 index 0000000..df694a8 --- /dev/null +++ b/client/src/pages/account/favorites/posts.module.scss @@ -0,0 +1,14 @@ +.dropdowns { + display: grid; + grid-template-columns: max-content max-content; + grid-gap: 5px; + justify-content: center; +} + +.label { + text-align: right; + + ::after { + content: ":"; + } +} diff --git a/client/src/pages/account/favorites/posts.tsx b/client/src/pages/account/favorites/posts.tsx new file mode 100644 index 0000000..68f8546 --- /dev/null +++ b/client/src/pages/account/favorites/posts.tsx @@ -0,0 +1,185 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { + createAccountFavoritePostsPageURL, + createAccountFavoriteProfilesPageURL, +} from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { HeaderAd, SliderAd } from "#components/advs"; +import { Paginator } from "#components/pagination"; +import { CardList, PostCard } from "#components/cards"; +import { FormRouter } from "#components/forms"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; +import { KemonoLink } from "#components/links"; +import { IFavouritePost, getAllFavouritePosts } from "#entities/account"; + +import * as styles from "./posts.module.scss"; + +type IProps = { + order?: IOrder; + count: number; + offset?: number; + sortBy?: ISortBy; + posts: IFavouritePost[]; +}; + +const sortByValues = ["faved_seq", "published"] as const; +const orderValues = ["asc", "desc"] as const; + +type ISortBy = (typeof sortByValues)[number]; +type IOrder = (typeof orderValues)[number]; + +function validateSortBy(input: unknown): asserts input is ISortBy { + if (!sortByValues.includes(input as ISortBy)) { + throw new Error(`Invalid sort by value "${input}".`); + } +} + +function validateOrder(input: unknown): asserts input is IOrder { + if (!orderValues.includes(input as IOrder)) { + throw new Error(`Invalid order value "${input}".`); + } +} + +/** + * TODO: split into separate pages + */ +export function FavoritePostsPage() { + const { sortBy, order, count, offset, posts } = useLoaderData() as IProps; + const title = "Favorite posts"; + const heading = "Favorite Posts"; + + return ( + + + + + <> + "Filter"} + > +

    + + Favorite Artists + +

    + {/* a filler div until proper form rewrite */} +
    + + + + + +
    + + <> +
    + + String(createAccountFavoritePostsPageURL(offset)) + } + /> +
    + + + {count === 0 ? ( + <> +

    Nobody here but us chickens!

    +

    There are no more posts.

    + + ) : ( + posts.map((post) => ( + + )) + )} +
    + +
    + + String(createAccountFavoritePostsPageURL(offset)) + } + /> +
    + + +
    + ); +} + +export const loader = createAccountPageLoader(async function loader({ + request, +}: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + let sortBy: IProps["sortBy"] = undefined; + { + const inputValue = searchParams.get("sort_by")?.trim(); + + if (inputValue) { + validateSortBy(inputValue); + + sortBy = inputValue; + } + } + + let offset: IProps["offset"] = undefined; + { + const inputValue = searchParams.get("o")?.trim(); + + if (inputValue) { + offset = parseOffset(inputValue); + } + } + + let order: IProps["order"] = undefined; + { + const inputValue = searchParams.get("order")?.trim(); + + if (inputValue) { + validateOrder(inputValue); + + order = inputValue; + } + } + + const { count, posts } = await getAllFavouritePosts(offset, order, sortBy); + + return { + count, + posts, + offset, + order, + sortBy, + }; +}); diff --git a/client/src/pages/account/favorites/profiles.module.scss b/client/src/pages/account/favorites/profiles.module.scss new file mode 100644 index 0000000..df694a8 --- /dev/null +++ b/client/src/pages/account/favorites/profiles.module.scss @@ -0,0 +1,14 @@ +.dropdowns { + display: grid; + grid-template-columns: max-content max-content; + grid-gap: 5px; + justify-content: center; +} + +.label { + text-align: right; + + ::after { + content: ":"; + } +} diff --git a/client/src/pages/account/favorites/profiles.tsx b/client/src/pages/account/favorites/profiles.tsx new file mode 100644 index 0000000..240a328 --- /dev/null +++ b/client/src/pages/account/favorites/profiles.tsx @@ -0,0 +1,190 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { + createAccountFavoritePostsPageURL, + createAccountFavoriteProfilesPageURL, +} from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { HeaderAd, SliderAd } from "#components/advs"; +import { Paginator } from "#components/pagination"; +import { CardList, ArtistCard } from "#components/cards"; +import { FormRouter } from "#components/forms"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; +import { KemonoLink } from "#components/links"; +import { IFavouriteArtist, getAllFavouriteProfiles } from "#entities/account"; + +import * as styles from "./profiles.module.scss"; + +interface IProps { + order?: IOrder; + count: number; + offset?: number; + sortBy?: ISortBy; + profiles: IFavouriteArtist[]; +} + +const sortByValues = ["updated", "faved_seq", "last_imported"] as const; +const orderValues = ["asc", "desc"] as const; +type ISortBy = (typeof sortByValues)[number]; +type IOrder = (typeof orderValues)[number]; + +function validateSortBy(input: unknown): asserts input is ISortBy { + if (!sortByValues.includes(input as ISortBy)) { + throw new Error(`Invalid sort by value "${input}".`); + } +} + +function validateOrder(input: unknown): asserts input is IOrder { + if (!orderValues.includes(input as IOrder)) { + throw new Error(`Invalid order value "${input}".`); + } +} + +export function FavoriteProfilesPage() { + const { sortBy, order, count, offset, profiles } = useLoaderData() as IProps; + const title = "Favorite profiles"; + const heading = "Favorite Profiles"; + + return ( + + + + + "Filter"} + > +

    + + Favorite Posts + +

    + {/* a filler div until proper form rewrite */} +
    + + + + + +
    + +
    + + String(createAccountFavoriteProfilesPageURL(offset, sortBy, order)) + } + /> +
    + + + {count === 0 ? ( + <> +

    Nobody here but us chickens!

    +

    There are no profiles.

    + + ) : ( + profiles.map((profile) => ( + + )) + )} +
    + +
    + + String(createAccountFavoriteProfilesPageURL(offset, sortBy, order)) + } + /> +
    +
    + ); +} + +export const loader = createAccountPageLoader(async function loader({ + request, +}: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + let sortBy: IProps["sortBy"] = undefined; + { + const inputValue = searchParams.get("sort_by")?.trim(); + + if (inputValue) { + validateSortBy(inputValue); + + sortBy = inputValue; + } + } + + let offset: IProps["offset"] = undefined; + { + const inputValue = searchParams.get("o")?.trim(); + + if (inputValue) { + offset = parseOffset(inputValue); + } + } + + let order: IProps["order"] = undefined; + { + const inputValue = searchParams.get("order")?.trim(); + + if (inputValue) { + validateOrder(inputValue); + + order = inputValue; + } + } + + const { count, profiles } = await getAllFavouriteProfiles( + offset, + order, + sortBy + ); + + return { + count, + profiles, + offset, + order, + sortBy, + }; +}); diff --git a/client/src/pages/account/home.html b/client/src/pages/account/home.html deleted file mode 100644 index ab65f36..0000000 --- a/client/src/pages/account/home.html +++ /dev/null @@ -1,80 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/image_link.html' import image_link %} - -{% from 'components/timestamp.html' import timestamp %} -{% from 'components/links.html' import kemono_link %} - -{% set role_links = { - "consumer": "/account", - "moderator": "/account/moderator", - "administrator": "/account/administrator" -} %} - -{% block title %} - {{ props.title }} -{% endblock title %} - -{% block content %} - -{% endblock content %} diff --git a/client/src/pages/account/home.scss b/client/src/pages/account/home.scss index 627badb..b879c68 100644 --- a/client/src/pages/account/home.scss +++ b/client/src/pages/account/home.scss @@ -33,3 +33,8 @@ } } } + +.site-section--home { + display: flex; + flex-direction: column; +} diff --git a/client/src/pages/account/home.tsx b/client/src/pages/account/home.tsx new file mode 100644 index 0000000..1559bf9 --- /dev/null +++ b/client/src/pages/account/home.tsx @@ -0,0 +1,130 @@ +import { useLoaderData } from "react-router"; +import { + createAccountDMsReviewPageURL, + createAccountFavoritePostsPageURL, + createAccountFavoriteProfilesPageURL, + createAccountImportKeysPageURL, + createAccountNotificationsPageURL, + createAccountPageURL, + createAccountPasswordChangePageURL, + createAdministratorPageURL, + createModeratorPageURL, +} from "#lib/urls"; +import { fetchAccount } from "#api/account"; +import { IAccount } from "#entities/account"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; +import { KemonoLink } from "#components/links"; + +interface IProps { + account: IAccount; + notificationsCount: number; +} + +export function AccountPage() { + const { account, notificationsCount } = useLoaderData() as IProps; + const { role, username, created_at } = account; + const title = "Your account details"; + const heading = "Your Account Details"; + const roleURL = String( + role === "administrator" + ? createAdministratorPageURL() + : role == "moderator" + ? createModeratorPageURL() + : createAccountPageURL() + ); + + return ( + +
    +
    + + Hello, + {username} + + +
    + Joined {created_at} | + + + {role} + + +
    +
    + +
    + Favorites: +
      +
    • + + Profiles + +
    • +
    • + + Posts + +
    • +
    +
    + +

    + Notifications: + + + {notificationsCount} + + +

    + +

    + + Keys + +

    + +

    + + Review DMs + +

    + +

    + + Change password + +

    +
    +
    + ); +} + +export const loader = createAccountPageLoader( + async function loader(): Promise { + const { props } = await fetchAccount(); + const { account, currentPage, notifications_count, title } = props; + + return { + account, + notificationsCount: notifications_count, + }; + } +); diff --git a/client/src/pages/account/keys.html b/client/src/pages/account/keys.html deleted file mode 100644 index 8879a90..0000000 --- a/client/src/pages/account/keys.html +++ /dev/null @@ -1,53 +0,0 @@ -{% extends 'components/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'components/forms/base.html' import form %} -{% from 'components/forms/submit_button.html' import submit_button %} -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/no_results.html' import no_results %} -{% from 'account/components/service_key.html' import service_key_card %} - -{% set page_title = 'Manage saved keys | ' ~ g.site_name %} - -{% block title %} - - {{ page_title }} - -{% endblock title %} - -{% block content %} -{% call site.section('account-keys', 'Stored service keys') %} - {% call card_list() %} - {% for key in props.service_keys %} -
    - -
    - {{ service_key_card(key, import_ids[loop.index0], class_name="key__card") }} - -
    -
    - {% else %} - {{ no_results() }} - {% endfor %} - {% endcall %} - {% if props.service_keys %} - {% call form( - id= 'revoke-service-keys', - action = '/account/keys', - method= 'POST' - ) %} - {{ submit_button('Revoke selected keys') }} - {% endcall %} - {% endif %} -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/account/keys.scss b/client/src/pages/account/keys.scss index a6c4813..4ecb233 100644 --- a/client/src/pages/account/keys.scss +++ b/client/src/pages/account/keys.scss @@ -1,4 +1,4 @@ -@use "../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .site-section--account-keys { .key { diff --git a/client/src/pages/account/keys.tsx b/client/src/pages/account/keys.tsx new file mode 100644 index 0000000..7ade699 --- /dev/null +++ b/client/src/pages/account/keys.tsx @@ -0,0 +1,113 @@ +import { ActionFunctionArgs, redirect, useLoaderData } from "react-router"; +import { createAccountImportKeysPageURL } from "#lib/urls"; +import { + fetchAccountAutoImportKeys, + fetchRevokeAutoImportKeys, +} from "#api/account/auto-import-keys"; +import { IAutoImportKey } from "#entities/account"; +import { CardList, NoResults } from "#components/cards"; +import { FormRouter } from "#components/forms"; +import { + PageSkeleton, + createAccountPageLoader, + validateAccountPageAction, +} from "#components/pages"; +import { AutoImportKeyCard } from "#entities/account"; + +interface IProps { + autoImportKeys: IAutoImportKey[]; + importIDs: { import_id: string }[]; +} + +export function AccountAutoImportKeysPage() { + const { autoImportKeys, importIDs } = useLoaderData() as IProps; + const title = "Manage saved keys"; + const heading = "Stored service keys"; + const revokeFormID = "revoke-service-keys"; + + return ( + + + {autoImportKeys.length === 0 ? ( + + ) : ( + autoImportKeys.map((autoImportKey, index) => ( +
    + +
    + + +
    +
    + )) + )} +
    + + {autoImportKeys.length !== 0 && ( + <>Revoke selected keys} + /> + )} +
    + ); +} + +export const loader = createAccountPageLoader( + async function loader(): Promise { + const { props, import_ids } = await fetchAccountAutoImportKeys(); + const { service_keys } = props; + + return { + autoImportKeys: service_keys, + importIDs: import_ids, + }; + } +); + +export async function action(args: ActionFunctionArgs) { + try { + await validateAccountPageAction(args); + + const { request } = args; + + if (request.method !== "POST") { + throw new Error(`Unknown method "${request.method}".`); + } + + const data = await request.formData(); + + const idsForRevocation = (data.getAll("revoke") as string[]).map((id) => + parseInt(id, 10) + ); + + if (idsForRevocation.length === 0) { + throw new Error("At least one key must be selected for revocation."); + } + + await fetchRevokeAutoImportKeys(idsForRevocation); + + return redirect(String(createAccountImportKeysPageURL())); + } catch (error) { + return error; + } +} diff --git a/client/src/pages/account/login.html b/client/src/pages/account/login.html deleted file mode 100644 index 7208ba0..0000000 --- a/client/src/pages/account/login.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends 'components/shell.html' %} -{% block content %} - -{% endblock %} diff --git a/client/src/pages/account/login.tsx b/client/src/pages/account/login.tsx new file mode 100644 index 0000000..c532335 --- /dev/null +++ b/client/src/pages/account/login.tsx @@ -0,0 +1,95 @@ +import { + ActionFunctionArgs, + redirect, + useSearchParams, +} from "react-router"; +import { PageSkeleton } from "#components/pages"; +import { KemonoLink } from "#components/links"; +import { createArtistsPageURL, createRegistrationPageURL } from "#lib/urls"; +import { FormRouter, FormSection } from "#components/forms"; +import { loginAccount } from "#entities/account"; + +export function AccountLoginPage() { + const [searchParams] = useSearchParams(); + const title = "Login"; + const heading = "Login"; + const location = + searchParams.get("location")?.trim() ?? String(createArtistsPageURL()); + + return ( + +

    + Don't have an account?{" "} + + Register! + {" "} + Your favorites will automatically be saved. +

    + + "Login"} + > + + + + + + + + + + + + +
    + ); +} + +export async function action({ request }: ActionFunctionArgs) { + try { + if (request.method !== "POST") { + throw new Error(`Unknown method "${request.method}".`); + } + + const data = await request.formData(); + + const location = data.get("location") as string; + const username = data.get("username") as string | null; + { + if (!username) { + throw new Error(`Username is required.`); + } + } + + const password = data.get("password") as string | null; + { + if (!password) { + throw new Error(`Password is required.`); + } + } + + await loginAccount(username, password); + + return redirect(location); + } catch (error) { + return error; + } +} diff --git a/client/src/pages/account/moderator/_index.js b/client/src/pages/account/moderator/_index.js deleted file mode 100644 index 110ce34..0000000 --- a/client/src/pages/account/moderator/_index.js +++ /dev/null @@ -1,4 +0,0 @@ -/** - * @type {Map void} - */ -export const moderatorPageScripts = new Map(); diff --git a/client/src/pages/account/moderator/_index.scss b/client/src/pages/account/moderator/_index.scss index bf6869d..8df7a36 100644 --- a/client/src/pages/account/moderator/_index.scss +++ b/client/src/pages/account/moderator/_index.scss @@ -1,4 +1,4 @@ -@use "../../../css/config/variables" as *; +@use "../../../css/config/variables/sass" as *; .site-section--moderator-dashboard { margin-left: auto; diff --git a/client/src/pages/account/moderator/creator_links.html b/client/src/pages/account/moderator/creator_links.html deleted file mode 100644 index bba7bb0..0000000 --- a/client/src/pages/account/moderator/creator_links.html +++ /dev/null @@ -1,55 +0,0 @@ -{% extends "components/shell.html" %} - -{% block content %} - -{% endblock content %} diff --git a/client/src/pages/account/moderator/creator_links.js b/client/src/pages/account/moderator/creator_links.js deleted file mode 100644 index 9523cc3..0000000 --- a/client/src/pages/account/moderator/creator_links.js +++ /dev/null @@ -1,22 +0,0 @@ -export function creatorLinksPage() { - Array.from(document.querySelectorAll(".link-request-card")).forEach(card => { - card.querySelector(".control > .approve").addEventListener("click", async (_e) => { - await approveLinkRequest(card.dataset["id"]); - card.remove(); - }); - card.querySelector(".control > .reject").addEventListener("click", async (_e) => { - await rejectLinkRequest(card.dataset["id"]); - card.remove(); - }); - }) -} - -async function approveLinkRequest(requestId) { - let resp = await fetch(`/creator_link_requests/${requestId}/approve`, { method: "POST" }); - let json = await resp.json(); -} - -async function rejectLinkRequest(requestId) { - let resp = await fetch(`/creator_link_requests/${requestId}/reject`, { method: "POST" }); - let json = await resp.json(); -} diff --git a/client/src/pages/account/moderator/dashboard.html b/client/src/pages/account/moderator/dashboard.html deleted file mode 100644 index 36a7af4..0000000 --- a/client/src/pages/account/moderator/dashboard.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'components/shell.html' %} - -{% block content %} -
    -
    -

    - Moderator room -

    -
    - -
    -{% endblock content %} diff --git a/client/src/pages/account/moderator/dashboard.tsx b/client/src/pages/account/moderator/dashboard.tsx new file mode 100644 index 0000000..de761d9 --- /dev/null +++ b/client/src/pages/account/moderator/dashboard.tsx @@ -0,0 +1,23 @@ +import { createProfileLinkRequestsPageURL } from "#lib/urls"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; + +export function ModeratorDashboardPage() { + const title = "Moderator overview"; + const heading = "Moderator Overview"; + + return ( + + + + ); +} + +export const loader = createAccountPageLoader(); diff --git a/client/src/pages/account/moderator/files.html b/client/src/pages/account/moderator/files.html deleted file mode 100644 index a9baeea..0000000 --- a/client/src/pages/account/moderator/files.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'components/shell.html' %} - -{% block content %} -
    -
    -

    - Files for review -

    -
    -
    -{% endblock content %} diff --git a/client/src/pages/account/moderator/profile_links.tsx b/client/src/pages/account/moderator/profile_links.tsx new file mode 100644 index 0000000..2771128 --- /dev/null +++ b/client/src/pages/account/moderator/profile_links.tsx @@ -0,0 +1,140 @@ +import { + LoaderFunctionArgs, + useLoaderData, + useNavigate, +} from "react-router"; +import { + createProfileLinkRequestsPageURL, + createProfilePageURL, +} from "#lib/urls"; +import { + fetchApproveLinkRequest, + fetchProfileLinkRequests, + fetchRejectLinkRequest, +} from "#api/account/moderator"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; +import { IProfileLinkRequest } from "#entities/account"; +import { paysites } from "#entities/paysites"; + +interface IProps { + linkRequests: IProfileLinkRequest[]; +} + +export function ProfileLinkRequestsPage() { + const { linkRequests } = useLoaderData() as IProps; + const title = "Profile links requests"; + const heading = "Profile Links Requests"; + + return ( + +
    + {linkRequests.length === 0 ? ( +

    No pending requests. Yay!

    + ) : ( + linkRequests.map((linkRequest) => ( + + )) + )} +
    +
    + ); +} + +interface IProfileLinkRequestProps { + linkRequest: IProfileLinkRequest; +} + +function ProfileLinkRequest({ linkRequest }: IProfileLinkRequestProps) { + const navigate = useNavigate(); + const { id, requester, from_creator, to_creator, reason } = linkRequest; + const fromSite = paysites[from_creator.service]; + const toSite = paysites[to_creator.service]; + const fromURL = String( + createProfilePageURL({ + service: from_creator.service, + profileID: from_creator.id, + }) + ); + const toURL = String( + createProfilePageURL({ + service: to_creator.service, + profileID: to_creator.id, + }) + ); + + return ( + + ); +} + +export const loader = createAccountPageLoader( + async function loader({}: LoaderFunctionArgs): Promise { + const linkRequests = await fetchProfileLinkRequests(); + + return { linkRequests }; + } +); diff --git a/client/src/pages/account/notifications.html b/client/src/pages/account/notifications.html deleted file mode 100644 index bdab237..0000000 --- a/client/src/pages/account/notifications.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/timestamp.html' import timestamp %} -{% from 'account/components/notification.html' import notification_item %} - -{% block title %} - Account notificatons -{% endblock title %} - -{% block content %} - -{% endblock content %} diff --git a/client/src/pages/account/notifications.scss b/client/src/pages/account/notifications.scss index 6207a3f..31174e6 100644 --- a/client/src/pages/account/notifications.scss +++ b/client/src/pages/account/notifications.scss @@ -1,4 +1,4 @@ -@use "../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .site-section--account-notifications { .notifications { diff --git a/client/src/pages/account/notifications.tsx b/client/src/pages/account/notifications.tsx new file mode 100644 index 0000000..41697b2 --- /dev/null +++ b/client/src/pages/account/notifications.tsx @@ -0,0 +1,40 @@ +import { useLoaderData } from "react-router"; +import { fetchAccountNotifications } from "#api/account"; +import { INotification } from "#entities/account"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; +import { NotificationItem } from "#entities/account"; + +interface IProps { + notifications: INotification[]; +} + +export function AccountNotificationsPage() { + const { notifications } = useLoaderData() as IProps; + const title = "Account notificatons"; + const heading = "Notificatons"; + + return ( + +
      + {notifications.length === 0 ? ( +
    • There are no notifications.
    • + ) : ( + notifications.map((notification) => ( + + )) + )} +
    +
    + ); +} + +export const loader = createAccountPageLoader( + async function loader(): Promise { + const { notifications } = await fetchAccountNotifications(); + + return { notifications }; + } +); diff --git a/client/src/pages/account/register.html b/client/src/pages/account/register.html deleted file mode 100644 index 6b276ad..0000000 --- a/client/src/pages/account/register.html +++ /dev/null @@ -1,73 +0,0 @@ -{% extends 'components/shell.html' %} -{% block content %} - - -{% endblock %} diff --git a/client/src/pages/account/register.js b/client/src/pages/account/register.js deleted file mode 100644 index 0ee8c7c..0000000 --- a/client/src/pages/account/register.js +++ /dev/null @@ -1,96 +0,0 @@ -import "./register.scss"; - -/** - * @param {HTMLElement} section - */ -export function registerPage(section) { - populate_favorites(); - input_validation(); -} - -function populate_favorites() { - var input = document.getElementById("serialized-favorites"); - var favorites = localStorage.getItem("favorites"); - var to_serialize = []; - if (input && favorites) { - var artists = favorites.split(","); - artists.forEach(function (artist) { - var split = artist.split(":"); - if (split.length != 2) { - return; - } - var elem = { - service: split[0], - artist_id: split[1], - }; - to_serialize.push(elem); - }); - var serialized = JSON.stringify(to_serialize); - input.value = serialized; - } -} - - -function input_validation() { - const USERNAME_INPUT = () => document.getElementById("new-username"); - const PASSWORD_INPUT = () => document.getElementById("new-password"); - const PASSWORD_CONFIRM_INPUT = () => document.getElementById("password-confirm"); - const SUBMIT_BUTTON = () => document.getElementById("submit"); - - const USER_CHAR_COUNT = () => document.getElementById("username-char-count"); - const ALLOWED_CHARS = () => document.getElementById("username-allowed-characters"); - const PASS_CHAR_COUNT = () => document.getElementById("password-char-count"); - const PASSWORD_CONFIRM = () => document.getElementById("password-confirm-matches"); - - const USERNAME_PAT = new RegExp("^" + document.getElementById("register_form").dataset["pattern"] + "$"); - const NOT_ALLOWED_CHARS_PAT = new RegExp(`[^a-z0-9_@+.\-]`, 'g'); - - function validateInputs(e) { - let errors = false; - let username = USERNAME_INPUT().value; - let password = PASSWORD_INPUT().value; - let passwordConfirmation = PASSWORD_CONFIRM_INPUT().value; - - if (username.length < 3 || username.length > 15) { - errors = true; - USER_CHAR_COUNT().classList.add("invalid"); - } else { - USER_CHAR_COUNT().classList.remove("invalid"); - } - - if (!username.match(USERNAME_PAT)) { - errors = true; - ALLOWED_CHARS().classList.add("invalid"); - } else { - ALLOWED_CHARS().classList.remove("invalid"); - } - - if (password.length < 5) { - errors = true; - PASS_CHAR_COUNT().classList.add("invalid"); - } else { - PASS_CHAR_COUNT().classList.remove("invalid"); - } - - if (passwordConfirmation !== password || passwordConfirmation === "") { - errors = true; - PASSWORD_CONFIRM().classList.add("invalid"); - } else { - PASSWORD_CONFIRM().classList.remove("invalid"); - } - - SUBMIT_BUTTON().disabled = errors; - } - - window.addEventListener("load", (_event) => { - USERNAME_INPUT().textContent = USERNAME_INPUT().textContent.toLowerCase().replace(NOT_ALLOWED_CHARS_PAT, ""); - validateInputs(); - USERNAME_INPUT().addEventListener("input", validateInputs); - USERNAME_INPUT().addEventListener("input", (input) => { - input.target.value = input.target.value.toLowerCase().replace(NOT_ALLOWED_CHARS_PAT, ""); - }); - PASSWORD_INPUT().addEventListener("input", validateInputs); - PASSWORD_CONFIRM_INPUT().addEventListener("input", validateInputs); - }); - -} diff --git a/client/src/pages/account/register.tsx b/client/src/pages/account/register.tsx new file mode 100644 index 0000000..86ee5f4 --- /dev/null +++ b/client/src/pages/account/register.tsx @@ -0,0 +1,185 @@ +import { + ActionFunctionArgs, + redirect, + useSearchParams, +} from "react-router"; +import { createArtistsPageURL, createLoginPageURL } from "#lib/urls"; +import { getLocalStorageItem } from "#storage/local"; +import { KemonoLink } from "#components/links"; +import { PageSkeleton } from "#components/pages"; +import { FormRouter, FormSection } from "#components/forms"; +import { registerAccount } from "#entities/account"; + +const USERNAME_REGEX = /^[a-z0-9_@+.-]{3,15}$/; +const NOT_ALLOWED_CHARS_REGEX = /[^a-z0-9_@+.\-]/g; + +export function RegisterPage() { + const [searchParams] = useSearchParams(); + const title = "Register account"; + const heading = "Register Account"; + const location = + searchParams.get("location") ?? String(createArtistsPageURL()); + + return ( + +
    + Already have an account?{" "} + + Log in! + +
    + + "Register"} + > + + + + + + + + + + + + + + + + + + + + + + +
    + ); +} + +export async function action({ request }: ActionFunctionArgs) { + try { + if (request.method !== "POST") { + throw new Error(`Unknown method "${request.method}".`); + } + + const data = await request.formData(); + + const location = data.get("location") as string; + const favorites = getLegacyFavoriteProfiles(); + + let userName: string | undefined = undefined; + { + const inputValue = (data.get("username") as string | null) + ?.toLowerCase() + .replace(NOT_ALLOWED_CHARS_REGEX, "") + .trim(); + + if (!inputValue) { + throw new Error("Username is required."); + } + + if (inputValue.length < 3 || inputValue.length > 15) { + throw new Error( + "Username must be at least 3 characters and no more than 15 characters long." + ); + } + + if (!inputValue.match(USERNAME_REGEX)) { + throw new Error(`Username doesn't match pattern "${USERNAME_REGEX}".`); + } + + userName = inputValue; + } + + let password: string | undefined; + { + const inputValue = (data.get("password") as string | null)?.trim(); + + if (!inputValue) { + throw new Error("Password is required."); + } + + if (inputValue.length < 5) { + throw new Error("Password must have at least 5 characters."); + } + + password = inputValue; + } + + const confirmPassword = ( + data.get("confirm_password") as string | null + )?.trim(); + { + if (confirmPassword !== password) { + throw new Error("Passwords don't match."); + } + } + + await registerAccount(userName, password, confirmPassword, favorites); + + return redirect(location); + } catch (error) { + return error; + } +} + +function getLegacyFavoriteProfiles(): string | undefined { + const value = getLocalStorageItem("favorites"); + + if (!value) { + return; + } + + const favorites: { service: string; artist_id: string }[] = []; + const artists = value.split(","); + + for (const artist of artists) { + const split = artist.split(":"); + + if (split.length != 2) { + continue; + } + + const fav = { + service: split[0], + artist_id: split[1], + }; + + favorites.push(fav); + } + + if (favorites.length === 0) { + return; + } + + return JSON.stringify(favorites); +} diff --git a/client/src/pages/all_dms.html b/client/src/pages/all_dms.html deleted file mode 100644 index a5ca44b..0000000 --- a/client/src/pages/all_dms.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends 'components/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/dm.html' import dm_card %} -{% from 'components/ads.html' import slider_ad, header_ad %} - -{% block content %} -{% call site.section("all-dms", title="DMs") %} - {{ slider_ad() }} - {{ header_ad() }} -
    - {% include 'components/paginator.html' %} -
    - - -
    -
    - - {% call card_list("phone") %} - {% for dm in props.dms %} - {{ dm_card(dm, artist=dm|attr("artist") or {}, is_global=True) }} - {% else %} -
    -

    Nobody here but us chickens!

    -

    - There are no DMs. -

    -
    - {% endfor %} - {% endcall %} - -
    - {% include 'components/paginator.html' %} -
    -{% endcall %} -{% endblock %} diff --git a/client/src/pages/all_dms.scss b/client/src/pages/all_dms.scss index 2ef8f97..f18a71c 100644 --- a/client/src/pages/all_dms.scss +++ b/client/src/pages/all_dms.scss @@ -1,4 +1,4 @@ -@use "../css/config/variables" as *; +@use "../css/config/variables/sass" as *; .site-section--all-dms { .no-results { diff --git a/client/src/pages/all_dms.tsx b/client/src/pages/all_dms.tsx new file mode 100644 index 0000000..0e31044 --- /dev/null +++ b/client/src/pages/all_dms.tsx @@ -0,0 +1,154 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { createDMsPageURL } from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { fetchDMs } from "#api/dms"; +import { PageSkeleton } from "#components/pages"; +import { HeaderAd, SliderAd } from "#components/advs"; +import { Paginator } from "#components/pagination"; +import { CardList, DMCard } from "#components/cards"; +import { ButtonSubmit, FormRouter } from "#components/forms"; +import { IApprovedDM } from "#entities/dms"; +import { useRef, useState } from "react"; + +interface IProps { + query?: string; + count: number; + offset?: number; + dms: IApprovedDM[]; +} + +export function DMsPage() { + const { query, count, dms, offset } = useLoaderData() as IProps; + const [isLoading, setIsLoading] = useState(false); + const title = "DMs"; + const heading = "DMs"; + + return ( + + + + +
    + setIsLoading(loading)} + /> + String(createDMsPageURL(offset, query))} + /> +
    + + + {count === 0 ? ( +
    +

    + Nobody here but us chickens! +

    +

    There are no DMs.

    +
    + ) : ( + dms.map((dm) => ( + + )) + )} +
    + +
    + String(createDMsPageURL(offset, query))} + /> +
    +
    + ); +} + +interface ISearchFormProps + extends Pick { + onLoadingChange: (loading: boolean) => void; +} + +function SearchForm({ query, onLoadingChange }: ISearchFormProps) { + const timeoutRef = useRef(null); + + const onInputChange = (e: React.ChangeEvent) => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + + const target = e.currentTarget as HTMLInputElement; + + onLoadingChange(true); + + timeoutRef.current = setTimeout(() => { + if (target.form) target.form.requestSubmit(); + onLoadingChange(false); + }, 1000); + }; + + return ( + + {(state) => ( + <> +
    + + { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + onLoadingChange(false); + }} + > + + +
    + + )} +
    + ); +} + +export async function loader({ request }: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + let offset: number | undefined = undefined; + { + const inputOffset = searchParams.get("o")?.trim(); + if (inputOffset) { + offset = parseOffset(inputOffset); + } + } + + const query = searchParams.get("q")?.trim(); + + const { props } = await fetchDMs(offset, query); + const { count, dms } = props; + + return { + count, + offset, + query, + dms, + }; +} diff --git a/client/src/pages/artist/announcements.html b/client/src/pages/artist/announcements.html deleted file mode 100644 index 29a976f..0000000 --- a/client/src/pages/artist/announcements.html +++ /dev/null @@ -1,77 +0,0 @@ -{% extends "components/shell.html" %} - -{% from "components/headers.html" import user_header %} -{% from "components/card_list.html" import card_list %} -{% from "components/cards/dm.html" import dm_card %} - -{% set paysite = g.paysites[props.service] %} -{% set page_title = "Announcements of " ~ props.artist.name ~ " from " ~ paysite.title ~ " | " ~ g.site_name %} - -{% block title %} - {{ page_title }} -{% endblock %} - -{% block meta %} - - - - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} -
    - {{ user_header(request, props) }} -
    - {% include "components/tabs.html" %} -
    -{#
    #} -{# {% include "components/tabs.html" %}#} -{# {% include "components/paginator.html" %}#} -{##} -{#
    #} -{# #} -{# #} -{#
    #} - - {% call card_list("phone") %} - {% for announcement in props.announcements %} - {{ dm_card(announcement) }} - {% else %} -
    -

    Nobody here but us chickens!

    -

    - There are no Announcements for your query. -

    -
    - {% endfor %} - {% endcall %} - -{#
    #} -{# {% include "components/paginator.html" %}#} -{#
    #} -
    -{% endblock content %} - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} \ No newline at end of file diff --git a/client/src/pages/artist/dms.html b/client/src/pages/artist/dms.html deleted file mode 100644 index f247812..0000000 --- a/client/src/pages/artist/dms.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/cards/dm.html' import dm_card %} -{% from 'components/headers.html' import user_header %} -{% from 'components/card_list.html' import card_list %} - -{% set paysite = g.paysites[props.service] %} -{% set page_title = 'DMs of ' ~ props.artist.name ~ ' from ' ~ paysite.title ~ ' | ' ~ g.site_name %} - -{% block title %} - {{ page_title }} -{% endblock title %} - -{% block meta %} - - - - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} -
    - {{ user_header(request, props) }} -
    - {% include "components/tabs.html" %} -
    - {% call card_list("phone") %} - {% for dm in props.dms %} - {{ dm_card(dm, artist=dm|attr("artist") or {}) }} - {% else %} -
    -

    Nobody here but us chickens!

    -

    - There are no DMs for your query. -

    -
    - {% endfor %} - {% endcall %} -
    -{% endblock content %} - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} diff --git a/client/src/pages/artist/fancards.html b/client/src/pages/artist/fancards.html deleted file mode 100644 index cd5f5fe..0000000 --- a/client/src/pages/artist/fancards.html +++ /dev/null @@ -1,64 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/headers.html' import user_header %} - -{% set page_title = 'Fancards of ' ~ artist.name ~ ' | ' ~ g.site_name %} - -{% block title %} - {{ page_title }} -{% endblock title %} - -{% block meta %} - - - - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} -
    - {{ user_header(request, props) }} -
    - {% include 'components/tabs.html' %} -
    -
    - {% for fancard in fancards %} -
    - Added {{ (fancard.added|simple_date)[:7] }} - - - -
    - {% else %} -
    -

    Nobody here but us chickens!

    -

    - There are no uploads for your query. -

    -
    - {% endfor %} -
    -
    -{% endblock content %} - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} \ No newline at end of file diff --git a/client/src/pages/artist/linked_accounts.html b/client/src/pages/artist/linked_accounts.html deleted file mode 100644 index 08e5aae..0000000 --- a/client/src/pages/artist/linked_accounts.html +++ /dev/null @@ -1,58 +0,0 @@ -{% extends "components/shell.html" %} - -{% from "components/card_list.html" import card_list %} -{% from "components/headers.html" import user_header %} -{% from "components/cards/user.html" import user_card %} - -{% set paysite = g.paysites[props.service] %} -{% set page_title = "Linked accounts for " ~ props.artist.name ~ " on " ~ paysite.title ~ " | " ~ g.site_name %} - -{% block title %} - {{ page_title }} -{% endblock %} - -{% block meta %} - - - - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} - -{% endblock %} - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} \ No newline at end of file diff --git a/client/src/pages/artist/linked_accounts.js b/client/src/pages/artist/linked_accounts.js deleted file mode 100644 index 7cc1f31..0000000 --- a/client/src/pages/artist/linked_accounts.js +++ /dev/null @@ -1,32 +0,0 @@ -export function viewLinkedAccountsPage() { - if (localStorage.getItem("role") !== "administrator") return; - - window.addEventListener("DOMContentLoaded", (_e) => { - Array.from(document.querySelectorAll(".user-card")).forEach(card => { - let btn = document.createElement("button"); - btn.textContent = "✗"; - btn.classList = "remove-link"; - btn.addEventListener("click", async (e) => { - // apparently it only actually stops if you use both: - e.preventDefault(); - e.stopPropagation(); - - let id = card.dataset["id"]; - let service = card.dataset["service"]; - - if (confirm(`Delete the connection for user #${id} on ${service}?`)) { - if (await deleteLinkedAccount(service, id)) { - card.remove(); - } else { - alert("Error"); - } - } - }); - card.appendChild(btn); - }); - }); -} - -async function deleteLinkedAccount(service, id) { - return (await fetch(`/${service}/user/${id}/links`, { method: "DELETE" })).status == 204; -} diff --git a/client/src/pages/artist/new_linked_account.html b/client/src/pages/artist/new_linked_account.html deleted file mode 100644 index 6b1dfa0..0000000 --- a/client/src/pages/artist/new_linked_account.html +++ /dev/null @@ -1,84 +0,0 @@ -{% extends "components/shell.html" %} - -{% from "components/headers.html" import user_header %} - -{% set paysite = g.paysites[props.service] %} -{% set page_title = "Link a new account to " ~ props.artist.name ~ " on " ~ paysite.title ~ " | " ~ g.site_name %} - -{% block title %} - {{ page_title }} -{% endblock %} - -{% block meta %} - - - - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} - -{% endblock %} - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} diff --git a/client/src/pages/artist/new_linked_account.js b/client/src/pages/artist/new_linked_account.js deleted file mode 100644 index e7b1830..0000000 --- a/client/src/pages/artist/new_linked_account.js +++ /dev/null @@ -1,111 +0,0 @@ -import { debounce } from "../artists.js"; -import { kemonoAPI } from "@wp/api"; -import { freesites, paysites } from "@wp/utils"; -import { BANNERS_PREPEND, ICONS_PREPEND } from "@wp/env/env-vars"; - -/** - * @type {Array} - */ -let ALL_CREATORS; - -export function newLinkedAccountPage() { - document.getElementById("service").addEventListener("input", debounce(testUser, 300)) - document.getElementById("creator_name").addEventListener("input", debounce(testUser, 300)) - document.getElementById("reason").addEventListener("input", debounce(validateReason, 300)) - testUser(); -} - -function validateReason() { - let reason = document.getElementById("reason"); - - if (reason.value.length > 140) { - reason.title = "Too long (140 max)"; - reason.classList.add("invalid"); - } else { - reason.title = ""; - reason.classList.remove("invalid"); - } -} - -async function testUser() { - if (ALL_CREATORS === undefined) { - ALL_CREATORS = await kemonoAPI.api.creators(); - } - - const CURRENT_ARTIST_ID = document.querySelector("meta[name='id']").content; - const CURRENT_ARTIST_SERVICE = document.querySelector("meta[name='service']").content; - let service = document.getElementById("service").value; - let creatorName = document.getElementById("creator_name").value.toLowerCase(); - let button = document.getElementById("submit"); - let resultBox = document.getElementById("lookup-result"); - - button.disabled = true; - - let items = ALL_CREATORS.filter(item => { - console.log(item); - return !(item.service === CURRENT_ARTIST_SERVICE && item.id === CURRENT_ARTIST_ID) - && (creatorName? item.name.toLowerCase().includes(creatorName) : true) - && (service !== "all"? item.service === service : true); - }).slice(0, 20).map(createCard); - console.log(items); - resultBox.replaceChildren.apply(resultBox, items); -} - -function createCard({id, name, service, indexed, updated, favorited}) { - // would like to use initUserCardFromScratch here, but it doesn't work. - // why would components be reuseable, after all? - - // so I'll just recreate the entire function here! - let updatedDate; - - if (updated || indexed) { - updatedDate = new Date((updated || indexed) * 1000).toISOString(); - } - - let profileIcon = freesites.kemono.user.icon(service, id); - let profileBanner = freesites.kemono.user.banner(service, id); - - profileIcon = ICONS_PREPEND + profileIcon; - profileBanner = BANNERS_PREPEND + profileBanner; - - let div = document.createElement("div"); - div.innerHTML = ` - -
    -
    - - - - - -
    -
    - -
    -
    - ${paysites[service].title} -
    - -
    - ${name} -
    - -
    - -
    -
    -
    - `; - div.addEventListener("click", (e) => { - e.preventDefault(); - - Array.from(document.querySelectorAll(".user-card.selected")).forEach(item => item.classList.remove("selected")); - - div.children[0].classList.add("selected"); - document.querySelector("#new_link_form #creator").value = `${service}/${id}`; - document.querySelector("#new_link_form #submit").disabled = false; - }); - return div; -} diff --git a/client/src/pages/artist/shares.html b/client/src/pages/artist/shares.html deleted file mode 100644 index 8079e93..0000000 --- a/client/src/pages/artist/shares.html +++ /dev/null @@ -1,56 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/cards/share.html' import share_card %} -{% from 'components/headers.html' import user_header %} -{% from 'components/card_list.html' import card_list %} - -{% set paysite = g.paysites[props.service] %} -{% set page_title = 'DMs of ' ~ props.artist.name ~ ' from ' ~ paysite.title ~ ' | ' ~ g.site_name %} - -{% block title %} - {{ page_title }} -{% endblock title %} - -{% block meta %} - - - - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} -
    - {{ user_header(request, props) }} -
    - {% include 'components/tabs.html' %} -
    - {% call card_list() %} - {% for dm in results %} - {{ share_card(dm) }} - {% else %} -
    -

    Nobody here but us chickens!

    -

    - There are no uploads for your query. -

    -
    - {% endfor %} - {% endcall %} -
    -{% endblock content %} - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} diff --git a/client/src/pages/artist/tags.html b/client/src/pages/artist/tags.html deleted file mode 100644 index 0244815..0000000 --- a/client/src/pages/artist/tags.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends "components/shell.html" %} - -{% from "components/headers.html" import user_header %} -{% from "components/card_list.html" import card_list %} -{% from "components/cards/dm.html" import dm_card %} - -{% set paysite = g.paysites[props.service] %} -{% set page_title = "Announcements of " ~ props.artist.name ~ " from " ~ paysite.title ~ " | " ~ g.site_name %} - -{% block title %} - {{ page_title }} -{% endblock %} - -{% block meta %} - - - - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} -
    - {{ user_header(request, props) }} -
    - {% include "components/tabs.html" %} -
    -
    - {% for tag in tags %} - - {% else %} -
    -

    Nobody here but us chickens!

    -

    - There are no Announcements for your query. -

    -
    - {% endfor %} -
    -
    -{% endblock %} - - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} diff --git a/client/src/pages/artists.html b/client/src/pages/artists.html deleted file mode 100644 index bac121f..0000000 --- a/client/src/pages/artists.html +++ /dev/null @@ -1,101 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/image_link.html' import image_link %} -{% from 'components/fancy_image.html' import fancy_image %} -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/user.html' import user_card, user_card_header, user_card_skeleton %} -{% from 'components/ads.html' import slider_ad, header_ad, footer_ad %} - -{% block content %} - {{ slider_ad() }} -
    -
    - - Loading creators... please wait! - -
    -
    -
    - - - Leave blank to list all -
    -
    - - -
    -
    - - - -
    -
    - {% if props.display %} -
    -

    - Displaying {{ props.display }} -

    -
    - {% endif %} -
    - {% include 'components/paginator.html' %} -
    - {{ header_ad() }} - {% call card_list('phone') %} - {% for user in results %} - {{ user_card( - user, - is_updated=base.get('sort_by') == 'updated', - is_indexed=base.get('sort_by') == 'indexed', - is_count=base.get('sort_by') == 'favorited', - single_of='favorite', - plural_of='favorites' - ) }} - {% else %} -

    - No {{ g.artists_or_creators|lower }} found for your query. -

    - {% endfor %} - {% endcall %} -
    - {% include 'components/paginator.html' %} -
    - {{ footer_ad() }} -
    -{% endblock %} - -{% block components %} - {{ image_link("") }} - {{ fancy_image("") }} - {{ user_card_skeleton() }} -{% endblock components %} diff --git a/client/src/pages/artists.js b/client/src/pages/artists.js deleted file mode 100644 index c5c4a5e..0000000 --- a/client/src/pages/artists.js +++ /dev/null @@ -1,400 +0,0 @@ -import { kemonoAPI } from "@wp/api"; -import { CardList, registerPaginatorKeybinds, UserCard } from "@wp/components"; -import { isLoggedIn } from "@wp/js/account"; -import { findFavouriteArtist } from "@wp/js/favorites"; - -/** - * @type {KemonoAPI.User[]} - */ -let creators; -/** - * @type {KemonoAPI.User[]} - */ -let filteredCreators; -let skip = - parseInt( - window.location.hash - .substring(1) - .split("&") - .find((e) => e.split("=")[0] === "o") - ?.split("=")[1], - ) || 0; -let limit = 50; -const TOTAL_BUTTONS = 5; -const OPTIONAL_BUTTONS = TOTAL_BUTTONS - 2; -const MANDATORY_BUTTONS = TOTAL_BUTTONS - OPTIONAL_BUTTONS; - -// generic debounce function, idk jsdoc, figure it out :) -export function debounce(func, timeout = 300) { - let timer; - return (...args) => { - clearTimeout(timer); - timer = setTimeout(() => { - func.apply(this, args); - }, timeout); - }; -} - -/** - * @param {HTMLElement} section - */ -export async function artistsPage(section) { - /** - * @type {HTMLHeadingElement} - */ - const displayStatus = document.getElementById("display-status"); - /** - * @type {HTMLDivElement} - */ - const loadingStatus = document.getElementById("loading"); - /** - * @type {HTMLFormElement} - */ - const searchForm = document.forms["search-form"]; - /** - * @type {HTMLSelectElement} - */ - const orderSelect = searchForm.elements["order"]; - /** - * @type {HTMLSelectElement} - */ - const serviceSelect = searchForm.elements["service"]; - /** - * @type {HTMLSelectElement} - */ - const sortSelect = searchForm.elements["sort_by"]; - /** - * @type {HTMLInputElement} - */ - const queryInput = searchForm.elements["q"]; - /** - * @type {HTMLDivElement} - */ - const cardListElement = section.querySelector(".card-list"); - const { cardList, cardContainer } = CardList(cardListElement); - const pagination = { - top: document.getElementById("paginator-top"), - bottom: document.getElementById("paginator-bottom"), - }; - - Array.from(cardContainer.children).forEach(async (userCard) => { - const { id, service } = userCard.dataset; - const isFav = isLoggedIn && (await findFavouriteArtist(id, service)); - - if (isFav) { - userCard.classList.add("user-card--fav"); - } - }); - section.addEventListener("click", async (event) => { - /** - * @type {HTMLAnchorElement} - */ - const button = event.target; - const isB = button.parentElement.classList.contains("paginator-button-ident"); - if ( - (button.classList.contains("paginator-button-ident") && button.dataset && button.dataset.value) || - (isB && button.parentElement.dataset && button.parentElement.dataset.value) - ) { - event.preventDefault(); - skip = Number(isB ? button.parentElement.dataset.value : button.dataset.value); - window.location.hash = "o=" + skip; - filterCards(orderSelect.value, serviceSelect.value, sortSelect.value, queryInput.value); - await loadCards(displayStatus, cardContainer, pagination, sortSelect.value); - } - }); - - searchForm.addEventListener("submit", (event) => event.preventDefault()); - queryInput.addEventListener( - "change", - handleSearch(orderSelect, serviceSelect, sortSelect, queryInput, displayStatus, cardContainer, pagination), - ); - // 300 ms delay between each keystroke, trigger a new search on each new letter added or removed - // debounce lets you do this by waiting for the user to stop typing first - queryInput.addEventListener( - "keydown", - debounce( - handleSearch(orderSelect, serviceSelect, sortSelect, queryInput, displayStatus, cardContainer, pagination), - 300, - ), - ); - serviceSelect.addEventListener( - "change", - handleSearch(orderSelect, serviceSelect, sortSelect, queryInput, displayStatus, cardContainer, pagination), - ); - sortSelect.addEventListener( - "change", - handleSearch(orderSelect, serviceSelect, sortSelect, queryInput, displayStatus, cardContainer, pagination), - ); - orderSelect.addEventListener( - "change", - handleSearch(orderSelect, serviceSelect, sortSelect, queryInput, displayStatus, cardContainer, pagination), - ); - - await retrieveArtists(loadingStatus); - handleSearch(orderSelect, serviceSelect, sortSelect, queryInput, displayStatus, cardContainer, pagination)(null); - registerPaginatorKeybinds(); -} - -/** - * @param {HTMLSelectElement} orderSelect - * @param {HTMLSelectElement} serviceSelect - * @param {HTMLSelectElement} sortSelect - * @param {HTMLInputElement} queryInput - * @param {HTMLDivElement} displayStatus - * @param {HTMLDivElement} cardContainer - * @param {{ top: HTMLElement, bottom: HTMLElement }} pagination - * @return {(event: Event) => void} - */ -function handleSearch(orderSelect, serviceSelect, sortSelect, queryInput, displayStatus, cardContainer, pagination) { - return async (event) => { - filterCards(orderSelect.value, serviceSelect.value, sortSelect.value, queryInput.value); - await loadCards(displayStatus, cardContainer, pagination, sortSelect.value); - }; -} - -// localeCompare isn't slow itself, but this is still faster and we're processing a LOT of data here! -// better get any speed gains we can -function fastCompare(a, b) { - return a < b ? -1 : a > b ? 1 : 0; -} - -/** - * @param {string} order - * @param {string} service - * @param {string} sortBy - * @param {string} query - */ -function filterCards(order, service, sortBy, query) { - // fixme: creators is null/undefined sometimes - filteredCreators = creators.slice(0); - - if (order === "desc") { - filteredCreators.reverse(); - } - - filteredCreators = filteredCreators - .filter((creator) => creator.service === (service || creator.service)) - .sort((a, b) => { - if (order === "asc") { - return sortBy === "indexed" - ? a.parsedIndexed - b.parsedIndexed - : sortBy === "updated" - ? a.parsedUpdated - b.parsedUpdated - : fastCompare(a[sortBy], b[sortBy]); - } else { - return sortBy === "indexed" - ? b.parsedIndexed - a.parsedIndexed - : sortBy === "updated" - ? b.parsedUpdated - a.parsedUpdated - : fastCompare(b[sortBy], a[sortBy]); - } - }) - .filter((creator) => { - return creator.name.match(new RegExp(query.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"), "i")); - }); -} - -function _paginatorButton(content, skip, className = "") { - if (typeof skip === "string") { - className = skip; - skip = null; - } - if (typeof skip === "number") - return `${content}`; - return `
  • ${content}
  • `; -} - -function createPaginator() { - const count = filteredCreators.length; - - const currentCeilingOfRange = skip + limit < count ? skip + limit : count; - - const currPageNum = Math.ceil((skip + limit) / limit); - const totalPages = Math.ceil(count / limit); - const numBeforeCurrPage = - totalPages < TOTAL_BUTTONS || currPageNum < TOTAL_BUTTONS - ? currPageNum - 1 - : totalPages - currPageNum < TOTAL_BUTTONS - ? TOTAL_BUTTONS - 1 + (TOTAL_BUTTONS - (totalPages - currPageNum)) - : TOTAL_BUTTONS - 1; - const basePageNum = Math.max(currPageNum - numBeforeCurrPage - 1, 1); - const showFirstPostsButton = basePageNum > 1; - const showLastPostsButton = - totalPages - currPageNum > - TOTAL_BUTTONS + (currPageNum - basePageNum < TOTAL_BUTTONS ? TOTAL_BUTTONS - (currPageNum - basePageNum) : 0); - const optionalBeforeButtons = - currPageNum - - MANDATORY_BUTTONS - - (totalPages - currPageNum < MANDATORY_BUTTONS ? MANDATORY_BUTTONS - (totalPages - currPageNum) : 0); - const optionalAfterButtons = - currPageNum + - MANDATORY_BUTTONS + - (currPageNum - basePageNum < MANDATORY_BUTTONS ? MANDATORY_BUTTONS - (currPageNum - basePageNum) : 0); - - const range = createRange(0, TOTAL_BUTTONS * 2 + 1); - - const paginator = - count > limit - ? ` - Showing ${skip + 1} - ${currentCeilingOfRange} of ${count} - - - ${ - showFirstPostsButton || showLastPostsButton - ? showFirstPostsButton - ? _paginatorButton("<<", 0) - : _paginatorButton( - "<<", - `pagination-button-disabled${currPageNum - MANDATORY_BUTTONS - 1 ? " pagination-desktop" : ""}`, - ) - : `` - } - ${ - showFirstPostsButton - ? "" - : currPageNum - MANDATORY_BUTTONS - 1 - ? _paginatorButton("<<", 0, "pagination-mobile") - : totalPages - currPageNum > MANDATORY_BUTTONS && !showLastPostsButton - ? _paginatorButton("<<", "pagination-button-disabled pagination-mobile") - : "" - } - ${ - currPageNum > 1 - ? _paginatorButton("<", (currPageNum - 2) * limit, "prev") - : _paginatorButton("<", "pagination-button-disabled") - } - ${range - .map((page) => - page + basePageNum && page + basePageNum <= totalPages - ? _paginatorButton( - page + basePageNum, - page + basePageNum != currPageNum ? (page + basePageNum - 1) * limit : null, - (page + basePageNum < optionalBeforeButtons || page + basePageNum > optionalAfterButtons) && - page + basePageNum != currPageNum - ? "pagination-button-optional" - : page + basePageNum == currPageNum - ? "pagination-button-disabled pagination-button-current" - : page + basePageNum == currPageNum + 1 - ? "pagination-button-after-current" - : "", - ) - : "", - ) - .join("\n")} - ${ - currPageNum < totalPages - ? _paginatorButton(">", currPageNum * limit, "next") - : _paginatorButton(">", `pagination-button-disabled${totalPages ? " pagination-button-after-current" : ""}`) - } - ${ - showFirstPostsButton || showLastPostsButton - ? showLastPostsButton - ? _paginatorButton(">>", (totalPages - 1) * limit) - : _paginatorButton( - ">>", - `pagination-button-disabled${totalPages - currPageNum > MANDATORY_BUTTONS ? " pagination-desktop" : ""}`, - ) - : "" - } - ${ - showLastPostsButton - ? "" - : totalPages - currPageNum > MANDATORY_BUTTONS - ? _paginatorButton(">>", (totalPages - 1) * limit, "pagination-mobile") - : currPageNum > OPTIONAL_BUTTONS && !showFirstPostsButton - ? _paginatorButton(">>", "pagination-button-disabled pagination-mobile") - : "" - } - - ` - : ""; - - return paginator; -} - -/** - * @param {HTMLDivElement} displayStatus - * @param {HTMLDivElement} cardContainer - * @param {{ top: HTMLElement, bottom: HTMLElement }} pagination - * @param {String} sortBy - */ -async function loadCards(displayStatus, cardContainer, pagination, sortBy) { - displayStatus.textContent = "Displaying search results"; - pagination.top.innerHTML = createPaginator(); - pagination.bottom.innerHTML = createPaginator(); - /** - * @type {[ HTMLDivElement, HTMLElement ]} - */ - const [...cards] = cardContainer.children; - cards.forEach((card) => { - card.remove(); - }); - - if (filteredCreators.length === 0) { - const paragraph = document.createElement("p"); - - paragraph.classList.add("subtitle", "card-list__item--no-results"); - paragraph.textContent = "No artists found for your query."; - cardContainer.appendChild(paragraph); - return; - } else { - const fragment = document.createDocumentFragment(); - - for await (const user of filteredCreators.slice(skip, skip + limit)) { - const userIsCount = sortBy === "favorited"; - const userIsIndexed = sortBy === "indexed"; - const userIsUpdated = sortBy === "updated"; - const userCard = UserCard(null, user, userIsCount, userIsUpdated, userIsIndexed); - const isFaved = isLoggedIn && (await findFavouriteArtist(user.id, user.service)); - - if (isFaved) { - userCard.classList.add("user-card--fav"); - } - - fragment.appendChild(userCard); - } - - cardContainer.appendChild(fragment); - } -} - -/** - * @param {HTMLDivElement} loadingStatus - */ -async function retrieveArtists(loadingStatus) { - try { - const artists = await kemonoAPI.api.creators(); - - if (!artists) { - return null; - } - - for (const artist of artists) { - // preemptively do it here, it's taxing to parse a date string then convert it to a unix timestamp in milliseconds - // this way we only have to do it once after fetching and none for sorting - artist.parsedIndexed = artist.indexed * 1000; - artist.parsedUpdated = artist.updated * 1000; - artist.indexed = new Date(artist.parsedIndexed).toISOString(); - artist.updated = new Date(artist.parsedUpdated).toISOString(); - } - - loadingStatus.innerHTML = ""; - creators = artists; - filteredCreators = artists; - } catch (error) { - console.error(error); - } -} - -/** - * @param {number} start - * @param {number} end - */ -function createRange(start, end) { - const length = end - start; - const range = Array.from({ length }, (_, index) => start + index); - - return range; -} diff --git a/client/src/pages/authentication/logout.tsx b/client/src/pages/authentication/logout.tsx new file mode 100644 index 0000000..cc32aa2 --- /dev/null +++ b/client/src/pages/authentication/logout.tsx @@ -0,0 +1,9 @@ +import { redirect } from "react-router"; +import { createArtistsPageURL } from "#lib/urls"; +import { logoutAccount } from "#entities/account"; + +export async function loader() { + await logoutAccount(); + + return redirect(String(createArtistsPageURL())); +} diff --git a/client/src/pages/components/_index.js b/client/src/pages/components/_index.js deleted file mode 100644 index 5414576..0000000 --- a/client/src/pages/components/_index.js +++ /dev/null @@ -1,10 +0,0 @@ -export { LoadingIcon } from "./loading_icon"; -export { CardList } from "./card_list"; -export { PostCard, UserCard } from "./cards/_index.js"; -export { FancyImage } from "./fancy_image"; -export { FancyLink } from "./links"; -export { ImageLink } from "./image_link"; -export { showTooltip, registerMessage } from "./tooltip"; -export { initShell } from "./shell"; -export { Timestamp } from "./timestamp"; -export { registerPaginatorKeybinds } from "./paginator"; diff --git a/client/src/pages/components/_index.scss b/client/src/pages/components/_index.scss deleted file mode 100644 index 67a5821..0000000 --- a/client/src/pages/components/_index.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use "site"; -@use "fancy_image"; -@use "links"; -@use "timestamp"; -@use "card_list"; -@use "cards"; -@use "loading_icon"; -@use "buttons"; -@use "image_link"; -@use "shell"; -@use "tooltip"; -@use "paginator_new"; -@use "navigation"; -@use "lists"; -@use "importer_states"; -@use "file_hash_search"; diff --git a/client/src/pages/components/ads.html b/client/src/pages/components/ads.html deleted file mode 100644 index 50bfd5a..0000000 --- a/client/src/pages/components/ads.html +++ /dev/null @@ -1,29 +0,0 @@ -{% macro header_ad() %} - {% if g.header_ad %} -
    - {{ g.header_ad|safe }} -
    - {% endif %} -{% endmacro %} - -{% macro middle_ad() %} - {% if g.middle_ad %} -
    - {{ g.middle_ad|safe }} -
    - {% endif %} -{% endmacro %} - -{% macro footer_ad() %} - {% if g.footer_ad %} -
    - {{ g.footer_ad|safe }} -
    - {% endif %} -{% endmacro %} - -{% macro slider_ad() %} - {% if g.slider_ad %} - {{ g.slider_ad|safe }} - {% endif %} -{% endmacro %} diff --git a/client/src/pages/components/buttons.html b/client/src/pages/components/buttons.html deleted file mode 100644 index 38b758c..0000000 --- a/client/src/pages/components/buttons.html +++ /dev/null @@ -1,7 +0,0 @@ -{%- macro button(text, class_name=none, is_focusable=true) -%} - -{%- endmacro -%} diff --git a/client/src/pages/components/card_list.html b/client/src/pages/components/card_list.html deleted file mode 100644 index 1bc991c..0000000 --- a/client/src/pages/components/card_list.html +++ /dev/null @@ -1,11 +0,0 @@ -{% macro card_list(layout='legacy', class_name=none) %} -
    -
    -
    -
    - {{ caller() }} -
    -
    -{% endmacro %} diff --git a/client/src/pages/components/card_list.js b/client/src/pages/components/card_list.js deleted file mode 100644 index 10c2adb..0000000 --- a/client/src/pages/components/card_list.js +++ /dev/null @@ -1,116 +0,0 @@ -import { createComponent } from "@wp/js/component-factory"; - -/** - * TODO: layout switch button. - * @param {HTMLElement} element - * @param {string} layout - */ -export function CardList(element = null, layout = "feature") { - const cardList = element ? initFromElement(element) : initFromScratch(); - let currentLayout = layout; - - - let thumbSizeSetting = undefined; - try { - let cookies = getCookies(); - thumbSizeSetting = parseInt(cookies?.thumbSize); - thumbSizeSetting = isNaN(thumbSizeSetting) ? undefined : thumbSizeSetting; - } catch (e) { - return cardList; - } - if (!thumbSizeSetting){ - addCookie("thumbSize","180", 399) - } - - let defaultThumbSize = 180; - let thumbSize = parseInt(thumbSizeSetting) === parseInt(defaultThumbSize) ? undefined: thumbSizeSetting; - - let cardListEl = document.querySelector('.card-list__items'); - - if (cardListEl.parentNode.classList.contains("card-list--phone")){ - return cardList; - } - - window.addEventListener('resize', () => updateThumbsizes(cardListEl, defaultThumbSize, thumbSize)); - updateThumbsizes(cardListEl, defaultThumbSize, thumbSize) - - return cardList; -} - -/** - * @param {HTMLElement} element - */ -function initFromElement(element) { - /** - * @type {HTMLDivElement} - */ - const cardContainer = element.querySelector(".card-list__items"); - /** - * @type {NodeListOf} - */ - const itemListElements = element.querySelectorAll(".card-list__items > *"); - - return { - cardList: element, - cardContainer, - cardItems: Array.from(itemListElements), - }; -} - -function initFromScratch() { - /** - * @type {HTMLElement} - */ - const cardList = createComponent("card-list"); - /** - * @type {HTMLDivElement} - */ - const cardContainer = cardList?.querySelector(".card-list__items"); - /** - * @type {HTMLElement[]} - */ - const cardItems = []; - - return { - cardList, - cardContainer, - cardItems, - }; -} - - -function getCookies(){ - return document.cookie.split(';').reduce((cookies, cookie) => (cookies[cookie.split('=')[0].trim()] = decodeURIComponent(cookie.split('=')[1]), cookies), {}); -} - -function setCookie(name, value, daysToExpire) { - const date = new Date(); - date.setTime(date.getTime() + (daysToExpire * 24 * 60 * 60 * 1000)); - const expires = "expires=" + date.toUTCString(); - document.cookie = name + "=" + value + "; " + expires + ";path=/"; -} -function addCookie(name, newValue, daysToExpire) { - const existingCookie = document.cookie - .split(';') - .find(cookie => cookie.trim().startsWith(name + '=')); - - if (!existingCookie) { - setCookie(name, newValue, daysToExpire); - } -} -function updateThumbsizes(element, defaultSize, thumbSizeSetting){ - let thumbSize = thumbSizeSetting? thumbSizeSetting : defaultSize; - if (!thumbSizeSetting){ - let viewportWidth = window.innerWidth; - let offset = 24; - let viewportWidthExcludingMargin = viewportWidth - offset; - let howManyFit = viewportWidthExcludingMargin/thumbSize; - - if ( howManyFit < 2.0 && 1.5 < howManyFit) { - thumbSize = viewportWidthExcludingMargin / 2; - } else if( howManyFit > 12 ){ - thumbSize = defaultSize*1.5; - } - } - element.style.setProperty('--card-size', `${thumbSize}px`); -} \ No newline at end of file diff --git a/client/src/pages/components/cards/_index.js b/client/src/pages/components/cards/_index.js deleted file mode 100644 index 49f2aa1..0000000 --- a/client/src/pages/components/cards/_index.js +++ /dev/null @@ -1,151 +0,0 @@ -import { createComponent } from "@wp/js/component-factory"; -import { FancyImage, Timestamp } from "@wp/components"; -import { freesites, paysites } from "@wp/utils"; -import { BANNERS_PREPEND, ICONS_PREPEND } from "@wp/env/env-vars"; - -/** - * @param {HTMLElement} element - * @param {KemonoAPI.Post} post - */ -export function PostCard(element = null, post = {}) { - const postCard = element ? initFromElement(element) : initFromScratch(post); - - const view = postCard.postCardElement.querySelector(".post-card__view"); - - if (view) { - /** - * @type {HTMLButtonElement} - */ - const button = view.querySelector(".post-card__button"); - /** - * @type {HTMLAnchorElement} - */ - const link = postCard.postCardElement.querySelector(".post-card__link"); - - button.addEventListener("click", handlePostView(link)); - } - - return postCard; -} - -/** - * @param {HTMLElement} element - */ -function initFromElement(element) { - const { id, service, user } = element.dataset; - return { - postCardElement: element, - postID: id, - service, - userID: user, - }; -} - -/** - * @param {KemonoAPI.Post} post - */ -function initFromScratch(post) { - /** - * @type {HTMLElement} - */ - const postCardElement = createComponent("post-card"); - - return { - postCardElement, - postID: post.id, - service: post.service, - userID: post.user, - }; -} - -/** - * @param {HTMLAnchorElement} link - * @returns {(event: MouseEvent) => void} - */ -function handlePostView(link) { - return (event) => { - link.focus(); - }; -} - -/** - * @param {HTMLElement} element - * @param {KemonoAPI.User} user - * @param {boolean} isCount - * @param {boolean} isDate - * @param {string} className - */ -export function UserCard(element, user = {}, isCount = false, isUpdated = false, isIndexed = false, className = null) { - const userCard = element - ? initUserCardFromElement(element) - : initUserCardFromScratch(user, isCount, isUpdated, isIndexed, className); - - return userCard; -} - -/** - * @param {HTMLElement} element - */ -function initUserCardFromElement(element) { - const userCard = element; - - return userCard; -} - -/** - * @param {KemonoAPI.User} user - * @param {boolean} isCount - * @param {boolean} isDate - * @param {string} className - */ -function initUserCardFromScratch(user, isCount, isUpdated, isIndexed, className) { - let profileIcon = freesites.kemono.user.icon(user.service, user.id); - let profileBanner = freesites.kemono.user.banner(user.service, user.id); - const profileLink = freesites.kemono.user.profile(user.service, user.id); - /** - * @type {HTMLElement} - */ - - profileIcon = ICONS_PREPEND + profileIcon; - profileBanner = BANNERS_PREPEND + profileBanner; - - const userCard = createComponent("user-card"); - userCard.href = profileLink; - userCard.style.backgroundImage = `linear-gradient(rgb(0 0 0 / 50%), rgb(0 0 0 / 80%)), url(${profileBanner})`; - - const imageLink = FancyImage(null, profileIcon, profileIcon, true, "", "user-card__user-icon"); - - const userIcon = userCard.querySelector(".user-card__icon"); - const userName = userCard.querySelector(".user-card__name"); - const userService = userCard.querySelector(".user-card__service"); - const userCount = userCard.querySelector(".user-card__count"); - const userUpdated = userCard.querySelector(".user-card__updated"); - - userIcon.appendChild(imageLink); - userName.textContent = user.name; - if (user.name.length >= 24) { - userName.title = user.name; - } - - userService.textContent = paysites[user.service].title; - userService.style.backgroundColor = paysites[user.service].color; - - if (className) { - userCard.classList.add(className); - } - - if (isCount) { - userCount.innerHTML = `${user.favorited} favorites`; - } else { - userCount.remove(); - } - - if (isUpdated || isIndexed) { - const timestamp = Timestamp(null, isUpdated ? user.updated : user.indexed); - userUpdated.appendChild(timestamp); - } else { - userUpdated.remove(); - } - - return userCard; -} diff --git a/client/src/pages/components/cards/account.html b/client/src/pages/components/cards/account.html deleted file mode 100644 index ec3b891..0000000 --- a/client/src/pages/components/cards/account.html +++ /dev/null @@ -1,29 +0,0 @@ -{% from 'components/timestamp.html' import timestamp %} -{% from 'components/links.html' import kemono_link %} - -{% macro account_card(account) %} - {% set account_url = 'account/administrator/accounts/' ~ account.id %} - - -{% endmacro %} diff --git a/client/src/pages/components/cards/account.scss b/client/src/pages/components/cards/account.scss deleted file mode 100644 index 7c003a1..0000000 --- a/client/src/pages/components/cards/account.scss +++ /dev/null @@ -1,9 +0,0 @@ -@use "../../../css/sass-mixins" as mixins; - -.account-card { - @include mixins.article-card(); - - &__body { - flex: 1 1 auto; - } -} diff --git a/client/src/pages/components/cards/base.html b/client/src/pages/components/cards/base.html deleted file mode 100644 index ef39246..0000000 --- a/client/src/pages/components/cards/base.html +++ /dev/null @@ -1,26 +0,0 @@ -{# base parts of the card #} -{# these macros can only be called #} - -{% macro card(class_name=none) %} -
    - {{ caller() }} -
    -{% endmacro %} - -{% macro card_header(class_name=none) %} -
    - {{ caller() }} -
    -{% endmacro %} - -{% macro card_body(class_name=none) %} -
    - {{ caller() }} -
    -{% endmacro %} - -{% macro card_footer(class_name=none) %} -
    - {{ caller() }} -
    -{% endmacro %} diff --git a/client/src/pages/components/cards/dm.html b/client/src/pages/components/cards/dm.html deleted file mode 100644 index 276fe65..0000000 --- a/client/src/pages/components/cards/dm.html +++ /dev/null @@ -1,70 +0,0 @@ -{% from 'components/timestamp.html' import timestamp %} -{% from 'components/links.html' import fancy_link %} -{% from 'components/fancy_image.html' import fancy_image, background_image %} - -{% macro dm_card( - dm, - is_private=false, - is_global=false, - artist={}, - class_name=none -) %} - {% set service = g.paysites[dm.service] %} - {% set creator_page_url = '/' ~ dm.service ~ '/user/' ~ dm.user %} - {% set remote_creator_page_url = service.user.profile(artist or { "id" : dm.user}) %} - -
    - {% if is_global %} -
    -{# {% call fancy_link(url=creator_page_url, class_name="dm-card__icon") %}#} -{# {{ fancy_image( g.icons_prepend ~ '/icons/' ~ artist.service ~ '/' ~ artist.id) }}#} -{# {% endcall %}#} - - {% call fancy_link(url=creator_page_url, class_name='dms__user-link') %} - {{ artist.name or dm.user }} - {% endcall %} - {% call fancy_link(url=remote_creator_page_url, class_name='dms__remote-user-link') %} - ({{ service.title }}) - {% endcall %} -
    - {% endif %} - - {% if is_private %} -
    - {% call fancy_link(url=creator_page_url, class_name='dms__user-link') %} - {{ artist.name or dm.user }} - {% endcall %} - - {% call fancy_link(url=remote_creator_page_url, class_name='dms__remote-user-link') %} - ({{ service.title }}) - {% endcall %} -
    - {% endif %} - -
    - {# writing it like this so there wouldn't be whitespaces/newlines in the output #} -
    {{ dm.content|sanitize_html|safe }}
    -
    - -
    - {% if dm.published %} -
    - Published: {{ ( dm.published|simple_datetime|string)[:7] }} -
    - {% elif dm.user_id %} {# this is to detect if its not DM#} -
    - Added: {{ ( dm.added|simple_datetime|string)[:7] }} -
    - {% else %} -
    - Added: {{ dm.added|simple_datetime }} -
    - {% endif %} -
    -
    -{% endmacro %} diff --git a/client/src/pages/components/cards/no_results.html b/client/src/pages/components/cards/no_results.html deleted file mode 100644 index cf871c7..0000000 --- a/client/src/pages/components/cards/no_results.html +++ /dev/null @@ -1,18 +0,0 @@ -{% from 'components/cards/base.html' import card, card_header, card_body %} - -{% macro no_results( - title = 'Nobody here but us chickens!', - message = 'There are no items found.' -) %} - {% call card(class_name='card--no-results') %} - {% call card_header() %} -

    - {{ title }} -

    - {% endcall %} - - {% call card_body() %} - {{ message }} - {% endcall %} - {% endcall %} -{% endmacro %} diff --git a/client/src/pages/components/cards/post.html b/client/src/pages/components/cards/post.html deleted file mode 100644 index ad05d01..0000000 --- a/client/src/pages/components/cards/post.html +++ /dev/null @@ -1,117 +0,0 @@ -{% from 'components/timestamp.html' import timestamp %} -{% from 'components/buttons.html' import button %} -{% from 'components/links.html' import fancy_link %} - -{% macro post_card(post) %} - {% set src_ns = namespace(found=false) %} - {% set src_ns.src = post.file.path if post.file.path and post.file.path|lower|regex_match("\.(gif|jpe?g|jpe|png|webp)$") %} - {% if post.service == "fansly" or post.service == "candfans" or post.service == "boosty" or post.service == "gumroad"%} - {% for file in post.attachments %} - {% if not src_ns.src and file.path and file.path|lower|regex_match("\.(gif|jpe?g|jpe|png|webp)$") %} - {% set src_ns.src = file.path %} - {% endif %} - {% endfor %} - {% endif %} - {% set post_link = g.freesites.kemono.post.link(post.service, post.user, post.id) %} -
    - -
    - {% if post.title and post.title != "DM" %} - {{ post.title }} - {% elif post.content|length < 50 %} - {{ post.content }} - {% else %} - {{ post.content[:50] + "..." }} - {% endif %} -
    - {% if src_ns.src %} -
    - -
    - {% endif %} -
    -
    -
    - {% if post.published %} - {{ timestamp(post.published) }} - {% endif %} -
    - {% if post.attachments|length %} - {{ post.attachments|length }} {{ 'attachment' if post.attachments|length == 1 else 'attachments' }} - {% else %} - No attachments - {% endif %} -
    -
    - -
    -
    -
    -
    -{% endmacro %} - -{% macro post_fav_card(post) %} - {% set src_ns = namespace(found=false) %} - {% set src_ns.src = post.file.path if post.file.path and post.file.path|lower|regex_match("\.(gif|jpe?g|jpe|png|webp)$") %} - {% if post.service == "fansly" or post.service == "candfans" or post.service == "boosty" or post.service == "gumroad"%} - {% for file in post.attachments %} - {% if not src_ns.src and file.path and file.path|lower|regex_match("\.(gif|jpe?g|jpe|png|webp)$") %} - {% set src_ns.src = file.path %} - {% endif %} - {% endfor %} - {% endif %} - {% set post_link = g.freesites.kemono.post.link(post.service, post.user, post.id) %} -
    - -
    - {% if post.title and post.title != "DM" %} - {{ post.title }} - {% elif post.content|length < 50 %} - {{ post.content }} - {% else %} - {{ post.content[:50] + "..." }} - {% endif %} -
    - {% if src_ns.src %} -
    - -
    - {% endif %} -
    -
    -
    - {% if post.published %} - {{ timestamp(post.published) }} - {% endif %} -
    - {% if post.attachments|length %} - {{ post.attachments|length }} {{ 'attachment' if post.attachments|length == 1 else 'attachments' }} - {% else %} - No attachments - {% endif %} -
    - {{ post.fav_count| int }} {{ "favorites" if post.fav_count > 1 else "favorite" }} -
    -
    - -
    -
    -
    -
    -{% endmacro %} diff --git a/client/src/pages/components/cards/share.html b/client/src/pages/components/cards/share.html deleted file mode 100644 index d9939a3..0000000 --- a/client/src/pages/components/cards/share.html +++ /dev/null @@ -1,66 +0,0 @@ -{% from 'components/fancy_image.html' import fancy_image, background_image %} -{% from 'components/timestamp.html' import timestamp %} -{% from 'components/links.html' import fancy_link %} -{% from 'components/buttons.html' import button %} - -{% macro share_card(share) %} - -{% endmacro %} - diff --git a/client/src/pages/components/cards/user.html b/client/src/pages/components/cards/user.html deleted file mode 100644 index 2ca7eb8..0000000 --- a/client/src/pages/components/cards/user.html +++ /dev/null @@ -1,93 +0,0 @@ -{% from 'components/timestamp.html' import timestamp %} -{% from 'components/image_link.html' import image_link %} -{% from 'components/fancy_image.html' import fancy_image %} -{% from 'components/links.html' import fancy_link %} - -{% macro user_card_header(is_count=false, is_date=false) %} -
    -
    Icon
    -
    Name
    -
    Service
    - {% if is_count %} -
    Times favorited
    - {% endif %} - {% if is_date %} -
    Updated
    - {% else %} - {% endif %} -
    -{% endmacro %} - -{% macro user_card( - user, - is_updated=false, - is_indexed=false, - is_count=false, - single_of='', - plural_of='', - is_date=false, - class_name=none -) %} - {% set user_link = g.freesites.kemono.user.profile(user.service, user.id) %} - {% set user_icon = g.freesites.kemono.user.icon(user.service, user.id) %} - {% set user_banner = g.freesites.kemono.user.banner(user.service, user.id) %} - - - {# Icon. #} -
    -
    - {{ fancy_image(src=user_icon) }} -
    -
    - - {# Secondary identifiers and elements. #} -
    - - {{ g.paysites[user.service].title }} - - -
    {{ user.name }}
    - - {% if is_updated %} -
    - {{ timestamp(user.updated) }} -
    - {% endif %} - {% if is_indexed %} -
    - {{ timestamp(user.indexed) }} -
    - {% endif %} - {% if is_count %} -
    - {% if user.count %} - {{ user.count }} {{ plural_of if user.count > 1 else single_of }} - {% else %} - {{ 'No ' ~ plural_of if plural_of else 'None' }} - {% endif %} -
    - {% endif %} -
    -
    -{% endmacro %} - -{% macro user_card_skeleton() %} - -
    -
    - -
    -
    -
    -
    -
    -{% endmacro %} diff --git a/client/src/pages/components/fancy_image.html b/client/src/pages/components/fancy_image.html deleted file mode 100644 index 324a12b..0000000 --- a/client/src/pages/components/fancy_image.html +++ /dev/null @@ -1,23 +0,0 @@ -{% macro fancy_image(src, srcset=src, is_lazy=true, alt="", class_name=none) %} - - {{ base_image(src, srcset, is_lazy, alt) }} - -{% endmacro %} - -{% macro background_image(src, srcset=src, is_lazy=true, class_name=none) %} -
    - {{ base_image(src, srcset, is_lazy, alt="") }} -
    -{% endmacro %} - -{% macro base_image(src, srcset=src, is_lazy=true, alt="") %} - - {{ alt }} - -{% endmacro %} diff --git a/client/src/pages/components/fancy_image.js b/client/src/pages/components/fancy_image.js deleted file mode 100644 index cb9373b..0000000 --- a/client/src/pages/components/fancy_image.js +++ /dev/null @@ -1,59 +0,0 @@ -import { createComponent } from "@wp/js/component-factory"; - -/** - * @param {HTMLSpanElement} element - * @param {string} src - * @param {string} srcset - * @param {boolean} isLazy - * @param {string} alt - * @param {string} className - */ -export function FancyImage(element = null, src, srcset = src, isLazy = true, alt = "", className = null) { - /** - * @type {HTMLSpanElement} - */ - const fancyImage = element ? initFromElement(element) : initFromScratch(src, srcset, isLazy, alt, className); - - return fancyImage; -} - -/** - * @param {HTMLSpanElement} element - */ -function initFromElement(element) { - return element; -} - -/** - * @param {string} src - * @param {string} srcset - * @param {boolean} isLazy - * @param {string} alt - * @param {string} className - */ -function initFromScratch(src, srcset, isLazy, alt, className) { - /** - * @type {HTMLSpanElement} - */ - const fancyImage = createComponent("fancy-image"); - /** - * @type {HTMLImageElement} - */ - const img = fancyImage.querySelector(".fancy-image__image"); - - img.src = src; - img.srcset = srcset; - img.alt = alt; - - if (className) { - fancyImage.classList.add(className); - } - - if (isLazy) { - img.loading = "lazy"; - } else { - img.loading = "eager"; - } - - return fancyImage; -} diff --git a/client/src/pages/components/file_hash_search.html b/client/src/pages/components/file_hash_search.html deleted file mode 100644 index 84cbcc4..0000000 --- a/client/src/pages/components/file_hash_search.html +++ /dev/null @@ -1,20 +0,0 @@ -{% macro search_form() %} - -{% endmacro %} diff --git a/client/src/pages/components/file_hash_search.scss b/client/src/pages/components/file_hash_search.scss deleted file mode 100644 index 1af7d1e..0000000 --- a/client/src/pages/components/file_hash_search.scss +++ /dev/null @@ -1,5 +0,0 @@ -#file-hash-search-form { - text-align: center; - padding-top: 1em; - padding-bottom: 0.5em; -} diff --git a/client/src/pages/components/flash_messages.html b/client/src/pages/components/flash_messages.html deleted file mode 100644 index e1edc3d..0000000 --- a/client/src/pages/components/flash_messages.html +++ /dev/null @@ -1,9 +0,0 @@ -{% with messages = get_flashed_messages() %} - {% if messages %} -
    - {% for message in messages %} - {{ message }}
    - {% endfor %} -
    - {% endif %} -{% endwith %} diff --git a/client/src/pages/components/footer.html b/client/src/pages/components/footer.html deleted file mode 100644 index 1d26570..0000000 --- a/client/src/pages/components/footer.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/client/src/pages/components/forms/base.html b/client/src/pages/components/forms/base.html deleted file mode 100644 index 2086c8b..0000000 --- a/client/src/pages/components/forms/base.html +++ /dev/null @@ -1,8 +0,0 @@ -{% macro form() %} -
    {{ caller() if caller }}
    -{% endmacro %} diff --git a/client/src/pages/components/forms/submit_button.html b/client/src/pages/components/forms/submit_button.html deleted file mode 100644 index ff68fe8..0000000 --- a/client/src/pages/components/forms/submit_button.html +++ /dev/null @@ -1,9 +0,0 @@ -{%- macro submit_button(text) -%} - -{%- endmacro -%} diff --git a/client/src/pages/components/headers.html b/client/src/pages/components/headers.html deleted file mode 100644 index da744be..0000000 --- a/client/src/pages/components/headers.html +++ /dev/null @@ -1,76 +0,0 @@ -{% from 'components/links.html' import fancy_link %} -{% from 'components/fancy_image.html' import background_image %} -{% from 'components/image_link.html' import image_link %} - -{% macro user_header(request, props) %} - {% set artist_icon = g.freesites.kemono.user.icon(props.service, props.id) %} - {% set artist_banner = g.freesites.kemono.user.banner(props.service, props.id) %} - {% set paysite_icons = { - 'patreon': '/static/patreon.svg', - 'fanbox': '/static/fanbox.svg', - 'gumroad': '/static/gumroad.svg', - 'subscribestar': '/static/subscribestar.png', - 'dlsite': '/static/dlsite.png', - 'fantia': '/static/fantia.png', - 'onlyfans': '/static/onlyfans.svg', - 'fansly': '/static/fansly.svg', - 'candfans': '/static/candfans.png', - } %} - -
    - {{ background_image( - artist_banner, - is_lazy=false, - class_name='user-header__background' - ) }} - - {{ image_link( - url=request.path, - src=artist_icon, - is_lazy=false, - is_noop=false, - class_name='user-header__avatar' - ) }} - - -
    -{% endmacro %} diff --git a/client/src/pages/components/image_link.html b/client/src/pages/components/image_link.html deleted file mode 100644 index 07ea5fa..0000000 --- a/client/src/pages/components/image_link.html +++ /dev/null @@ -1,25 +0,0 @@ -{% from 'components/fancy_image.html' import base_image %} -{% from 'components/links.html' import fancy_link %} - -{% macro image_link( - url, - src=url, - alt="", - srcset=src, - is_lazy=true, - is_noop=true, - class_name=none -) %} - {% call fancy_link( - url, - '', - is_noop, - 'image-link ' ~ (class_name if class_name) - ) %} - {% if not caller %} - {{ base_image(src, srcset, is_lazy, alt) }} - {% else %} - {{ caller() }} - {% endif %} - {% endcall %} -{% endmacro %} diff --git a/client/src/pages/components/image_link.js b/client/src/pages/components/image_link.js deleted file mode 100644 index 0f65902..0000000 --- a/client/src/pages/components/image_link.js +++ /dev/null @@ -1,78 +0,0 @@ -import { createComponent } from "@wp/js/component-factory"; - -/** - * TODO: Restructure arguments. - * @param {HTMLAnchorElement} element - * @param {string} url - * @param {string} src - * @param {string} alt - * @param {string} srcset - * @param {boolean} isLazy - * @param {boolean} isNoop - * @param {string} className - */ -export function ImageLink( - element = null, - url, - src = url, - alt = "", - srcset = src, - isLazy = true, - isNoop = true, - className = null, -) { - const imageLink = element - ? initFromElement(element) - : initFromScratch(url, src, alt, srcset, isLazy, isNoop, className); - - return imageLink; -} - -/** - * @param {HTMLAnchorElement} element - */ -function initFromElement(element) { - return element; -} - -/** - * @param {string} url - * @param {string} src - * @param {string} alt - * @param {string} srcset - * @param {boolean} isLazy - * @param {boolean} isNoop - * @param {string} className - */ -function initFromScratch(url, src, alt, srcset, isLazy, isNoop, className) { - /** - * @type {HTMLAnchorElement} - */ - const imageLink = createComponent("fancy-link image-link"); - /** - * @type {HTMLImageElement} - */ - const image = imageLink.querySelector(".fancy-image__image"); - - imageLink.href = url; - image.src = src; - image.srcset = srcset; - image.alt = alt; - - if (isNoop) { - imageLink.target = "_blank"; - imageLink.rel = "noopener noreferrer"; - } - - if (isLazy) { - image.loading = "lazy"; - } else { - image.loading = "eager"; - } - - if (className) { - imageLink.classList.add(className); - } - - return imageLink; -} diff --git a/client/src/pages/components/import_sidebar.html b/client/src/pages/components/import_sidebar.html deleted file mode 100644 index 712c852..0000000 --- a/client/src/pages/components/import_sidebar.html +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/client/src/pages/components/importer_states.html b/client/src/pages/components/importer_states.html deleted file mode 100644 index 659318d..0000000 --- a/client/src/pages/components/importer_states.html +++ /dev/null @@ -1,4 +0,0 @@ -{#
    - - -
    #} \ No newline at end of file diff --git a/client/src/pages/components/links.html b/client/src/pages/components/links.html deleted file mode 100644 index 87c05d6..0000000 --- a/client/src/pages/components/links.html +++ /dev/null @@ -1,56 +0,0 @@ -{# not splitting on several lines because it adds whitespaces in the output #} -{% macro fancy_link(url, text=url, is_noop=true, class_name=none ) %} - {{ text if not caller else caller() }} -{%- endmacro -%} - -{% macro download_link(url, text=url, file_name=text, class_name=none) %} - {{ text if not caller else caller() }} -{%- endmacro -%} - -{% macro kemono_link(url, text=url, is_noop=true,class_name=none) %} - {{ text if not caller else caller() }} -{%- endmacro -%} - -{% macro local_link(id, text=id, class_name=none) %} - {{ text if not caller else caller() }} -{%- endmacro -%} - -{% macro email_link(email, text=email, class_name=none) %} - -{%- endmacro -%} - -{% macro link_button(url, text=url, is_noop=true, class_name=none) %} - {{ text if not caller else caller() }} -{% endmacro %} diff --git a/client/src/pages/components/links.js b/client/src/pages/components/links.js deleted file mode 100644 index 6ab26bd..0000000 --- a/client/src/pages/components/links.js +++ /dev/null @@ -1,53 +0,0 @@ -import { createComponent } from "@wp/js/component-factory"; - -/** - * @param {HTMLElement} element - * @param {string} url - * @param {string} text - * @param {boolean} isNoop - * @param {string} className - * @returns - */ -export function FancyLink(element = null, url, text = url, isNoop = true, className = undefined) { - /** - * @type {HTMLAnchorElement} - */ - const fancyLink = element ? initFromElement(element) : initFromScratch(url, text, isNoop, className); - - return fancyLink; -} - -/** - * @param {HTMLAnchorElement} - */ -function initFromElement(element) { - return element; -} - -/** - * @param {string} url - * @param {string} text - * @param {boolean} isNoop - * @param {string} className - * @returns - */ -function initFromScratch(url, text, isNoop, className) { - /** - * @type {HTMLAnchorElement} - */ - const fancyLink = createComponent("fancy-link"); - - fancyLink.href = url; - fancyLink.textContent = text; - - if (className) { - fancyLink.classList.add(className); - } - - if (isNoop) { - fancyLink.target = "_blank"; - fancyLink.rel = "noopener noreferrer"; - } - - return fancyLink; -} diff --git a/client/src/pages/components/lists/_index.scss b/client/src/pages/components/lists/_index.scss deleted file mode 100644 index 914c413..0000000 --- a/client/src/pages/components/lists/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -@use "base"; -@use "faq"; diff --git a/client/src/pages/components/lists/base.html b/client/src/pages/components/lists/base.html deleted file mode 100644 index 52b498b..0000000 --- a/client/src/pages/components/lists/base.html +++ /dev/null @@ -1,18 +0,0 @@ -{% from 'components/meta/attributes.html' import attributes %} - -{# Call-only macros #} -{% macro desc_list() %} -
    {{ caller() }}
    -{% endmacro %} - -{% macro desc_section() %} -
    {{ caller() }}
    -{% endmacro %} - -{% macro desc_term() %} -
    {{ caller() }}
    -{% endmacro %} - -{% macro desc_details() %} -
    {{ caller() }}
    -{% endmacro %} diff --git a/client/src/pages/components/lists/base.scss b/client/src/pages/components/lists/base.scss deleted file mode 100644 index ef27f9d..0000000 --- a/client/src/pages/components/lists/base.scss +++ /dev/null @@ -1,23 +0,0 @@ -@use "../../../css/config/variables" as *; - -.desc-list { - background-color: var(--colour1-tertiary); - border-radius: 10px; - - &__section { - display: inline-block; - border-radius: 10px; - padding: $size-small; - - &:target { - outline-color: var(--anchour-local-colour1-primary); - outline-width: $size-thin; - outline-style: dashed; - } - } - &__term { - font-weight: bold; - } - &__details { - } -} diff --git a/client/src/pages/components/lists/faq.html b/client/src/pages/components/lists/faq.html deleted file mode 100644 index 80ebe71..0000000 --- a/client/src/pages/components/lists/faq.html +++ /dev/null @@ -1,18 +0,0 @@ -{% from 'components/meta/attributes.html' import attributes %} - -{# Call-only macros #} -{% macro faq_list() %} -
    {{ caller() }}
    -{% endmacro %} - -{% macro faq_section() %} -
    {{ caller() }}
    -{% endmacro %} - -{% macro faq_question() %} -
    {{ caller() }}
    -{% endmacro %} - -{% macro faq_answer() %} -
    {{ caller() }}
    -{% endmacro %} diff --git a/client/src/pages/components/lists/faq.scss b/client/src/pages/components/lists/faq.scss deleted file mode 100644 index 6d4f63b..0000000 --- a/client/src/pages/components/lists/faq.scss +++ /dev/null @@ -1,10 +0,0 @@ -.desc-list { - &--faq { - } - &__section--faq { - } - &__term--question { - } - &__details--answer { - } -} diff --git a/client/src/pages/components/loading_icon.html b/client/src/pages/components/loading_icon.html deleted file mode 100644 index 0bb1a2a..0000000 --- a/client/src/pages/components/loading_icon.html +++ /dev/null @@ -1,9 +0,0 @@ -{% from "components/fancy_image.html" import fancy_image %} - -{% set url = url_for('static', filename='loading.gif') %} - -{% macro loading_icon() -%} - - {{ fancy_image(url, alt="loading progress spinner") }} - -{%- endmacro %} diff --git a/client/src/pages/components/loading_icon.js b/client/src/pages/components/loading_icon.js deleted file mode 100644 index f86fc89..0000000 --- a/client/src/pages/components/loading_icon.js +++ /dev/null @@ -1,9 +0,0 @@ -import { createComponent } from "@wp/js/component-factory"; - -export function LoadingIcon() { - /** - * @type {HTMLSpanElement} - */ - const icon = createComponent("loading-icon"); - return icon; -} diff --git a/client/src/pages/components/meta/attributes.html b/client/src/pages/components/meta/attributes.html deleted file mode 100644 index e08080e..0000000 --- a/client/src/pages/components/meta/attributes.html +++ /dev/null @@ -1,7 +0,0 @@ -{# Put html attributes into kwargs argument #} -{% macro attributes(class_name) %} - class="{{ class_name ~ ' ' ~ kwargs.pop('class') if kwargs.class else class_name }}" - {% for attribute in kwargs %} - {{ attribute }}="{{ kwargs[attribute] }}" - {% endfor %} -{% endmacro %} diff --git a/client/src/pages/components/navigation/_index.scss b/client/src/pages/components/navigation/_index.scss deleted file mode 100644 index 31e0e9a..0000000 --- a/client/src/pages/components/navigation/_index.scss +++ /dev/null @@ -1,5 +0,0 @@ -@use "base"; -@use "global"; -@use "local"; -@use "account"; -@use "sidebar"; diff --git a/client/src/pages/components/navigation/account.html b/client/src/pages/components/navigation/account.html deleted file mode 100644 index e69de29..0000000 diff --git a/client/src/pages/components/navigation/account.scss b/client/src/pages/components/navigation/account.scss deleted file mode 100644 index e7c51f6..0000000 --- a/client/src/pages/components/navigation/account.scss +++ /dev/null @@ -1 +0,0 @@ -@use "../../../css/config/variables" as *; diff --git a/client/src/pages/components/navigation/base.html b/client/src/pages/components/navigation/base.html deleted file mode 100644 index 61f14d1..0000000 --- a/client/src/pages/components/navigation/base.html +++ /dev/null @@ -1,23 +0,0 @@ -{# Call-only macros #} -{% macro navigation(id=none, class_name=none) %} - -{% endmacro %} - -{% macro nav_list(class_name=none) %} - -{% endmacro %} - -{% macro nav_item(class_name=none) %} - -{% endmacro %} diff --git a/client/src/pages/components/navigation/base.scss b/client/src/pages/components/navigation/base.scss deleted file mode 100644 index 8e830c1..0000000 --- a/client/src/pages/components/navigation/base.scss +++ /dev/null @@ -1,24 +0,0 @@ -@use "../../../css/config/variables" as *; - -.navigation { - &__list { - display: flex; - flex-flow: column nowrap; - align-items: flex-start; - gap: $size-small; - list-style: none; - padding: $size-small; - margin: 0; - - &--ordered { - list-style-type: decimal-leading-zero; - padding-left: $size-normal; - } - } - - &__item { - } - - &__link { - } -} diff --git a/client/src/pages/components/navigation/global.html b/client/src/pages/components/navigation/global.html deleted file mode 100644 index 9a1dbc4..0000000 --- a/client/src/pages/components/navigation/global.html +++ /dev/null @@ -1,35 +0,0 @@ -{% from 'components/navigation/base.html' import navigation, nav_list, nav_item %} -{% from 'components/links.html' import fancy_link, kemono_link %} -{% from 'components/buttons.html' import button as base_button %} - -{% macro nav(id) %} - {% call navigation(id, class_name='global-nav') %} - {{ caller }} - {% endcall %} -{% endmacro %} - -{% macro list() %} - {% call nav_list(class_name='global-nav__list') %} - {{ caller }} - {% endcall %} -{% endmacro %} - -{% macro item() %} - {% call nav_item(class_name='global-nav__item') %} - {{ caller }} - {% endcall %} -{% endmacro %} - -{% macro button() %} - {% call base_button() %} - {{ caller }} - {% endcall %} -{% endmacro %} - -{% macro link(url, text) %} - {{ kemono_link(url, text, class_name='global-nav__link') }} -{% endmacro %} - -{% macro link_external(url, text) %} - {{ fancy_link(url, text, class_name='global-nav__link') }} -{% endmacro %} diff --git a/client/src/pages/components/navigation/global.scss b/client/src/pages/components/navigation/global.scss deleted file mode 100644 index 08865b4..0000000 --- a/client/src/pages/components/navigation/global.scss +++ /dev/null @@ -1,110 +0,0 @@ -@use "../../../css/config/variables" as *; - -.global-nav { - display: flex; - flex-flow: row nowrap; - justify-content: space-between; - align-items: center; - gap: $size-normal; - - &__list { - display: flex; - flex-flow: column nowrap; - - transition-property: visibility, opacity; - transition-duration: var(--duration-global); - } - - &__item { - position: relative; - - & > .global-nav__list { - position: absolute; - top: 100%; - z-index: 1; - visibility: hidden; - opacity: 0; - display: flex; - flex-flow: column nowrap; - align-items: flex-start; - min-width: 150px; - background-color: var(--colour1-tertiary); - border-radius: 10px; - padding: $size-small; - } - - &--open { - & > .global-nav__button { - background-color: var(--local-colour2-secondary); - border-radius: 5px 5px 0 0; - border-bottom-color: transparent; - } - - & > .global-nav__list { - visibility: visible; - opacity: 1; - border-radius: 0 10px 10px 10px; - box-shadow: 0 0 5px var(--colour1-primary-transparent); - } - } - - &--account { - margin-left: auto; - - & > .global-nav__list { - right: 0; - border-radius: 10px 0 10px 10px; - } - } - - // quick hack until I figure out anchour selector specificities - & .global-nav__link { - --local-colour1-primary: var(--colour0-primary); - --local-colour1-secondary: var(--colour0-primary); - --local-colour2-primary: var(--colour1-tertiary); - --local-colour2-secondary: var(--colour1-secondary); - } - } - - &__button { - --local-colour1-primary: var(--colour0-primary); - --local-colour1-secondary: var(--colour0-tertirary); - --local-colour2-primary: var(--colour1-primary); - --local-colour2-secondary: var(--colour1-tertiary); - - // temp until header rework - min-height: 34px; - color: var(--local-colour1-primary); - background-image: none; - background-color: var(--local-colour2-primary); - border: $size-nano solid var(--local-colour1-secondary); - box-shadow: - inset 2px 2px 3px hsla(0, 0%, 40%, 0.5), - inset -2px -2px 3px hsla(0, 0%, 0%, 0.5); - - transition-property: color, background-color, shadow, outline; - transition-duration: var(--duration-global); - - &:focus { - background-color: var(--local-colour2-secondary); - // outline-offset: 3px; - // outline-width: $size-thin; - // outline-style: dashed; - // outline-color: var(--colour0-secondary); - } - - &:hover { - background-color: var(--local-colour2-secondary); - } - - &:active { - box-shadow: - inset -2px -2px 3px hsla(0, 0%, 40%, 0.5), - inset 2px 2px 3px hsla(0, 0%, 0%, 0.5); - } - - &--notifs { - --local-colour1-primary: var(--submit-colour1-primary); - } - } -} diff --git a/client/src/pages/components/navigation/local.html b/client/src/pages/components/navigation/local.html deleted file mode 100644 index 9fb70f5..0000000 --- a/client/src/pages/components/navigation/local.html +++ /dev/null @@ -1,18 +0,0 @@ -{% from 'components/meta/attributes.html' import attributes %} -{% from 'components/links.html' import local_link %} - -{% macro local_nav() %} - -{% endmacro %} - -{% macro local_list() %} -
      {{ caller() }}
    -{% endmacro %} - -{% macro local_list_ordered() %} -
      {{ caller() }}
    -{% endmacro %} - -{% macro local_item(id, text) %} -
  • {{ local_link(id, text) }}
  • -{% endmacro %} diff --git a/client/src/pages/components/navigation/local.scss b/client/src/pages/components/navigation/local.scss deleted file mode 100644 index a5bf4c8..0000000 --- a/client/src/pages/components/navigation/local.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use "../../../css/config/variables" as *; - -.navigation { - &--local { - display: inline-block; - } - - &__list--local { - list-style-type: disc; - background-color: var(--colour1-tertiary); - border-radius: 10px; - padding-left: calc(#{$size-normal} + #{$size-small}); - } - &__item--local { - } -} diff --git a/client/src/pages/components/navigation/sidebar.html b/client/src/pages/components/navigation/sidebar.html deleted file mode 100644 index 9096558..0000000 --- a/client/src/pages/components/navigation/sidebar.html +++ /dev/null @@ -1,75 +0,0 @@ -{% macro nav_list(items, class_name=none) %} - {% for item in items %} - {{ nav_entry(item, class_name) }} - {% endfor %} -{% endmacro %} - -{% macro nav_entry(items, class_name=none) %} -
    - {% if not caller %} - {% for item in items %} - {% if not item.disable %} - {% if item.header %} - {% if item.link %} - {{ nav_item( - item.link, - item.text, - "clickable-header " ~ (item.class_name if item.class_name), - icon=item.icon - ) - }} - {% else %} - {{ nav_header(item.text, item.class_name, item.icon) }} - {% endif %} - {% else %} - {{ nav_item( - item.link, - item.text, - item.class_name, - item.is_external, - item.color, - item.icon - ) - }} - {% endif %} - {% endif %} - {% endfor %} - {% else %} - {{ caller() }} - {% endif %} -
    -{% endmacro %} - -{% macro nav_header(text, class_name=none, icon=none) %} -
    - {% if icon %} - - {% endif %} - {% if not caller %} - {{ text }} - {% else %} - {{ caller() }} - {% endif %} -
    -{% endmacro %} - -{% macro nav_item(link, text=link, class_name=none, is_external=false, color=none, icon=none) %} - {% if icon %} - - {% endif %} - {% if not caller %} - {{ text }} - {% else %} - {{ caller() }} - {% endif %} - -{% endmacro %} diff --git a/client/src/pages/components/paginator.html b/client/src/pages/components/paginator.html deleted file mode 100644 index d925709..0000000 --- a/client/src/pages/components/paginator.html +++ /dev/null @@ -1,72 +0,0 @@ -{% set skip = request.args.get('o')|parse_int if request.args.get('o') else 0 %} -{% set currentCeilingOfRange = skip + props.limit if (skip + props.limit) < props.count else props.count %} - -{% set TOTAL_BUTTONS = 5 %} -{% set OPTIONAL_BUTTONS = TOTAL_BUTTONS - 2 %} -{% set MANDATORY_BUTTONS = TOTAL_BUTTONS - OPTIONAL_BUTTONS %} -{% set currPageNum = ((skip + props.limit) / props.limit)|round(0, 'ceil')|int %} -{% set totalPages = (props.count / props.limit)|round(0, 'ceil')|int %} -{% set numBeforeCurrPage = currPageNum - 1 if ((totalPages < TOTAL_BUTTONS) or (currPageNum < TOTAL_BUTTONS)) else ((TOTAL_BUTTONS - 1) + ((TOTAL_BUTTONS) - (totalPages - currPageNum)) if (totalPages - currPageNum) < TOTAL_BUTTONS else (TOTAL_BUTTONS - 1)) %} -{% set basePageNum = [currPageNum - numBeforeCurrPage - 1, 1]|max %} -{% set showFirstPostsButton = basePageNum > 1 %} -{% set showLastPostsButton = totalPages - currPageNum > (TOTAL_BUTTONS + ((TOTAL_BUTTONS - (currPageNum - basePageNum)) if currPageNum - basePageNum < TOTAL_BUTTONS else 0)) %} -{% set optionalBeforeButtons = currPageNum - MANDATORY_BUTTONS - ((MANDATORY_BUTTONS - (totalPages - currPageNum)) if totalPages - currPageNum < MANDATORY_BUTTONS else 0) %} -{% set optionalAfterButtons = currPageNum + MANDATORY_BUTTONS + ((MANDATORY_BUTTONS - (currPageNum - basePageNum)) if currPageNum - basePageNum < MANDATORY_BUTTONS else 0) %} - -{% macro paginator_button(content, href=none, class_name=none) %} - {%if href %} - {{ content }} - {%else%} -
  • {{ content }}
  • - {%endif%} -{% endmacro %} - -{% if props.count > props.limit %} - - Showing {{ skip + 1 }} - {{ currentCeilingOfRange }} of {{ props.true_count or props.count }} - - {% set rng = range(0, (TOTAL_BUTTONS * 2) + 1) %} - - {%if showFirstPostsButton or showLastPostsButton %} - {%if showFirstPostsButton %} - {{ paginator_button('<<', href=url_for(request.endpoint, o = 0, **base)) }} - {%else%} - {{ paginator_button('<<', class_name='pagination-button-disabled' ~ (' pagination-desktop' if currPageNum - MANDATORY_BUTTONS - 1 else '')) }} - {%endif%} - {%endif%} - {%if not showFirstPostsButton %} - {%if currPageNum - MANDATORY_BUTTONS - 1 %} - {{ paginator_button('<<', href=url_for(request.endpoint, o = 0, **base), class_name='pagination-mobile') }} - {%elif (totalPages - currPageNum > MANDATORY_BUTTONS) and not showLastPostsButton %} - {{ paginator_button('<<', class_name='pagination-button-disabled pagination-mobile') }} - {%endif%} - {%endif%} - {%if currPageNum > 1 %} - {{ paginator_button('<', href=url_for(request.endpoint, o = (currPageNum - 2) * props.limit, **base), class_name='prev') }} - {%else%} - {{ paginator_button('<', class_name='pagination-button-disabled')}} - {%endif%} - {% for page in rng if (page + basePageNum) and ((page + basePageNum) <= totalPages) %} - {{ paginator_button((page + basePageNum), href=url_for(request.endpoint, o =((page + basePageNum - 1) * props.limit) if not (page + basePageNum) == 1 else none, **base) if (page + basePageNum) != currPageNum else none, class_name='pagination-button-optional' if ((page + basePageNum) < optionalBeforeButtons or (page + basePageNum) > optionalAfterButtons) and (page + basePageNum) != currPageNum else ('pagination-button-disabled pagination-button-current' if (page + basePageNum) == currPageNum else ('pagination-button-after-current' if (page + basePageNum) == (currPageNum + 1) else ''))) }} - {% endfor %} - {%if currPageNum < totalPages %} - {{ paginator_button('>', href=url_for(request.endpoint, o = currPageNum * props.limit, **base), class_name='next') }} - {%else%} - {{ paginator_button('>', class_name='pagination-button-disabled' ~(' pagination-button-after-current' if totalPages else '')) }} - {%endif%} - {%if showFirstPostsButton or showLastPostsButton %} - {%if showLastPostsButton %} - {{ paginator_button('>>', href=url_for(request.endpoint, o = (totalPages - 1) * props.limit, **base)) }} - {%else%} - {{ paginator_button('>>', class_name='pagination-button-disabled' ~ (' pagination-desktop' if totalPages - currPageNum > MANDATORY_BUTTONS else '')) }} - {%endif%} - {%endif%} - {%if not showLastPostsButton %} - {%if totalPages - currPageNum > MANDATORY_BUTTONS%} - {{ paginator_button('>>', href=url_for(request.endpoint, o = (totalPages - 1) * props.limit, **base), class_name='pagination-mobile') }} - {%elif (currPageNum > OPTIONAL_BUTTONS) and not showFirstPostsButton %} - {{ paginator_button('>>', class_name='pagination-button-disabled pagination-mobile') }} - {%endif%} - {%endif%} - -{% endif %} diff --git a/client/src/pages/components/paginator.js b/client/src/pages/components/paginator.js deleted file mode 100644 index 76e4451..0000000 --- a/client/src/pages/components/paginator.js +++ /dev/null @@ -1,12 +0,0 @@ -export function registerPaginatorKeybinds() { - document.addEventListener("keydown", (e) => { - switch (e.key) { - case "ArrowLeft": - document.querySelector(".paginator .prev")?.click(); - break; - case "ArrowRight": - document.querySelector(".paginator .next")?.click(); - break; - } - }); -} diff --git a/client/src/pages/components/paginator_new.html b/client/src/pages/components/paginator_new.html deleted file mode 100644 index 64b05a3..0000000 --- a/client/src/pages/components/paginator_new.html +++ /dev/null @@ -1,116 +0,0 @@ -{% from 'components/links.html' import link_button %} - -{# `id` is the id of related `form_controller()` #} -{% macro paginator(id, request, pagination, class_name= none) %} - {% set current_page = pagination.current_page %} - {% set total_pages = pagination.total_pages %} - {% set base_url = pagination.base_url %} - -
    - - Showing {{ pagination.offset + 1 }} - {{ pagination.current_count }} of {{ pagination.count }} - -
      -
    • - {% if current_page != 1 %} - {{ link_button( - pagination.create_paged_url(request, 1), - 1, - is_noop=false, - class_name= 'paginator__link' - ) }} - {% else %} - - ... - - {% endif %} - -
    • -
    • - {% if current_page > 2 %} - {{ link_button( - pagination.create_paged_url(request, current_page - 1), - current_page - 1, - is_noop=false, - class_name= 'paginator__link' - ) }} - {% else %} - - ... - - {% endif %} -
    • - -
    • - - -
    • - -
    • - {% if current_page < total_pages - 1 %} - {{ link_button( - pagination.create_paged_url(request, current_page + 1), - current_page + 1, - is_noop=false, - class_name= 'paginator__link' - ) }} - {% else %} - - ... - - {% endif %} -
    • - -
    • - {% if current_page != total_pages %} - {{ link_button( - pagination.create_paged_url(request, total_pages), - total_pages, - is_noop=false, - class_name= 'paginator__link' - ) }} - {% else %} - - ... - - {% endif %} -
    • -
    -
    -{% endmacro %} - -{# `**kwargs` is `
    ` attributes #} -{% macro paginator_controller(id, request, pagination) %} - - {% for param in pagination.base %} - - {% endfor %} -
    -{% endmacro %} diff --git a/client/src/pages/components/shell.html b/client/src/pages/components/shell.html deleted file mode 100644 index 88e4c33..0000000 --- a/client/src/pages/components/shell.html +++ /dev/null @@ -1,221 +0,0 @@ -{# TODO: figure out nested macro calls #} -{% import 'components/navigation/global.html' as global %} -{% from 'components/navigation/sidebar.html' import nav_list, nav_item, nav_header, nav_entry %} -{% from 'components/loading_icon.html' import loading_icon %} -{% from 'components/timestamp.html' import timestamp %} -{% from 'components/tooltip.html' import tooltip %} -{% from 'components/links.html' import fancy_link, kemono_link, link_button %} -{% from 'components/tooltip.html' import register_message %} -{% from 'components/buttons.html' import button %} - -{% macro header_link(url, text, class_name=none) %} - - {{ text }} - -{% endmacro %} - - - - - - - {% if g.matomo_enabled and g.matomo_plain_code %} - {{ g.matomo_plain_code|safe }} - {% elif g.matomo_enabled %} - - - {% endif %} - - - - {% block title %} - - {{ (props.name ~ " | " ~ g.site_name) if props.name else g.site_name }} - - {% endblock title %} - - - {% block meta %} - {% if props.service %} - - {% endif %} - {% if props.id %} - - {% endif %} - {% if props.importId %} - - {% endif %} - {% if props.count %} - - {% endif %} - {% if props.posts|length %} - {% if props.posts[0].published %} - - {% endif %} - - - {% endif %} - {% endblock meta %} - - {% block opengraph %} - - - - - - - - {% endblock opengraph %} - - {% block styles %} - {% endblock styles %} - - {% block scripts %} - {% if request.args.logged_in %} - - {% endif %} - {% if request.args.role %} - - {% endif %} - {# TODO remove this shit #} - {% endblock scripts %} - - {% block bundler_output %} - {# quick hack until writing proper loader #} - <% for (const css in htmlWebpackPlugin.files.css) { %> - <% if (htmlWebpackPlugin.files.css[css].startsWith("/static/bundle/css/global")) { %> - - <% } %> - <% } %> - <% for (const chunk in htmlWebpackPlugin.files.chunks) { %> - - <% } %> - <% for (const scriptPath in htmlWebpackPlugin.files.js) { %> - <% if (htmlWebpackPlugin.files.js[scriptPath].startsWith("/static/bundle/js/global") || htmlWebpackPlugin.files.js[scriptPath].startsWith("/static/bundle/js/runtime") || htmlWebpackPlugin.files.js[scriptPath].startsWith("/static/bundle/js/vendors")) { %> - - <% } %> - <% } %> - {% endblock bundler_output %} - - {% block scripts_extra %} - {% endblock scripts_extra %} - - - - -
    -
    -
    -
    -
    - -
    - {{ header_link('/', 'Home', 'home') }} - {{ header_link('/artists', g.artists_or_creators) }} - {{ header_link('/posts', 'Posts') }} - {{ header_link('/importer', 'Import', 'import') }} - {{ header_link('/account/register?location=' + request.args.get("location", request.path), 'Register', 'register') }} - {{ header_link('/account/login?location=' + request.args.get("location", request.path), 'Login', 'login') }} -
    - {% include 'components/flash_messages.html' %} - {% if g.banner_global %} - {{ g.banner_global|safe }} - {% endif %} - -
    - {% block content %} - {% endblock content %} -
    - -
    - {% include 'components/footer.html' %} - -
    -
    - {#
    -
    #} - {% call tooltip() %} -

    -

    - {% endcall %} - - diff --git a/client/src/pages/components/shell.js b/client/src/pages/components/shell.js deleted file mode 100644 index 0db0df7..0000000 --- a/client/src/pages/components/shell.js +++ /dev/null @@ -1,106 +0,0 @@ -import { isLoggedIn } from "@wp/js/account"; - -window.addEventListener("load", () => { - document.body.classList.remove("transition-preload"); -}); - -/** - * @param {HTMLElement} sidebar - */ -export function initShell(sidebar) { - const burgor = document.getElementById("burgor"); - const header = burgor.parentElement; - const backdrop = document.querySelector(".backdrop"); - const contentWrapper = document.querySelector(".content-wrapper"); - const closeButton = sidebar.querySelector(".close-sidebar"); - const closeSidebar = (_, setState = true) => { - sidebar.classList.toggle("expanded"); - sidebar.classList.toggle("retracted"); - backdrop.classList.toggle("backdrop-hidden"); - contentWrapper.classList.toggle("shifted"); - const retracted = header.classList.toggle("sidebar-retracted"); - if (setState && window.innerWidth > 1020) localStorage.setItem("sidebar_state", retracted); - }; - if (typeof localStorage.getItem("sidebar_state") === "string") { - const sidebarState = localStorage.getItem("sidebar_state") === "true"; - if (window.innerWidth > 1020 && sidebarState) closeSidebar(); - } - window.addEventListener("resize", () => { - if (typeof localStorage.getItem("sidebar_state") !== "string") return; - const sidebarState = localStorage.getItem("sidebar_state") === "true"; - const realState = header.classList.contains("sidebar-retracted"); - const killAnimations = () => { - document.body.classList.add("transition-preload"); - requestAnimationFrame(() => setInterval(() => document.body.classList.remove("transition-preload"))); - }; - if (window.innerWidth <= 1020) { - if (sidebarState && realState) { - killAnimations(); - closeSidebar(null, false); - } - } else if (sidebarState && !realState) { - killAnimations(); - closeSidebar(); - } - }); - burgor.addEventListener("click", closeSidebar); - backdrop.addEventListener("click", closeSidebar); - closeButton.addEventListener("click", closeSidebar); - if (isLoggedIn) { - const accountList = sidebar.querySelector(".account"); - const login = accountList.querySelector(".login"); - const loginHeader = header.querySelector(".login"); - const register = accountList.querySelector(".register"); - const registerHeader = header.querySelector(".register"); - const favorites = accountList.querySelector(".favorites"); - const reviewDms = accountList.querySelector(".review_dms"); - login.classList.remove("login"); - loginHeader.classList.remove("login"); - loginHeader.classList.add("logout"); - register.classList.remove("register"); - registerHeader.classList.remove("register"); - favorites.classList.remove("hidden"); - reviewDms.classList.remove("hidden"); - login.lastChild.textContent = "Logout"; - login.firstElementChild.src = "/static/menu/logout.svg"; - login.href = "/account/logout"; - loginHeader.innerText = "Logout"; - loginHeader.href = "/account/logout"; - register.lastChild.textContent = "Keys"; - register.firstElementChild.src = "/static/menu/keys.svg"; - register.href = "/account/keys"; - registerHeader.innerText = "Favorites"; - registerHeader.href = "/favorites"; - const onLogout = (e) => { - e.preventDefault(); - localStorage.removeItem("logged_in"); - localStorage.removeItem("role"); - localStorage.removeItem("favs"); - localStorage.removeItem("post_favs"); - location.href = "/account/logout"; - }; - login.addEventListener("click", onLogout); - loginHeader.addEventListener("click", onLogout); - } else { - const accountHeader = sidebar.querySelector(".account-header"); - const newHeader = document.createElement("div"); - newHeader.className = "global-sidebar-entry-item header"; - newHeader.innerText = "Account"; - newHeader.prepend(accountHeader.firstElementChild); - accountHeader.parentElement.replaceChild(newHeader, accountHeader); - } - // questionable? close sidebar on tap of an item, - // delay loading of page until animation is done - // uncomment to close on tap - // uncomment the items commented with // to add a delay so it finishes animating - /* sidebar.querySelectorAll('.global-sidebar-entry-item').forEach(e => { - e.addEventListener('click', ev => { - //ev.preventDefault(); - sidebar.classList.remove('expanded'); - backdrop.classList.add('backdrop-hidden'); - // setTimeout(() => { - // location.href = e.href; - // }, 250); - }) - }) */ -} diff --git a/client/src/pages/components/site.html b/client/src/pages/components/site.html deleted file mode 100644 index 6811eb8..0000000 --- a/client/src/pages/components/site.html +++ /dev/null @@ -1,27 +0,0 @@ -{# call-only #} -{% macro section(name, title=none, class_name=none) %} -
    - {% if title %} - {% call header() %} - {{ heading(title) }} - {% endcall %} - {% endif %} - {{ caller() }} -
    -{% endmacro %} - -{% macro header(class_name=none) %} -
    - {{ caller() }} -
    -{% endmacro %} - -{% macro heading(title, class_name=none) %} -

    - {% if not caller %} - {{ title }} - {% else %} - {{ caller() }} - {% endif %} -

    -{% endmacro %} diff --git a/client/src/pages/components/site_section.html b/client/src/pages/components/site_section.html deleted file mode 100644 index de100d0..0000000 --- a/client/src/pages/components/site_section.html +++ /dev/null @@ -1,13 +0,0 @@ -{% macro site_section(name) %} -
    - {{ caller() }} -
    -{% endmacro %} - -{% macro site_section_header(heading) %} -
    -

    - {{ heading }} -

    -
    -{% endmacro %} diff --git a/client/src/pages/components/support_sidebar.html b/client/src/pages/components/support_sidebar.html deleted file mode 100644 index 701ac56..0000000 --- a/client/src/pages/components/support_sidebar.html +++ /dev/null @@ -1,8 +0,0 @@ - \ No newline at end of file diff --git a/client/src/pages/components/tabs.html b/client/src/pages/components/tabs.html deleted file mode 100644 index ab51ab9..0000000 --- a/client/src/pages/components/tabs.html +++ /dev/null @@ -1,68 +0,0 @@ - diff --git a/client/src/pages/components/timestamp.html b/client/src/pages/components/timestamp.html deleted file mode 100644 index 79457be..0000000 --- a/client/src/pages/components/timestamp.html +++ /dev/null @@ -1,14 +0,0 @@ -{% macro timestamp(time, is_relative=false, class_name=none) %} - {# `datetime` value should be an ISO string #} - -{% endmacro %} diff --git a/client/src/pages/components/timestamp.js b/client/src/pages/components/timestamp.js deleted file mode 100644 index 85f6825..0000000 --- a/client/src/pages/components/timestamp.js +++ /dev/null @@ -1,39 +0,0 @@ -import { createComponent } from "@wp/js/component-factory"; - -/** - * TODO: make it work with `Date` objects. - * @param {HTMLTimeElement} element - * @param {string} date - * @param {string} className - */ -export function Timestamp(element, date, isRelative = false, className = null) { - const timestamp = element ? element : initFromScratch(date, isRelative, className); - - return timestamp; -} - -/** - * @param {string} date - * @param {boolean} isRelative - * @param {string} className - */ -function initFromScratch(date, isRelative, className) { - /** - * @type {HTMLTimeElement} - */ - const timestamp = createComponent("timestamp"); - - timestamp.dateTime = date; - - if (className) { - timestamp.classList.add(className); - } - - if (isRelative) { - timestamp.textContent = date; - } else { - timestamp.textContent = date; - } - - return timestamp; -} diff --git a/client/src/pages/components/tooltip.html b/client/src/pages/components/tooltip.html deleted file mode 100644 index 9bcc918..0000000 --- a/client/src/pages/components/tooltip.html +++ /dev/null @@ -1,22 +0,0 @@ -{% from 'components/buttons.html' import button %} -{% from 'components/links.html' import kemono_link %} - -{% macro tooltip() %} -
    - {{ button('Close', 'tooltip__close') }} - {{ caller() }} -
    -{% endmacro %} - -{% macro register_message(action_name) %} -

    - {{ action_name }} is only available to registered users. -
    - Visit the {{ kemono_link('/account/login?location=' + request.path, 'login page', is_noop=false) }} if you have an account. -
    - Otherwise visit the {{ kemono_link('/account/register?location=' + request.path, 'registration page', is_noop=false) }} to create one. -

    -{% endmacro %} diff --git a/client/src/pages/components/tooltip.js b/client/src/pages/components/tooltip.js deleted file mode 100644 index dd2eec2..0000000 --- a/client/src/pages/components/tooltip.js +++ /dev/null @@ -1,65 +0,0 @@ -import { createComponent } from "@wp/js/component-factory"; - -/** - * @type {HTMLDivElement} - */ -const tooltip = document.getElementById("flying-tooltip"); -/** - * @type {[HTMLButtonElement, HTMLSpanElement]} - */ -const [closeButton, messageContainer] = tooltip.children; - -closeButton.addEventListener("click", (event) => { - tooltip.classList.remove("tooltip--shown"); -}); - -/** - * @param {HTMLElement} element - * @param {HTMLParagraphElement} messageElement - */ -export function showTooltip(element, messageElement) { - const { left, bottom } = element.getBoundingClientRect(); - - tooltip.classList.remove("tooltip--shown"); - messageContainer.replaceWith(messageElement); - tooltip.style.setProperty("--local-x", `${left}px`); - tooltip.style.setProperty("--local-y", `${bottom}px`); - tooltip.classList.add("tooltip--shown"); -} - -/** - * TODO: init from `action_name` - * @param {HTMLElement} element - * @param {string} actionName - */ -export function registerMessage(element, actionName = "") { - /** - * @type {HTMLParagraphElement} - */ - const messageElement = element ? element : initFromScratch(actionName); - - return messageElement; -} - -/** - * @param {HTMLElement} element - */ -function initFromElement(element) {} - -/** - * @param {string} actionName - */ -function initFromScratch(actionName) { - /** - * @type {HTMLParagraphElement} - */ - const message = createComponent("tooltip__message tooltip__message--register"); - /** - * @type {HTMLSpanElement} - */ - const action = message.querySelector(".tooltip__action"); - - action.textContent = actionName; - - return message; -} diff --git a/client/src/pages/contact.tsx b/client/src/pages/contact.tsx new file mode 100644 index 0000000..99cf163 --- /dev/null +++ b/client/src/pages/contact.tsx @@ -0,0 +1,17 @@ +import { PageSkeleton } from "#components/pages"; + +export function ContactPage() { + const title = "Contact Us"; + const heading = "Contact Us"; + + return ( + +

    + Contact email: contact@kemono.ru +

    +

    + Please allow up to 3-5 working days for your request to be processed. You may not receive a response if we are not interested. +

    +
    + ); +} diff --git a/client/src/pages/development/_index.scss b/client/src/pages/development/_index.scss deleted file mode 100644 index a3235dd..0000000 --- a/client/src/pages/development/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -@use "components"; -@use "design"; diff --git a/client/src/pages/development/closure.html b/client/src/pages/development/closure.html deleted file mode 100644 index cf7b73e..0000000 --- a/client/src/pages/development/closure.html +++ /dev/null @@ -1,26 +0,0 @@ -{# taken from https://gist.github.com/dah33/e18e71a81d1a0aaf59658269ada963b3 #} - -{% macro enclose(fn, env) %} - {% set closure = namespace(fn=fn, env=env) %} - {% do return(closure) %} -{% endmacro %} - -{% macro call1(closure, x1) %} - {% do return(closure.fn(x1, closure.env)) %} -{% endmacro %} - -{% macro call2(closure, x1, x2) %} - {% do return(closure.fn(x1, x2, closure.env)) %} -{% endmacro %} - -{# Example: #} - -{% macro power(x, kwargs) %} - {% do return(x**kwargs.exponent) %} -{% endmacro %} - -{# -{% set square = enclose(power, dict(exponent=2)) %} - -{{ call1(square, 8) }}{# = 8**2 = 64 #} -#} diff --git a/client/src/pages/development/components/_index.scss b/client/src/pages/development/components/_index.scss deleted file mode 100644 index af1b252..0000000 --- a/client/src/pages/development/components/_index.scss +++ /dev/null @@ -1,2 +0,0 @@ -@use "forms"; -@use "inputs"; diff --git a/client/src/pages/development/components/forms.html b/client/src/pages/development/components/forms.html deleted file mode 100644 index bd34b3f..0000000 --- a/client/src/pages/development/components/forms.html +++ /dev/null @@ -1,17 +0,0 @@ -{% from 'components/meta/attributes.html' import attributes %} - -{% macro form() %} -
    {{ caller() if caller }}
    -{% endmacro %} - -{% macro section() %} -
    {{ caller() if caller }}
    -{% endmacro %} - -{% macro label(text=none) %} - -{% endmacro %} - -{% macro input() %} - -{% endmacro %} diff --git a/client/src/pages/development/components/forms.scss b/client/src/pages/development/components/forms.scss deleted file mode 100644 index 501af59..0000000 --- a/client/src/pages/development/components/forms.scss +++ /dev/null @@ -1,31 +0,0 @@ -@use "../../../css/config/variables" as *; - -.dev-form { - display: grid; - grid-template-columns: 1fr; - grid-auto-rows: auto; - gap: $size-normal; - max-width: $width-mobile; - margin: 0 auto; - - &__section { - border: none; - padding: 0; - margin: 0; - - &--submit { - text-align: center; - } - } - - &__label { - display: inline-block; - } - - &__input { - min-width: 44px; - min-height: 44px; - width: 100%; - padding: $size-small; - } -} diff --git a/client/src/pages/development/components/inputs.html b/client/src/pages/development/components/inputs.html deleted file mode 100644 index 9935918..0000000 --- a/client/src/pages/development/components/inputs.html +++ /dev/null @@ -1,25 +0,0 @@ -{% from 'components/meta/attributes.html' import attributes %} - -{% import 'development/components/forms.html' as forms %} - -{% macro text(id, text) %} - {% call forms.section() %} - {{ forms.label(text, for=id) }} - {{ forms.input(id=id, - type="text", - **kwargs - ) }} - {% endcall %} -{% endmacro %} - -{% macro submit_button(text=none) %} - {% call forms.section(class='dev-form__section--submit') %} - - {% endcall %} -{% endmacro %} diff --git a/client/src/pages/development/components/inputs.scss b/client/src/pages/development/components/inputs.scss deleted file mode 100644 index 24d2370..0000000 --- a/client/src/pages/development/components/inputs.scss +++ /dev/null @@ -1,11 +0,0 @@ -@use "../../../css/config/variables" as *; - -.dev-form__input { -} - -.dev-form__submit { - min-width: 44px; - min-height: 44px; - width: auto; - padding: $size-small; -} diff --git a/client/src/pages/development/components/nav.html b/client/src/pages/development/components/nav.html deleted file mode 100644 index 524c5cd..0000000 --- a/client/src/pages/development/components/nav.html +++ /dev/null @@ -1,15 +0,0 @@ -{% from 'components/navigation/base.html' import navigation, nav_list, nav_item %} -{% from 'components/links.html' import kemono_link %} - -{# `nav_items` is a list of tuples `(url, title)` #} -{% macro dev_nav(nav_items, id=none) %} - {% call navigation(id) %} - {% call nav_list() %} - {% for url, title in nav_items %} - {% call nav_item() %} - {{ kemono_link(url, title, is_noop= false) }} - {% endcall %} - {% endfor %} - {% endcall %} - {% endcall %} -{% endmacro %} diff --git a/client/src/pages/development/config.html b/client/src/pages/development/config.html deleted file mode 100644 index 803abe3..0000000 --- a/client/src/pages/development/config.html +++ /dev/null @@ -1,45 +0,0 @@ -{% extends 'development/shell.html' %} - -{% import 'components/site.html' as site %} - -{% block content %} -{% call site.section('test-entries', 'Test Database') %} -
    -
    -

    Press "Activate" to:

    -
      -
    • Add test service keys
    • -
    -
    -
    - -
    -
    - -
    -
    -

    Press "Activate" to:

    -
      -
    • Add test accounts
    • -
    -
    -
    - -
    -
    -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/development/design/_index.scss b/client/src/pages/development/design/_index.scss deleted file mode 100644 index a232bd3..0000000 --- a/client/src/pages/development/design/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@use "wip"; diff --git a/client/src/pages/development/design/current/home.html b/client/src/pages/development/design/current/home.html deleted file mode 100644 index b24447b..0000000 --- a/client/src/pages/development/design/current/home.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends 'development/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'development/components/nav.html' import dev_nav %} - -{% set nav_items = [ - ('/development/design', 'Home'), -] %} - -{% block content %} -{% call site.section('design-current', 'Current') %} - {{ dev_nav(nav_items) }} -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/development/design/home.html b/client/src/pages/development/design/home.html deleted file mode 100644 index 774c544..0000000 --- a/client/src/pages/development/design/home.html +++ /dev/null @@ -1,16 +0,0 @@ -{% extends 'development/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'development/components/nav.html' import dev_nav %} - -{% set nav_items = [ - ('/development/design/current', 'Current'), - ('/development/design/upcoming', 'Upcoming'), - ('/development/design/wip', 'Work In Progress'), -] %} - -{% block content %} -{% call site.section('design', 'Design Overview') %} - {{ dev_nav(nav_items) }} -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/development/design/upcoming/home.html b/client/src/pages/development/design/upcoming/home.html deleted file mode 100644 index f71614c..0000000 --- a/client/src/pages/development/design/upcoming/home.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends 'development/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'development/components/nav.html' import dev_nav %} - -{% set nav_items = [ - ('/development/design', 'Home'), -] %} - -{% block content %} -{% call site.section('design-upcoming', 'Upcoming') %} - {{ dev_nav(nav_items) }} -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/development/design/wip/_index.scss b/client/src/pages/development/design/wip/_index.scss deleted file mode 100644 index 495fed2..0000000 --- a/client/src/pages/development/design/wip/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@use "home"; diff --git a/client/src/pages/development/design/wip/home.html b/client/src/pages/development/design/wip/home.html deleted file mode 100644 index fbd9e59..0000000 --- a/client/src/pages/development/design/wip/home.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends 'development/shell.html' %} - -{% import 'components/site.html' as site %} -{% import 'development/components/forms.html' as forms %} -{% import 'development/components/inputs.html' as inputs %} -{% from 'components/navigation/local.html' import local_nav %} -{% from 'development/components/nav.html' import dev_nav %} - -{% set page_title = 'Work In Progress Designs | ' ~ g.site_name %} - -{% block title %} - - {{ page_title }} - -{% endblock title %} - -{% block content %} -{% call site.section('development-design-wip', 'Work In Progress Designs') %} - {{ dev_nav([ - ('/development/design', 'Home'), - ]) }} - {{ local_nav([ - ('forms', 'Forms') - ]) }} - {% call site.article(id='forms') %} -

    Forms

    - {% call forms.form() %} -

    Form example

    - {{ inputs.text('form-text', 'Text Input:') }} - {{ inputs.submit_button('Submit Button') }} - {% endcall %} - {% endcall %} -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/development/design/wip/home.scss b/client/src/pages/development/design/wip/home.scss deleted file mode 100644 index 5f8e844..0000000 --- a/client/src/pages/development/design/wip/home.scss +++ /dev/null @@ -1,2 +0,0 @@ -.site-section--development-design-wip { -} diff --git a/client/src/pages/development/home.html b/client/src/pages/development/home.html deleted file mode 100644 index 15de9fd..0000000 --- a/client/src/pages/development/home.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends 'development/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'development/components/nav.html' import dev_nav %} - -{# ('/development/test-entries', 'Test entries'), #} -{% set nav_items = [ - ('/development/design', 'Design'), -] %} - -{% block content %} -{% call site.section('dev-only', g.site_name ~' dev') %} - {{ dev_nav(nav_items) }} -
    -
    -

    - Press "Activate" to create a seeded database. -

    -
    -
    - -
    -
    - -
    -
    -

    - Press "Activate" to create a random database. -

    -
    -
    - -
    -
    -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/development/shell.html b/client/src/pages/development/shell.html deleted file mode 100644 index b00fc94..0000000 --- a/client/src/pages/development/shell.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends 'components/shell.html' %} - - {% block bundler_output %} - {# quick hack until writing proper loader #} - <% for (const css in htmlWebpackPlugin.files.css) { %> - <% if (htmlWebpackPlugin.files.css[css].startsWith("/static/bundle/css/development")) { %> - - <% } %> - <% } %> - <% for (const chunk in htmlWebpackPlugin.files.chunks) { %> - - <% } %> - <% for (const scriptPath in htmlWebpackPlugin.files.js) { %> - <% if (htmlWebpackPlugin.files.js[scriptPath].startsWith("/static/bundle/js/development") | htmlWebpackPlugin.files.js[scriptPath].startsWith("/static/bundle/js/runtime")) { %> - - <% } %> - <% } %> - {% endblock bundler_output %} diff --git a/client/src/pages/development/test_entries.html b/client/src/pages/development/test_entries.html deleted file mode 100644 index 73910b5..0000000 --- a/client/src/pages/development/test_entries.html +++ /dev/null @@ -1,51 +0,0 @@ -{% extends 'development/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'development/components/nav.html' import dev_nav %} - -{% set nav_items = [ - ('/development', 'Home') -] %} - -{% block content %} -{% call site.section('test-entries', 'Test entries') %} - {{ dev_nav(nav_items) }} -
    -
    -

    - Press "Activate" to create a seeded database. -

    -
    -
    - -
    -
    - -
    -
    -

    - Press "Activate" to create a random database. -

    -
    -
    - -
    -
    -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/discord-channel.module.scss b/client/src/pages/discord-channel.module.scss new file mode 100644 index 0000000..13cf119 --- /dev/null +++ b/client/src/pages/discord-channel.module.scss @@ -0,0 +1,5 @@ +.main { + display: flex; + flex-direction: row; + gap: 1em; +} diff --git a/client/src/pages/discord-channel.tsx b/client/src/pages/discord-channel.tsx new file mode 100644 index 0000000..18161ce --- /dev/null +++ b/client/src/pages/discord-channel.tsx @@ -0,0 +1,77 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { parseOffset } from "#lib/pagination"; +import { fetchDiscordChannel, fetchDiscordServer } from "#api/profiles/discord"; +import { PageSkeleton } from "#components/pages"; +import { + DiscordMessages, + DiscordServer, + IDiscordChannelMessage, +} from "#entities/posts"; + +import * as styles from "./discord-channel.module.scss"; + +interface IProps { + serverID: string; + channelID: string; + channels: { id: string; name: string }[]; + messages: IDiscordChannelMessage[]; + offset?: number; +} + +export function DiscordChannelPage() { + const { serverID, channelID, channels, messages, offset } = + useLoaderData() as IProps; + const title = "Discord channel"; + const heading = "Discord Channel"; + + return ( + +
    + + +
    +
    + ); +} + +export async function loader({ + params, + request, +}: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + const serverID = params.server_id?.trim(); + if (!serverID) { + throw new Error("Server ID is required."); + } + + const channelID = params.channel_id?.trim(); + if (!channelID) { + throw new Error("Channel ID is required."); + } + + let offset: number | undefined; + { + const inputOffset = searchParams.get("o"); + + if (inputOffset) { + offset = parseOffset(inputOffset, 150); + } + } + + const channels = await fetchDiscordServer(serverID); + const messages = await fetchDiscordChannel(channelID, offset); + + return { + serverID, + channelID, + channels, + messages, + offset, + }; +} diff --git a/client/src/pages/discord.html b/client/src/pages/discord.html deleted file mode 100644 index 328a52e..0000000 --- a/client/src/pages/discord.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - {{ g.site_name }} - - - - - - - -
    -
    -
    - -
    -
    - - - - \ No newline at end of file diff --git a/client/src/pages/discord.module.scss b/client/src/pages/discord.module.scss new file mode 100644 index 0000000..13cf119 --- /dev/null +++ b/client/src/pages/discord.module.scss @@ -0,0 +1,5 @@ +.main { + display: flex; + flex-direction: row; + gap: 1em; +} diff --git a/client/src/pages/discord.tsx b/client/src/pages/discord.tsx new file mode 100644 index 0000000..5ef9a8c --- /dev/null +++ b/client/src/pages/discord.tsx @@ -0,0 +1,39 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { fetchDiscordServer } from "#api/profiles/discord"; +import { PageSkeleton } from "#components/pages"; +import { DiscordServer } from "#entities/posts"; + +import * as styles from "./discord.module.scss"; + +interface IProps { + serverID: string; + channels: { id: string; name: string }[]; +} + +export function DiscordServerPage() { + const { serverID, channels } = useLoaderData() as IProps; + const title = "Discord server"; + const heading = "Discord Server"; + + return ( + +
    + +
    +
    + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const serverID = params.server_id?.trim(); + if (!serverID) { + throw new Error("Server ID is required."); + } + + const channels = await fetchDiscordServer(serverID); + + return { + serverID, + channels, + }; +} diff --git a/client/src/pages/dmca.tsx b/client/src/pages/dmca.tsx new file mode 100644 index 0000000..821f25a --- /dev/null +++ b/client/src/pages/dmca.tsx @@ -0,0 +1,144 @@ +import { PageSkeleton } from "#components/pages"; + +export function DMCAPage() { + const title = "DMCA Notice"; + const heading = "DMCA Notice"; + + return ( + +

    + Please allow up to 3-5 working days for your request to be processed. + You may not receive a response unless further information is needed from + you. +

    + +

    + This information is required by the DMCA process. If any required + information is falsified or omitted, your request may be not be + processed. +

    + +

    + Notices may be shared to third parties for due diligence and transparency + purposes. +

    + +

    + Please be aware that information that is not protected by copyright may + not be removed from the site. This includes AI generated content, + creator tags, creator profiles, wiki pages, links to social media + profiles or other websites, links to works on other websites, and other + factual information not protected by copyright law. +

    + +

    + Please note that we will only honor content removal requests from the + following parties: +

    + +
      +
    • Legal copyright holder of the content
    • +
    • Legal copyright holder of the character(s)
    • +
    • The commissioner(s) of the content
    • +
    + +

    + Please consult the guide below for further information regarding when + it's acceptable to submit a takedown request and when it's not. +

    + +

    + You SHOULD submit a takedown request if you are one of + the following: +

    + +
      +
    • Creator wanting their own content removed.
    • +
    • + Character owner wanting content featuring their character removed. +
    • +
    • A commissioner who has paid for the content in question.
    • +
    • + Publisher wanting a publication or excerpts of a publication removed. +
    • +
    + +

    + You SHOULD NOT submit a takedown request if you are one + of the following: +

    + +
      +
    • + User wanting content removed because they believe it breaks a site + rule. You should instead use the site's Flag For Deletion tool (found + on every post's page) for each post that you wish to dispute. +
    • +
    • + Friend, relative, or fan of an creator, character owner, or + commissioner who wishes to act as a middlemen for the creator, + character owner, or commissioner. +
    • +
    • + Commissioner or character owner wanting to remove art that the creator + themselves has posted. In those cases please ask the creator to file a + takedown request for you. +
    • +
    + +

    Your email must include the following:

    + +
      +
    • + Your contact information, including your name, physical address, phone + number, and email address. +
    • +
    • + Identification of the material you wish to have removed, with enough + information to locate the material. For example, a list of links to + each post on Kemono you wish to have removed. Screenshots or simply + listing your creator tag, creator name, or social media accounts are + not sufficient to locate the exact material you wish to have removed. +
    • +
    • + Identification of the copyrighted work you claim is being infringed. + For example, for each Kemono post you claim infringes on your + copyright, a link to where the original work was posted on your Pixiv, + Twitter, or other social media accounts or personal websites. +
    • +
    • + A statement that you have a good faith belief that the use of the work + you believe is being infringed was not authorized by the copyright + owner, an agent of the owner, or the law. +
    • +
    • + A statement that everything contained in the takedown notice is + accurate and that, under penalty of perjury, you are the copyright + owner or have permission to act on the copyright owner’s behalf. +
    • +
    • + Your signature. This must be your full legal name, not a pseudonym or + creator handle. +
    • +
    + +

    + This notice can be sent via email to us on our Legal Inquiries address + found on the contact page. +

    + +

    + + Failure to follow these instructions, or emailing it to the wrong + department, or emailing all three departments at once will get your + notice discarded. + +

    + +

    + For further assistance, or for any questions regarding takedowns, please{" "} + contact us. +

    +
    + ); +} diff --git a/client/src/pages/documentation/api.module.scss b/client/src/pages/documentation/api.module.scss new file mode 100644 index 0000000..6abe3a2 --- /dev/null +++ b/client/src/pages/documentation/api.module.scss @@ -0,0 +1,4 @@ +.block { + background: #ffffff; + width: 100%; +} diff --git a/client/src/pages/documentation/api.tsx b/client/src/pages/documentation/api.tsx new file mode 100644 index 0000000..6cda990 --- /dev/null +++ b/client/src/pages/documentation/api.tsx @@ -0,0 +1,27 @@ +import { Helmet } from "@dr.pogodin/react-helmet"; +import SwaggerUI from "swagger-ui-react"; +import { PageSkeleton } from "#components/pages"; + +// TODO: path alias it after moving out of server folder +import schema from "../../../../schema/public/api.yaml"; + +import "swagger-ui-react/swagger-ui.css"; +import * as styles from "./api.module.scss"; + +export function Component() { + const title = "API documenation"; + const heading = "API Documenation"; + + return ( + + + + +
    + +
    +
    + ); +} + +Component.displayName = "APIDocumentationPage"; diff --git a/client/src/pages/error.html b/client/src/pages/error.html deleted file mode 100644 index d6a82e7..0000000 --- a/client/src/pages/error.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends 'components/shell.html' %} -{% block content %} -

    Error

    -

    {{ props.get('message') }}

    - {% if props.get('redirect') %} - -

    Redirecting you back...

    - {% endif %} -{% endblock %} \ No newline at end of file diff --git a/client/src/pages/errors/404.tsx b/client/src/pages/errors/404.tsx new file mode 100644 index 0000000..b1fa0b3 --- /dev/null +++ b/client/src/pages/errors/404.tsx @@ -0,0 +1,22 @@ +import { KemonoLink } from "#components/links"; +import { useNavigate } from "react-router"; +import * as styles from "./errors.module.scss"; + +export function Error404() { + const navigate = useNavigate(); + + function goBack() { + navigate(-1); + } + + return ( +
    +

    404

    +
    The page you are looking for does not exist.
    +
    + Home{" | "} + Go Back +
    +
    + ) +} diff --git a/client/src/pages/errors/errors.module.scss b/client/src/pages/errors/errors.module.scss new file mode 100644 index 0000000..37722e0 --- /dev/null +++ b/client/src/pages/errors/errors.module.scss @@ -0,0 +1,13 @@ +.errorPage { + width: fit-content; + margin-left: auto; + margin-right: auto; + margin-top: 10vh; + text-align: center; + + h1 { + margin-bottom: 5vh; + font-size: 500%; + user-select: none; + } +} diff --git a/client/src/pages/fanboximports.tsx b/client/src/pages/fanboximports.tsx new file mode 100644 index 0000000..0c0ab57 --- /dev/null +++ b/client/src/pages/fanboximports.tsx @@ -0,0 +1,38 @@ +import { PageSkeleton } from "#components/pages"; + +export function FanboxImportsPage() { + const title = "Fanbox Importer"; + const heading = "Fanbox Importer"; + + return ( + +

    + Auto-Import is disabled, please import the keys at your own discretion. +

    +

    + While we made sure to take steps to prevent detection and association of + the accounts with our importing, we can not make any guarantees. +

    +

    + This is a test run that is not optimized for performance but rather for + consistency and human emulation. +

    +

    + The system is accessible in this testing phase, if you submit your + fanbox key it should start importing most of your data with the improved + importer logic. +

    +

    + Once the testing is finished, we will scale up the services required for + more performant importing. +

    +

    + In case of you getting a notification from fanbox, do contact us via + Telegram and Chan that can be found in the bottom of the menu to the + left, or send an email to{" "} + contact@kemono.su +

    +

    Do include the content/screenshot of the notification from fanbox.

    +
    + ); +} diff --git a/client/src/pages/favorites.html b/client/src/pages/favorites.html deleted file mode 100644 index f76a296..0000000 --- a/client/src/pages/favorites.html +++ /dev/null @@ -1,111 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/user.html' import user_card, user_card_header %} -{% from 'components/cards/post.html' import post_card %} -{% from 'components/ads.html' import slider_ad, header_ad, footer_ad %} - -{% block scripts_extra %} - -{% endblock scripts_extra %} - -{% block content %} -{{ slider_ad() }} -
    - {{ header_ad() }} -
    -

    Favorite {{ g.artists_or_creators if props.fave_type == 'artist' else 'Posts' }}

    -
    - - {% if source == 'session' %} -
    - - - - - - - - - - - - - - -
    NameService
    This feature requires Javascript.
    - -
    - {% else %} - - {% if props.fave_type == "artist" %} -
    - {% include 'components/paginator.html' %} -
    - - {% call card_list('phone') %} - {% for user in results %} - {{ user_card(user, is_updated=true) }} - {% else %} -

    Nobody here but us chickens!

    -

    - There are no {{ g.artists_or_creators|lower }}. -

    - {% endfor %} - {% endcall %} - -
    - {% include 'components/paginator.html' %} -
    - {% else %} -
    - {% include 'components/paginator.html' %} -
    - - {% call card_list() %} - {% for post in results %} - {{ post_card(post) }} - {% else %} -

    Nobody here but us chickens!

    -

    - There are no more posts. -

    - {% endfor %} - {% endcall %} - -
    - {% include 'components/paginator.html' %} -
    - {% endif %} - {% endif %} - {{ footer_ad() }} -
    -{% endblock content %} diff --git a/client/src/pages/favorites.scss b/client/src/pages/favorites.scss deleted file mode 100644 index 8b279b6..0000000 --- a/client/src/pages/favorites.scss +++ /dev/null @@ -1,16 +0,0 @@ -.site-section--favorites { - div.dropdowns { - display: grid; - grid-template-columns: max-content max-content; - grid-gap: 5px; - justify-content: center; - } - - div.dropdowns > label { - text-align: right; - } - - div.dropdowns > label:after { - content: ":"; - } -} diff --git a/client/src/pages/favorites.tsx b/client/src/pages/favorites.tsx new file mode 100644 index 0000000..dbb7231 --- /dev/null +++ b/client/src/pages/favorites.tsx @@ -0,0 +1,6 @@ +import { redirect } from "react-router"; +import { createAccountFavoriteProfilesPageURL } from "#lib/urls"; + +export async function loader() { + return redirect(String(createAccountFavoriteProfilesPageURL())); +} diff --git a/client/src/pages/file/archive.module.scss b/client/src/pages/file/archive.module.scss new file mode 100644 index 0000000..ce9fe0a --- /dev/null +++ b/client/src/pages/file/archive.module.scss @@ -0,0 +1,35 @@ +@use "../../css/config/variables/sass.scss" as *; + +.article { + h3 { + margin-bottom: 0.25em; + } + + .error { + color: var(--negative-colour1-primary); + } + + .code { + height: 30px; + user-select: all; + background-color: var(--colour1-secondary); + border: 1px solid var(--colour1-tertiary); + border-radius: 5px; + padding: 2px; + top: 1px; + } + + section { + margin-top: 1em; + + ul { + margin-top: 4px; + } + } + + input[type="submit"]:disabled { + color: hsl(0deg 0% 40%); + background-image: linear-gradient(#4a5059, #4a5059); + cursor: progress; + } +} diff --git a/client/src/pages/file/archive.tsx b/client/src/pages/file/archive.tsx new file mode 100644 index 0000000..1c5e72c --- /dev/null +++ b/client/src/pages/file/archive.tsx @@ -0,0 +1,176 @@ +import { + LoaderFunctionArgs, + useLoaderData, + useNavigate, +} from "react-router"; +import { apiFetchArchiveFile, apiSetArchiveFilePassword } from "#api/files"; +import { PageSkeleton } from "#components/pages"; +import { IS_FILE_SERVING_ENABLED } from "#env/env-vars"; +import { createArchiveFileURL } from "#lib/urls"; +import { KemonoLink } from "#components/links"; +import { IArchiveFile } from "#api/files"; +import { FormEvent, useState } from "react"; + +import * as styles from "./archive.module.scss"; + +interface IProps { + archive: IArchiveFile; +} + +interface IFileItemProps { + name: string; + archiveHash: string; + archiveExtension: string; + password?: string; +} + +function FileItem({ + name, + archiveHash, + archiveExtension, + password, +}: IFileItemProps) { + return ( +
  • + {!IS_FILE_SERVING_ENABLED ? ( + name + ) : ( + + {name} + + )} +
  • + ); +} + +export function ArchiveFilePage() { + const { archive: { file: { hash, ext }, file_list, password: loaderPassword } } = useLoaderData() as IProps; + const title = `Archive file "${hash}" details`; + const heading = "Archive File Details"; + const [error, setError] = useState(""); + const [password, setPassword] = useState(loaderPassword); + const [loading, setLoading] = useState(false); + const navigate = useNavigate(); + + async function submitPassword(event: FormEvent) { + event.preventDefault(); + let form = event.target as HTMLFormElement; + let password = (form.elements.namedItem("password-input") as HTMLInputElement).value; + if (!password) { + setError("Please enter a password."); + } else { + setLoading(true); + try { + await apiSetArchiveFilePassword(hash, password); + setPassword(password); + } catch { + setError("Invalid password"); + } finally { + setLoading(false); + } + } + } + + return ( + + + navigate(-1)}>« Go Back{" | "} + Find Posts + +
    +
    +

    Hash: {hash}

    + {password ? ( +
    Password: {password}
    + ) : (password === "") ? ( + <> + Password required but not found. +
    + + + +
    + + ) : ( + <>Password not required. + )} +
    + +
    +
    Files
    + {file_list.length === 0 ? ( + <>Archive is empty or missing password. + ) : ( +
      + {file_list.map((filename, index) => ( + + ))} +
    + )} +
    +
    +
    + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const fileHash = params.file_hash?.trim(); + + if (!fileHash) { + throw new Error("File hash is required."); + } + + const archive = await apiFetchArchiveFile(fileHash); + + if (!archive) { + throw new Error("Archive file not found."); + } + + return { + archive, + }; +} +/* +export async function action({ params, request }: ActionFunctionArgs) { + try { + const method = request.method; + + switch (method) { + case "PATCH": { + const fileHash = params.file_hash?.trim(); + + if (!fileHash) { + throw new Error("File hash is required."); + } + + const data = await request.formData(); + const password = data.get("password") as string | null; + + if (!password) { + throw new Error("Password is required."); + } + + await apiSetArchiveFilePassword(fileHash, password); + const url = String(createFilePageURL(fileHash)); + + return redirect(url); + } + + default: { + throw new Error(`Unknown method "${method}".`); + } + } + } catch (error) { + return error; + } +} +*/ diff --git a/client/src/pages/file/legacy.tsx b/client/src/pages/file/legacy.tsx new file mode 100644 index 0000000..6e046a0 --- /dev/null +++ b/client/src/pages/file/legacy.tsx @@ -0,0 +1,40 @@ +import { + LoaderFunctionArgs, + useLoaderData, + useNavigate, +} from "react-router"; +import { createFilePageURL } from "#lib/urls"; +import { useEffect } from "react"; + +interface IProps { + hash: string; +} +// doing this roundabout way because `redirect` returned from loaders +// doesn't overwrite history stack, even if redirect is "permanent" + +export function LegacyFilePage() { + const { hash } = useLoaderData() as IProps; + const navigate = useNavigate(); + + const url = String(createFilePageURL(hash)); + + useEffect(() => { + navigate(url, { replace: true }); + }, []); + + return <>; +} + +export async function loader({ params }: LoaderFunctionArgs) { + const fileHash = params.file_hash?.trim(); + + if (!fileHash) { + throw new Error("File hash is required."); + } + + const props: IProps = { + hash: fileHash, + }; + + return props; +} diff --git a/client/src/pages/gumroad-and-co.tsx b/client/src/pages/gumroad-and-co.tsx new file mode 100644 index 0000000..780b755 --- /dev/null +++ b/client/src/pages/gumroad-and-co.tsx @@ -0,0 +1,54 @@ +import { PageSkeleton } from "#components/pages"; + +export function GumroadAndCoPage() { + const title = "Gumroad and Co"; + const heading = "Gumroad and Co"; + + return ( + +

    TL;DR (browse ») == archive password sharing and validation

    + +

    + To make a long story short, you are now able to list (not view) the + contents of the archives and submit passwords for archives that are + password protected. +
    + Upon submitting the correct password, the page will re-load and display + the valid password. +

    + +

    + + As for gumroad, they sure are deep-throating the payment processors, + shaft and balls. + {" "} + We'll see how it goes, but we do know where it'll end. +
    + Either way, we didn't expect this to happen this fast. The importer is + being worked on every day to scrape whatever is missing. +
    + And to you, who are submitting keys, please check if your key contains + "...", browsers are kind of shit and will abbreviate anything that is + "too long". +

    +

    + If you see something missing from your imports (contents, posts, reward + text, etc.), do contact us via Telegram and Chan, which can be found at + the bottom of the menu to the left, or send an email to{" "} + contact@kemono.su +

    + +

    + In regard to Account Linking. You do not need to cross-link (A{">"}B,B + {">"}A) the profiles, a single direction is more than enough: (A{">"}B,A + {">"}C,A{">"}D) or (A{">"}B,B{">"}C,C{">"}D). +

    + +

    + Also, I think it was never mentioned, but there exists a cookie + "thumbSize" for this site, which controls the size of the displayed + tiles. +

    +
    + ); +} diff --git a/client/src/pages/help/faq.html b/client/src/pages/help/faq.html deleted file mode 100644 index c7788c1..0000000 --- a/client/src/pages/help/faq.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends 'components/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'components/navigation/local.html' import local_nav, local_list, local_item %} -{% from 'components/lists/faq.html' import faq_list, faq_section, faq_question, faq_answer %} - -{% set page_title = 'Frequently Asked Questions | ' ~ g.site_name %} - -{% block title %} - - {{ page_title }} - -{% endblock title %} - -{% block content %} -{% call site.section('help-faq', 'Frequently Asked Questions') %} - {% call local_nav(id="faq-nav") %} -

    Table of contents

    - {% call local_list() %} - {{ local_item("id1", "question1") }} - {{ local_item("id2", "question2") }} - {% endcall %} - {% endcall %} - -

    FAQ

    - {% call faq_list() %} - {% call faq_section(id="id1") %} - {% call faq_question() %} - question1 - {% endcall %} - - {% call faq_answer() %} - answer1 - {% endcall %} - {% endcall %} - - {% call faq_section(id="id2") %} - {% call faq_question() %} - question2 - {% endcall %} - - {% call faq_answer() %} - answer2 - {% endcall %} - {% endcall %} - {% endcall %} -{% endcall %} -{% endblock content %} diff --git a/client/src/pages/help/license.html b/client/src/pages/help/license.html deleted file mode 100644 index dff0ee5..0000000 --- a/client/src/pages/help/license.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends 'components/shell.html' %} - -{% block content %} -
    -
    -

    Open Source

    -

    - This website is running Kemono 2, which is provided for free under the BSD-3 License.
    -

    -          
    -Copyright 2020 kemono.party
    -
    -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
    -
    -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    -
    -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    -
    -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    -
    -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
    -          
    -      
    -
    -
    -{% endblock %} diff --git a/client/src/pages/help/posts.html b/client/src/pages/help/posts.html deleted file mode 100644 index 87a825d..0000000 --- a/client/src/pages/help/posts.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends 'components/shell.html' %} - -{% block content %} -
    -
    -

    Posts

    -

    - A green border means the post is the parent of one or more "child" images.
    - A yellow border means the image has a parent.
    - An orange border means the post is user-shared.
    -
    - Multiple edits of the same post can appear on one page. -

    -

    Searching Posts

    -

    - Searching for posts is straightforward. Enter the terms you want to search for, and both titles and descriptions will be scanned for your query. For example, searching for mio yuuko will return every post that has both mio and yuuko in it. You can also exclude a term by putting a hyphen (-) in front of it, and search for a phrase by putting quotation marks around it. They work about how you would expect.
    - Please note that {{ g.site_name }} has limited support for non-English search terms due to database limitations. Most notably, Japanese characters cannot be searched. -

    -

    Flagging

    -

    - If there's something wrong with a post (like damaged/corrupted files) you can click Flag for reimport to have it purged and redownloaded the next time the importer encounters its ID. After that, simply import as usual. -

    -
    -
    -{% endblock %} diff --git a/client/src/pages/home.html b/client/src/pages/home.html deleted file mode 100644 index 396510c..0000000 --- a/client/src/pages/home.html +++ /dev/null @@ -1,58 +0,0 @@ -{% extends 'components/shell.html' %} - -{% import 'components/site.html' as site %} -{% from "components/links.html" import kemono_link %} - -{% block content %} - {% call site.section("home") %} - {% if g.banner_welcome %} - {{ g.banner_welcome|safe }} - {% endif %} -
    -
    - {% if g.mascot_path %} -
    -
    - -
    -
    - {% endif %} -
    - {% if g.logo_path %} -
    - -
    - {% endif %} -

    - {{ g.site_name }} is a public archiver for: -

    -
      - {% for paysite in g.paysite_list %} -
    • - {{ g.paysites[paysite].title }} -
    • - {% endfor %} -
    -

    - Contributors here upload content and share it here for easy searching and organization. To get started viewing content, either search for creators on the {{ kemono_link("/artists", g.artists_or_creators|lower ~ " page")}}, or search for content on the {{ kemono_link("/posts", "posts page") }}. If you want to contribute content, head over to the {{ kemono_link("/importer", "import page") }}. -

    - {% if g.welcome_credits %} -
    - {{ g.welcome_credits|safe }} -
    - {% endif %} -
    -
    - {% for announcement in g.announcements %} -
    -
    -

    {{ announcement.title }}

    -
    {{ announcement.date }}
    -
    -

    - {{ announcement.content|safe }} -

    -
    - {% endfor %} - {% endcall %} -{% endblock %} diff --git a/client/src/pages/home.scss b/client/src/pages/home.scss index 448eb1c..64b4d60 100644 --- a/client/src/pages/home.scss +++ b/client/src/pages/home.scss @@ -1,34 +1,36 @@ -@use "../css/config/variables" as *; +@use "../css/config/variables/sass" as *; -.site-section--home { -} // minheights +div.content-wrapper { + display: flex; + flex-direction: column; +} + .jumbo-welcome { overflow-y: hidden; position: relative; display: flex; - flex-direction: row; + flex-flow: row nowrap; box-shadow: 0 1px 3px rgb(0 0 0 / 25%); - align-items: center; - justify-content: flex-end; min-height: 450px; background-color: rgba(0, 0, 0, 0.7); - margin: 0.5rem; - @media (max-width: $width-tablet) { - background-color: #3b3e44; - } + padding: $size-small; + height: 100%; } .jumbo-welcome-mascot { transform: translateZ(0); display: flex; - max-height: 450px; width: 100%; height: 100%; @media (max-width: $width-tablet) { display: none; } + + div { + max-height: 70vh; + } } .jumbo-welcome-description { diff --git a/client/src/pages/home.tsx b/client/src/pages/home.tsx new file mode 100644 index 0000000..2d62361 --- /dev/null +++ b/client/src/pages/home.tsx @@ -0,0 +1,102 @@ +import { + ARTISTS_OR_CREATORS, + BANNER_WELCOME, + HOME_BACKGROUND_IMAGE, + HOME_LOGO_PATH, + HOME_MASCOT_PATH, + HOME_WELCOME_CREDITS, + SITE_NAME, +} from "#env/env-vars"; +import { AVAILABLE_PAYSITE_LIST } from "#env/derived-vars"; +import { PageSkeleton } from "#components/pages"; +import { KemonoLink } from "#components/links"; + +export function HomePage() { + const title = "Welcome"; + + return ( + + {!BANNER_WELCOME ? undefined : ( +
    + )} + +
    +
    + + {!HOME_MASCOT_PATH ? undefined : ( +
    +
    + +
    +
    + )} + + +
    + + {BUNDLER_ENV_HOME_ANNOUNCEMENTS?.map((announcement) => ( +
    +
    +

    {announcement.title}

    +
    {announcement.date}
    +
    +

    +

    + ))} + + ); +} + +function Description() { + return ( +
    + {!HOME_LOGO_PATH ? undefined : ( +
    + +
    + )} + +

    + {SITE_NAME} is a public archiver for: +

    + +
      + {AVAILABLE_PAYSITE_LIST.map((paysite, index) => ( +
    • {paysite.title}
    • + ))} +
    + +

    + Contributors here upload content and share it here for easy searching + and organization. To get started viewing content, either search for + creators on the{" "} + + {ARTISTS_OR_CREATORS.toLowerCase()} page + + , or search for content on the{" "} + posts page. If you want to + contribute content, head over to the{" "} + import page. +

    + + {!HOME_WELCOME_CREDITS ? undefined : ( +
    + )} +
    + ); +} diff --git a/client/src/pages/importer/importer_list.module.scss b/client/src/pages/importer/importer_list.module.scss new file mode 100644 index 0000000..d886519 --- /dev/null +++ b/client/src/pages/importer/importer_list.module.scss @@ -0,0 +1,5 @@ +.error { + color: var(--negative-colour1-primary); + text-align: center; + margin-bottom: 1em; +} diff --git a/client/src/pages/importer/importer_list.tsx b/client/src/pages/importer/importer_list.tsx new file mode 100644 index 0000000..baeba0b --- /dev/null +++ b/client/src/pages/importer/importer_list.tsx @@ -0,0 +1,438 @@ +import clsx from "clsx"; +import { FormEvent, useState } from "react"; +import { redirect, useNavigate } from "react-router"; +import { PAYSITE_LIST, SITE_NAME } from "#env/env-vars"; +import { fetchCreateImport } from "#api/imports"; +import { PageSkeleton } from "#components/pages"; + +import * as styles from "./importer_list.module.scss"; + +const MAX_LENGTH = 1024; + +function titlize(s: string) { + return s.replace("_", " ").replace(/\b\w+/g, text => text.charAt(0).toUpperCase() + text.substring(1).toLowerCase()); +} + +interface Input { + name: string; + label?: string; + hint?: string; + default?: () => string; +} + +interface PaysiteForm { + name?: string; + inputs: Array; + // Returns an error message, or undefined if no errors. + validate: (...args: Array) => string | undefined; + includeDMs?: boolean; +} + +const PAYSITES: { [name: string]: PaysiteForm } = { + patreon: { + inputs: [ + { name: "session_key" }, + ], + validate({ session_key }) { + if (session_key.length != 43) + return `Invalid key: Expected 43 characters, got ${session_key.length}`; + }, + includeDMs: true, + }, + fanbox: { + name: "Pixiv Fanbox", + inputs: [ + { name: "session_key" }, + ], + validate({ session_key }) { + if (!/^\d+_\w+$/.test(session_key) || session_key.length > MAX_LENGTH) { + return "Invalid key."; + } + }, + }, + afdian: { + inputs: [ + { name: "session_key", label: "Auth Token", hint: "Can be found in cookies -> auth_token." }, + ], + validate({ session_key }) { + if (session_key.length > MAX_LENGTH) { + return "Key is too long."; + } + if (!/^[a-f0-9]+_\d+$/.test(session_key)) { + return "Invalid key."; + } + }, + }, + boosty: { + inputs: [ + { name: "session_key" }, + ], + validate({ session_key }) { + try { + JSON.parse(decodeURIComponent(session_key)); + } catch { + return "Invalid key: Expected valid JSON."; + } + }, + }, + discord: { + inputs: [ + { name: "session_key", label: "Token" }, + { name: "channel_ids", label: "Channel IDs", hint: "Separate with commas." }, + ], + validate({ session_key, channel_ids }) { + if (!/^(mfa.[a-z0-9_-]{20,})|([a-z0-9_-]{23,28}.[a-z0-9_-]{6,7}.[a-z0-9_-]{27,})/i.test(session_key)) { + return "Invalid token format."; + } + for (const id of channel_ids.split(/\s*,\s*/)) { + if (id && !parseInt(id)) { // + return `${id} is not a valid channel ID.`; + } + } + }, + }, + dlsite: { + name: "DLsite", + inputs: [ + { name: "session_key" }, + ], + validate({ session_key }) { + if (session_key.length > MAX_LENGTH) { + return "Key is too long."; + } + }, + }, + fantia: { + inputs: [ + { name: "session_key" }, + ], + validate({ session_key }) { + if (![32, 64].includes(session_key.length)) { + return "Invalid key: Expected 32 or 64 characters."; + } + }, + }, + gumroad: { + inputs: [ + { name: "session_key" }, + ], + validate({ session_key }) { + if (session_key.length < 200 || session_key.length > MAX_LENGTH) { + return `Invalid key: Expected 200 to ${MAX_LENGTH} characters.`; + } + }, + }, + subscribestar: { + name: "SubscribeStar", + inputs: [ + { name: "session_key" }, + ], + validate({ session_key }) { + if (session_key.length > MAX_LENGTH) { + return "Key is too long."; + } + }, + }, + onlyfans: { + name: "OnlyFans", + inputs: [ + { name: "session_key", hint: "Can be found in cookies -> sess." }, + { name: "auth_id", label: "User ID", hint: "Can be found in cookies -> auth_id." }, + { name: "x-bc", label: "BC Token", hint: "Can be found in local storage -> bcTokenSha. Paste localStorage.bcTokenSha into the console for easy access." }, + { + name: "user_agent", + label: "User-Agent", + hint: "This needs to be set to the User-Agent of the last device that logged into your OnlyFans account; leave it as the default value if you are on it right now.", + default: () => navigator.userAgent, + }, + ], + validate({ session_key, auth_id: user_id, "x-bc": bc_token, user_agent }) { + if (session_key.length > MAX_LENGTH) { + return "Key is too long."; + } + if (!parseInt(user_id)) { + return "User ID must consist of only digits."; + } + if (!bc_token.match(/^[a-f0-9]{40}$/)) { + return "Invalid BC token"; + } + }, + }, + fansly: { + inputs: [ + { + name: "session_key", + hint: ` + Copy the following string and enter it into the browser Console, + accessible by pressing F12. + btoa(JSON.stringify({...JSON.parse(localStorage?.session_active_session||'{}'),device:localStorage?.device_device_id})) + ` + }, + ], + validate({ session_key }) { + if (session_key.length == 71 && !/^[A-Za-z0-9]{71}$/.test(session_key)) { + return "The key doesn't match the required pattern."; + } + try { + if (!JSON.parse(atob(session_key))?.token) { + return "Token not found in JSON."; + } + } catch { + return "Key is not valid JSON." + } + }, + includeDMs: true, + }, + candfans: { + name: "CandFans", + inputs: [ + { name: "session_key", hint: "On CandFans page, Press F12 -> \"Application\" tab (check >> if its hidden) -> Storage: Cookies -> candfans.jp -> secure_candfans_session value." }, + ], + validate({ session_key }) { + try { + let keys = Object.keys(JSON.parse(atob(decodeURIComponent(session_key)))); + if (!["mac", "iv", "tag", "value"].every(key => keys.includes(key))) { + return "The key does not contain the appropriate values."; + } + } catch { + return "The key was not decodable."; + } + }, + } +} + +/** + * TODO: split into separate pages per service + */ +export function ImporterPage() { + const [selectedService, changeSelectedService] = useState(PAYSITE_LIST[0]); + const [error, setError] = useState(undefined); + const navigate = useNavigate(); + const title = "Import paywall posts/comments/DMs"; + const heading = "Import from Paysite"; + + async function onSubmit(event: FormEvent) { + event.preventDefault(); + setError(undefined); + let form = event.target as HTMLFormElement; + let inputs = form.querySelectorAll("input"); + let args: {[key: string]: string} = { service: selectedService }; + inputs.forEach(el => { + if (el.type == "checkbox") { + args[el.name] = el.checked ? "1" : "0"; + } else { + args[el.name] = el.value.trim(); + } + }); + let error = PAYSITES[selectedService].validate(args); + if (error) { + setError(error); + } else { + try { + let { import_id } = await fetchCreateImport(args as any); + await navigate(`/importer/status/${import_id}`); + } catch (resp: any) { + setError(resp.message) + } + } + } + + return ( + +
    +
    + + +
    + + {PAYSITES[selectedService].inputs.map((input, index) => { + return ( +
    + + + {index === 0 && ( + + Learn how to get your session key. + + )} + {input.hint && ( + + )} +
    + ) + })} + + {PAYSITES[selectedService].includeDMs && ( + + )} + + + + + + {selectedService == "fanbox" && ( + + )} + + + + + + +

    Important information

    +

    + Your session key is used to scrape paid posts from your feed. After + downloading missing posts, the key is immediately discarded and never + stored without permission. +

    + + {!PAYSITE_LIST.includes("fantia") ? undefined : ( + <> +

    Fantia

    +
      +
    • + At least one paid content must be unlocked for the post to be + imported. Free posts cannot be archived at this time. +
    • +
    • + In order to download post contents accurately, the importer will + automatically enable adult-viewing mode for duration of the import + if you have it turned off.{" "} + Do not change back to general-viewing during imports. +
    • +
    + + )} + +

    Auto-import

    +

    + The auto-import feature allows users to give {SITE_NAME} permission to + automatically detect and retrieve new posts and creators by storing + session keys long-term, without need for manual key submission. All keys + are encrypted using a strong RSA 4096 key. When the administrators start + a new autoimport round, a computer outside of {SITE_NAME}'s + infrastucture sends the private key to the backend, allowing it to + decrypt all working keys and start import tasks. Even if {SITE_NAME}'s + private database were to somehow be compromised, your tokens would + remain anonymous and secure. +
    + If you are logged into {SITE_NAME}, any key you submit with autoimport + enabled can be managed under the Keys section of your{" "} + [Account] tab in the header. There, you will be able to view + import logs or revoke access.{" "} + Please note that anonymously-submitted keys cannot be managed. +

    +
    + ); +} diff --git a/client/src/pages/importer/importer_ok.tsx b/client/src/pages/importer/importer_ok.tsx new file mode 100644 index 0000000..dae601b --- /dev/null +++ b/client/src/pages/importer/importer_ok.tsx @@ -0,0 +1,14 @@ +import { PageSkeleton } from "#components/pages"; + +export function ImporterOKPage() { + return ( + +

    + Your session key has been submitted to the server. Posts will be added + soon. Thank you for contributing! +
    + If you're having trouble with the importer, contact admin. +

    +
    + ); +} diff --git a/client/src/pages/importer/importer_status.module.scss b/client/src/pages/importer/importer_status.module.scss new file mode 100644 index 0000000..ff82227 --- /dev/null +++ b/client/src/pages/importer/importer_status.module.scss @@ -0,0 +1,5 @@ +@use "../../css/config/variables/sass" as *; + +.importList { + padding-left: 48px; +} diff --git a/client/src/pages/importer_status.scss b/client/src/pages/importer/importer_status.scss similarity index 97% rename from client/src/pages/importer_status.scss rename to client/src/pages/importer/importer_status.scss index e016f62..573af18 100644 --- a/client/src/pages/importer_status.scss +++ b/client/src/pages/importer/importer_status.scss @@ -1,4 +1,4 @@ -@use "../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .site-section--importer-status { .import { diff --git a/client/src/pages/importer/importer_status.tsx b/client/src/pages/importer/importer_status.tsx new file mode 100644 index 0000000..c401a5b --- /dev/null +++ b/client/src/pages/importer/importer_status.tsx @@ -0,0 +1,138 @@ +import { + LoaderFunctionArgs, + useLoaderData, +} from "react-router"; +import { createAccountDMsReviewPageURL } from "#lib/urls"; +import { fetchHasPendingDMs } from "#api/dms"; +import { fetchImportLogs } from "#api/imports"; +import { getLocalStorageItem, setLocalStorageItem } from "#storage/local"; +import { PageSkeleton } from "#components/pages"; +import { LoadingIcon } from "#components/loading"; + +import * as styles from "./importer_status.module.scss"; +import { KemonoLink } from "#components/links"; +import { useEffect, useState } from "react"; + +interface IProps { + importId: string; + isDMS?: boolean; +} + +export function ImporterStatusPage() { + const { importId, isDMS } = useLoaderData() as IProps; + const title = `Import "${importId}" logs`; + const heading = `Importer Logs for ${importId}`; + const cooldown = 15_000; + const [reverse, setReverse] = useState(false); + const [logs, setLogs] = useState | null>(null); + const [finished, setFinished] = useState(false); + + useEffect(() => { + if (finished) return; + async function fetchLogs() { + try { + let resp = await fetchImportLogs(importId); + setLogs(reverse ? [...resp].reverse() : [...resp]); + if (resp?.[resp?.length - 1]?.match(/Finished/i)) { + setFinished(true); + } else { + setFinished(false); + } + } catch (error) { + console.log(error) + } + } + + fetchLogs(); + + const id = setInterval(fetchLogs, cooldown); + + return () => clearInterval(id); + }, [reverse, finished]); + + function toggleReverse() { + setReverse(!reverse); + setLogs(logs?.reverse() ?? []); + } + + return ( + + {!logs ? ( +

    + Wait until logs load... +

    + ) : logs.length ? ( + <> + {isDMS && ( +
    + Hey! +

    + You gave the importer permission to access your messages. To protect your anonymity, you must manually approve each one. Wait until after the importer says Done importing DMs, then go go{" "} + + here + {" "} + to choose which ones you wish to import. to choose which ones you wish to import. +

    +
    + )} +
    +
    + Status: {finished ? "Completed" : "In Progress"} + Total: {logs?.length} +
    + +
    +
      + {logs?.map((message, index) => ( +
    1. {message}
    2. + ))} +
    + + ) : ( +

    No logs found!

    + )} +
    + ); +} + +async function initPendingReviewDms( + forceReload = false, + minutesForRecheck = 30 +) { + let hasPendingReviewDms = getLocalStorageItem("has_pending_review_dms") === "true"; + const lastCheckedHasPendingReviewDms = parseInt( + getLocalStorageItem("last_checked_has_pending_review_dms") ?? "0", + 10 + ); + + if ( + forceReload || + !lastCheckedHasPendingReviewDms || + lastCheckedHasPendingReviewDms < Date.now() - minutesForRecheck * 60 * 1000 + ) { + hasPendingReviewDms = await fetchHasPendingDMs(); + setLocalStorageItem("has_pending_review_dms", String(hasPendingReviewDms)); + localStorage.setItem( + "last_checked_has_pending_review_dms", + Date.now().toString() + ); + } +} + +export async function loader({ + params, + request, +}: LoaderFunctionArgs): Promise { + const importId = params.import_id?.trim(); + if (!importId) { + throw new Error("Import ID is required."); + } + + const searchparams = new URL(request.url).searchParams; + let isDMS = Boolean(searchparams.get("dms")?.trim()); + + return { + importId, + isDMS, + }; +} diff --git a/client/src/pages/importer/importer_tutorial.tsx b/client/src/pages/importer/importer_tutorial.tsx new file mode 100644 index 0000000..d3c5384 --- /dev/null +++ b/client/src/pages/importer/importer_tutorial.tsx @@ -0,0 +1,154 @@ +import { ARTISTS_OR_CREATORS, SITE_NAME } from "#env/env-vars"; +import { PageSkeleton } from "#components/pages"; + +export function ImporterTutorialPage() { + return ( + +

    + Patreon, Fanbox, SubscribeStar, Gumroad, DLsite, Fantia, Boosty, Afdian +

    +

    + {SITE_NAME} needs your session key in order to access posts from the{" "} + {ARTISTS_OR_CREATORS.toLowerCase()} you are subscribed to. +

    +

    Below are the respective cookies for the supported paysites.

    + +
      +
    • + For Patreon, your session key is under{" "} + session_id. +
    • +
    • + For Fanbox, your session key is under{" "} + FANBOXSESSID. +
    • +
    • + For Gumroad, your session key is under{" "} + _gumroad_app_session. +
    • +
    • + For SubscribeStar, your session key is under{" "} + _personalization_id. +
    • +
    • + For DLsite, your session key is under{" "} + __DLsite_SID. +
    • +
    • + For Fantia, your session key is under{" "} + _session_id. +
    • +
    • + For Boosty, your session key is under{" "} + auth. +
    • +
    • + For Afdian, your session key is under{" "} + auth_token. +
    • +
    + +

    + After going to the paysite you want to import and signing in, ( + Patreon/ + Fanbox/ + Gumroad/ + SubscribeStar/ + DLsite English/ + DLsite Japan/ + Fantia/ + Boosty/ + Afdian) you need to find where cookies + are located in your browser. +

    + +

    Chrome

    +
      +
    • + Press F12 to open Developer tools. If it didn't work for you try + Ctrl+Shift+I or right click inspect element. +
    • +
    • + In the menu at the top, navigate to "Application" tab, if this isn't + visible at a first glance simply press {">"} + {">"} for more tabs. +
    • + Select Application in Developer tools. +
    • In the "Application" tab, go to "Cookies".
    • +
    • Within the "Cookies" dropdown, select "patreon.com".
    • +
    • + Now in list of cookies find session_id and select it, copy the + contents and that will be the value you will use. +
    • + Copy cookie in the correct menu +
    • + Paste the content of the cookie you copied and submit in the{" "} + {SITE_NAME} import page +
    • +
    + +

    Safari

    +
      +
    • + Ensure "Show Develop Menu" is enabled in Preferences ( + ⌘,) +
    • +
    • + Open Web Inspector (⌘⌥I) +
    • +
    • Go to Storage > Cookies
    • +
    • + Right-click the cookie for your service and click "Copy" +
    • +
    +

    Firefox

    +
      +
    • Open DevTools by pressing F12 and open the Storage tab
    • +
    • Go to Cookies > [site]
    • +
    • Go to Storage > Cookies
    • +
    • + Right-click the cookie for your service and click "Copy" +
    • +
    +

    + For other browsers, please consult browser documentation on how to + access stored cookies. +

    +

    Discord

    +

    Getting your token

    +
      +
    • Open Discord in browser of your choice
    • +
    • Open DevTools (F12, Safari see above)
    • +
    • Go to Console Tab
    • +
    • + Paste and execute the following snippet:{" "} + {`(webpackChunkdiscord_app.push([[''],{},e=>{m=[];for(let c in e.c)m.push(e.c[c])}]),m).find(m=>m?.exports?.default?.getToken!==void 0).exports.default.getToken()`} +
    • +
    • + A "slightly.long.string" + will be returned at the bottom of the console. Copy the contents + between "". This is your self token. +
    • +
    +

    + The above should work with most browsers and the official Discord App, + although you open the DevTools via the following combination in the App{" "} + Ctrl + Shift + I +

    +

    + Instructions on how to get the channel IDs can be found + + here. + +

    +
    + ); +} diff --git a/client/src/pages/importer/importer_tutorial_fanbox.tsx b/client/src/pages/importer/importer_tutorial_fanbox.tsx new file mode 100644 index 0000000..1dbbb4e --- /dev/null +++ b/client/src/pages/importer/importer_tutorial_fanbox.tsx @@ -0,0 +1,79 @@ +import { ARTISTS_OR_CREATORS, SITE_NAME } from "#env/env-vars"; +import { PageSkeleton } from "#components/pages"; + +export function ImporterTutorialFanboxPage() { + return ( + +

    + {SITE_NAME} needs your session key in order to access posts from the{" "} + {ARTISTS_OR_CREATORS.toLowerCase()} you are subscribed to. +

    + +

    + After going to the paysite you want to import and signing in, ( + Fanbox) you need to find where + cookies are located in your browser, follow the instructions bellow. +

    + +

    Chrome

    +
      +
    • + Press F12 to open Developer tools. If it didn't work for you try + Ctrl+Shift+I or right click inspect element. +
    • +
    • + In the menu at the top, navigate to "Application" tab, if this isn't + visible at a first glance simply press {">"} + {">"} for more tabs. +
    • + Select Application in Developer tools. +
    • In the "Application" tab, go to "Cookies".
    • +
    • Within the "Cookies" dropdown, select "fanbox.cc".
    • +
    • + Now in list of cookies find FANBOXSESSID and select it, copy the + contents and that will be the value you will use. +
    • + Copy cookie in the correct menu +
    • + Paste the content of the cookie you copied and submit in the{" "} + {SITE_NAME} import page +
    • +
    + +

    Safari

    +
      +
    • + Ensure "Show Develop Menu" is enabled in Preferences ( + ⌘,) +
    • +
    • + Open Web Inspector (⌘⌥I) +
    • +
    • Go to Storage > Cookies
    • +
    • + Right-click the cookie for your service and click "Copy" +
    • +
    + +

    Firefox

    +
      +
    • Open DevTools by pressing F12 and open the Storage tab
    • +
    • Go to Cookies > [site]
    • +
    • Go to Storage > Cookies
    • +
    • + Right-click the cookie for your service and click "Copy" +
    • +
    +

    + For other browsers, please consult browser documentation on how to + access stored cookies. +

    +
    + ); +} diff --git a/client/src/pages/importer/index.ts b/client/src/pages/importer/index.ts new file mode 100644 index 0000000..0fa2339 --- /dev/null +++ b/client/src/pages/importer/index.ts @@ -0,0 +1 @@ +export { ImporterStatusPage } from "./importer_status"; diff --git a/client/src/pages/importer_list.html b/client/src/pages/importer_list.html deleted file mode 100644 index d934496..0000000 --- a/client/src/pages/importer_list.html +++ /dev/null @@ -1,269 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/links.html' import email_link %} -{% from 'components/tooltip.html' import register_message %} - -{% block title %} - Import paywall posts/comments/DMs to {{ g.site_name }}. -{% endblock title %} - -{% block content %} -
    -

    Import from paysite

    - {% include "components/importer_states.html" %} -
    -
    - - -
    - -
    - - - - - Learn how to get your session key. - - - - - -
    -
    -
    - - Your user ID. Can be found in Cookies -> auth_id. -
    -
    - - - - BC token. Can be found in Local Storage -> bcTokenSha, or the headers of an XHR request -> x-bc.
    - Paste this on the console localStorage.bcTokenSha -
    - -
    - -
    - - - - This needs to be set to the User-Agent - of the last device that logged into your OnlyFans account; leave it as the default value if you are on it - right now. -
    - -
    - -
    - - - - comma separated, no spaces - -
    - - - - - - - - - -
    - -
    - -
    -

    Important information

    -

    - Your session key is used to scrape paid posts from your feed. After downloading missing posts, the key is - immediately discarded and never stored without permission. -

    - {% if "fantia" in g.paysite_list %} -

    Fantia

    -
      -
    • At least one paid content must be unlocked for the post to be imported. Free posts cannot be archived at - this time.
    • -
    • In order to download post contents accurately, the importer will automatically enable adult-viewing mode for - duration of the import if you have it turned off. Do not change back to general-viewing during imports. -
    • -
    - {% endif %} -

    Auto-import

    -

    - The auto-import feature allows users to give {{ g.site_name }} permission to automatically detect and retrieve new - posts and creators by storing session keys long-term, without need for manual key submission. All keys are - encrypted using a strong RSA 4096 key. When the administrators start a new autoimport round, a computer outside of - {{ g.site_name }}'s infrastucture sends the private key to the backend, allowing it to decrypt all working keys - and start import tasks. Even if {{ g.site_name }}'s private database were to somehow be compromised, your tokens - would remain anonymous and secure.
    - If you are logged into {{ g.site_name }}, any key you submit with autoimport enabled can be managed under the Keys - section of your [Account] tab in the header. There, you will be able to view import logs or revoke access. - Please note that anonymously-submitted keys cannot be managed. -

    -
    -{% endblock content %} - -{% block components %} - {{ register_message("DM import") }} -{% endblock components %} diff --git a/client/src/pages/importer_list.js b/client/src/pages/importer_list.js deleted file mode 100644 index 1d7f68f..0000000 --- a/client/src/pages/importer_list.js +++ /dev/null @@ -1,174 +0,0 @@ -import { registerMessage, showTooltip } from "@wp/components"; - -/** - * @param {HTMLElement} section - */ -export function importerPage(section) { - const isLoggedIn = localStorage.getItem("logged_in") === "yes"; - /** - * @type {HTMLFormElement} - */ - const form = document.forms["import-list"]; - const currentService = form.querySelector("#service").value; - - /** - * @type {Record} - */ - const noteLookup = { - fansly: form.querySelector(".fansly__notes"), - onlyfans: form.querySelector(".onlyfans__notes"), - fanbox: form.querySelector(".fanbox__notes"), - candfans: form.querySelector(".candfans__notes"), - other: form.querySelector(".other__notes"), - }; - switchKeyNotesToggle(currentService, noteLookup); - form.addEventListener( - "change", - processChangeForService((service) => switchKeyNotesToggle(service, noteLookup)), - ); - - /** - * @type {Record} - */ - const sectionLookup = { - discord: form.querySelector("#discord-section"), - onlyfans: form.querySelector("#onlyfans-section"), - }; - displayOnlyActiveInputSectionsFieldsRequired(currentService, sectionLookup); - form.addEventListener( - "change", - processChangeForService((service) => displayOnlyActiveInputSectionsFieldsRequired(service, sectionLookup)), - ); - - /** - * @type {Record} - */ - const DMLookup = { - patreon: true, - fansly: true, - }; - ActivateDMSection(currentService, DMLookup, form.querySelector("#dm-consent")); - form.addEventListener( - "change", - processChangeForService((service) => ActivateDMSection(service, DMLookup, form.querySelector("#dm-consent"))), - ); - ActivateFanboxTestConsentSection(currentService, form.querySelector("#fanbox-test-consent")); - form.addEventListener( - "change", - processChangeForService((service) => ActivateFanboxTestConsentSection(service, form.querySelector("#fanbox-test-consent"))), - ); - - form.addEventListener("submit", handleSubmit(isLoggedIn)); - document.getElementById("user-agent").value = navigator.userAgent; -} - -/** - * @param {function} procesingFunction - * @returns {(event: Event) => void} - */ -function processChangeForService(procesingFunction) { - return (event) => { - if (event.target.id === "service") { - event.stopPropagation(); - /** - * @type {String} - */ - const selectValue = event.target.value; - procesingFunction(selectValue); - } - }; -} - -/** - * @param {String} selectService - * @param {Record} sectionLookup - * @returns {void} - */ -function displayOnlyActiveInputSectionsFieldsRequired(selectService, sectionLookup) { - let activeSection = sectionLookup[selectService]; - Object.values(sectionLookup).forEach((section) => section.classList.add("form__section--hidden")); - Object.values(sectionLookup).forEach((section) => - section.querySelectorAll("input").forEach((input) => (input.required = false)), - ); - if (activeSection) { - activeSection.classList.remove("form__section--hidden"); - activeSection.querySelectorAll("input").forEach((input) => (input.required = true)); - } -} - -/** - * @param {String} selectService - * @param {Record} noteLookup - * @returns {void} - */ -function switchKeyNotesToggle(selectService, noteLookup) { - Object.values(noteLookup).forEach((notes) => (notes.hidden = true)); - if (noteLookup[selectService]) { - noteLookup[selectService].hidden = false; - } else { - noteLookup["other"].hidden = false; - } -} - -/** - * @param {String} selectService - * @param {Record} DMLookup - * @param {HTMLElement} dmSection - * @returns {void} - */ -function ActivateDMSection(selectService, DMLookup, dmSection) { - let isActive = DMLookup[selectService]; - if (isActive) { - dmSection.classList.remove("form__section--hidden"); - dmSection.querySelector("input").checked = true; - } else { - dmSection.classList.add("form__section--hidden"); - dmSection.querySelector("input").checked = false; - } -} - -/** - * @param {String} selectService - * @param {HTMLElement} fanboxTestConsentSection - * @returns {void} - */ -function ActivateFanboxTestConsentSection(selectService, fanboxTestConsentSection) { - let isActive = selectService === "fanbox"; - if (isActive) { - fanboxTestConsentSection.classList.remove("form__section--hidden"); - fanboxTestConsentSection.querySelector("input").checked = false; - } else { - fanboxTestConsentSection.classList.add("form__section--hidden"); - fanboxTestConsentSection.querySelector("input").checked = false; - } -} - -/** - * @param {boolean} isLoggedIn - * @returns {(event: Event) => void} - */ -function handleSubmit(isLoggedIn) { - return (event) => { - /** - * @type {HTMLFormElement} - */ - const form = event.target; - /** - * @type {HTMLInputElement} - */ - const dmConsent = form.elements["save-dms"]; - const fanboxTestConsent = form.elements["fanbox-test-consent"]; - const service = form.elements["service"]; - - if (service.value === "patreon" && dmConsent.checked && !isLoggedIn) { - event.preventDefault(); - showTooltip(dmConsent, registerMessage(null)); - } - console.log(!fanboxTestConsent.checked); - console.log(service.value); - if (service.value === "fanbox" && !fanboxTestConsent.checked) { - event.preventDefault(); - showTooltip(fanboxTestConsent, registerMessage("You need to agree.")); - } - }; -} diff --git a/client/src/pages/importer_ok.html b/client/src/pages/importer_ok.html deleted file mode 100644 index 9453195..0000000 --- a/client/src/pages/importer_ok.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'components/shell.html' %} -{% block content %} -
    - {% include "components/importer_states.html" %} -

    Success

    -

    - Your session key has been submitted to the server. Posts will be added soon. Thank you for contributing!
    - If you're having trouble with the importer, contact admin. -

    -
    -{% endblock %} \ No newline at end of file diff --git a/client/src/pages/importer_status.html b/client/src/pages/importer_status.html deleted file mode 100644 index 91adb87..0000000 --- a/client/src/pages/importer_status.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/loading_icon.html' import loading_icon %} -{% from 'components/buttons.html' import button %} - -{% block title %} - Import {{ props.import_id }} -{% endblock title %} - -{% block meta %} - -{% endblock meta %} - -{% block content %} -
    - {% include "components/importer_states.html" %} -
    -

    Importer logs for {{ props.import_id }}

    -
    - {% if props.is_dms %} -
    - Hey! -

    - You gave the importer permission to access your messages. To protect your anonymity, you must manually approve each one. Wait until after the importer says Done importing DMs, then go here to choose which ones you wish to import. -

    -
    - {% endif %} -
    -
    -
    -
    - Status: - Fetching -
    -
    - Total: - -
    -
    -
    - {{ button('Reverse order', class_name='import__reverse') }} -
    -
    - -

    - {{ loading_icon() }} Wait until logs load... -

    -
      -
    -
    -
    -{% endblock content %} - -{% block components %} - {{ log_item() }} -{% endblock components %} - -{% macro log_item() %} -
  • -{% endmacro %} diff --git a/client/src/pages/importer_status.js b/client/src/pages/importer_status.js deleted file mode 100644 index 8fa917e..0000000 --- a/client/src/pages/importer_status.js +++ /dev/null @@ -1,164 +0,0 @@ -import { kemonoAPI } from "@wp/api"; -import { createComponent } from "@wp/js/component-factory"; -import { waitAsync } from "@wp/utils"; -import { initPendingReviewDms } from "@wp/js/pending-review-dms"; - -/** - * @typedef Stats - * @property {string} importID - * @property {HTMLSpanElement} status - * @property {HTMLSpanElement} count - * @property {number} cooldown - * @property {number} retries - */ - -/** - * TODOs: - * - service heuristics - * - error handling - * @param {HTMLElement} section - */ -export async function importerStatusPage(section) { - /** - * @type {HTMLDivElement} - */ - const importInfo = section.querySelector(".import__info"); - /** - * @type {[HTMLDivElement, HTMLDivElement]} - */ - const [importStats, buttonPanel] = importInfo.children; - const [status, count] = importStats.children; - /** - * @type {Stats} - */ - const stats = { - importID: document.head.querySelector("meta[name='import_id']").content, - status: status.children[1], - count: count.children[1], - cooldown: 5000, - retries: 0, - }; - /** - * @type {HTMLParagraphElement} - */ - const loadingPlaceholder = section.querySelector(".loading-placeholder"); - /** - * @type {HTMLOListElement} - */ - const logList = section.querySelector(".log-list"); - - initButtons(buttonPanel, logList); - const logs = await kemonoAPI.api.logs(stats.importID); - - if (logs) { - populateLogList(logs, logList, loadingPlaceholder); - stats.status.textContent = "In Progress"; - stats.count.textContent = logs.length; - count.classList.remove("import__count--invisible"); - - initPendingReviewDms(true).then(() => {}) - await waitAsync(stats.cooldown); - await updateLogList(logs, logList, stats); - } else { - loadingPlaceholder.classList.add("loading-placeholder--complete"); - alert("Failed to fetch the logs, try reloading the page."); - } -} - -/** - * @param {HTMLDivElement} buttonPanel - * @param {HTMLOListElement} logList - */ -function initButtons(buttonPanel, logList) { - /** - * @type {HTMLButtonElement[]} - */ - const [reverseButton] = buttonPanel.children; - - reverseButton.addEventListener("click", reverseList(logList)); -} - -/** - * @param {HTMLOListElement} logList - * @returns {(event: MouseEvent) => void} - */ -function reverseList(logList) { - return (event) => { - logList.classList.toggle("log-list--reversed"); - }; -} - -/** - * @param {string[]} logs - * @param {HTMLOListElement} logList - * @param {HTMLParagraphElement} loadingItem - */ -function populateLogList(logs, logList, loadingItem) { - const fragment = document.createDocumentFragment(); - - logs.forEach((log) => { - const logItem = LogItem(log); - fragment.appendChild(logItem); - }); - - loadingItem.classList.add("loading-placeholder--complete"); - logList.appendChild(fragment); - logList.classList.add("log-list--loaded"); -} - -/** - * TODO: finishing condition. - * @param {string[]} logs - * @param {HTMLOListElement} logList - * @param {Stats} stats - */ -async function updateLogList(logs, logList, stats) { - let newLogs = await kemonoAPI.api.logs(stats.importID); - - if (!newLogs) { - if (stats.retries === 5) { - stats.status.textContent = "Fatal Error"; - return; - } - - await waitAsync(stats.cooldown); - stats.retries++; - return await updateLogList(logs, logList, stats); - } - - const diff = newLogs.length - logs.length; - - if (diff === 0) { - stats.cooldown = stats.cooldown * 2; - await waitAsync(stats.cooldown); - initPendingReviewDms(false, 1).then(() => {}) - return await updateLogList(logs, logList, stats); - } - - const diffLogs = newLogs.slice(newLogs.length - diff); - const fragment = document.createDocumentFragment(); - diffLogs.forEach((log) => { - const logItem = LogItem(log); - fragment.appendChild(logItem); - }); - logs.push(...diffLogs); - logList.appendChild(fragment); - stats.count.textContent = logs.length; - - await waitAsync(stats.cooldown); - return await updateLogList(logs, logList, stats); -} - -/** - * @param {string} message - */ -function LogItem(message) { - /** - * @type {HTMLLIElement} - */ - const item = createComponent("log-list__item"); - - item.textContent = message; - - return item; -} diff --git a/client/src/pages/importer_tutorial.html b/client/src/pages/importer_tutorial.html deleted file mode 100644 index f3873ee..0000000 --- a/client/src/pages/importer_tutorial.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends 'components/shell.html' %} -{% block content %} -{% include "components/importer_states.html" %} -
    -

    How to get your session key

    -

    Patreon, Fanbox, SubscribeStar, Gumroad, Fantia, Boosty, Afdian

    -

    {{ g.site_name }} needs your session key in order to access posts from the {{ g.artists_or_creators|lower }} you are subscribed to.

    -

    Below are the respective cookies for the supported paysites.

    -
      -
    • For Patreon, your session key is under session_id.
    • -
    • For Fanbox, your session key is under FANBOXSESSID.
    • -
    • For Gumroad, your session key is under _gumroad_app_session.
    • -
    • For SubscribeStar, your session key is under _personalization_id.
    • -
    • For Fantia, your session key is under _session_id.
    • -
    • For Boosty, your session key is under auth.
    • -
    • For Afdian, your session key is under auth_token.
    • -
    -

    After going to the paysite you want to import and signing in, ( - Patreon - / - Fanbox - / - Gumroad - / - SubscribeStar - / - Fantia - / - Boosty - / - Afdian - ) you need to find where cookies are located in your browser.

    -

    Chrome

    -
      -
    • Press F12 to open Developer tools. If it didn't work for you try Ctrl+Shift+I or right click inspect element.
    • -
    • In the menu at the top, navigate to "Application" tab, if this isn't visible at a first glance simply press >> for more tabs.
    • - Select Application in Developer tools. -
    • In the "Application" tab, go to "Cookies".
    • -
    • Within the "Cookies" dropdown, select "patreon.com".
    • -
    • Now in list of cookies find session_id and select it, copy the contents and that will be the value you will use.
    • - Copy cookie in the correct menu -
    • Paste the content of the cookie you copied and submit in the {{ g.site_name }} import page
    • -
    -

    Safari

    -
      -
    • Ensure "Show Develop Menu" is enabled in Preferences (⌘,)
    • -
    • Open Web Inspector (⌘⌥I)
    • -
    • Go to Storage > Cookies
    • -
    • Right-click the cookie for your service and click "Copy"
    • -
    -

    Firefox

    -
      -
    • Open DevTools by pressing F12 and open the Storage tab
    • -
    • Go to Cookies > [site]
    • -
    • Go to Storage > Cookies
    • -
    • Right-click the cookie for your service and click "Copy"
    • -
    -

    For other browsers, please consult browser documentation on how to access stored cookies.

    -

    Discord

    -

    Getting your token

    -
      -
    • Open Discord in browser of your choice
    • -
    • Open DevTools (F12, Safari see above)
    • -
    • Go to Console Tab
    • -
    • Paste and execute the following snippet: (webpackChunkdiscord_app.push([[''],{},e=>{m=[];for(let c in e.c)m.push(e.c[c])}]),m).find(m=>m?.exports?.default?.getToken!==void 0).exports.default.getToken()
    • -
    • A "slightly.long.string" will be returned at the bottom of the console. Copy the contents between "". This is your self token.
    • -
    -

    The above should work with most browsers and the official Discord App, although you open the DevTools via the following combination in the App Ctrl + Shift + I

    -

    - Instructions on how to get the channel IDs can be found - - here. - -

    -
    -{% endblock %} \ No newline at end of file diff --git a/client/src/pages/importer_tutorial_fanbox.html b/client/src/pages/importer_tutorial_fanbox.html deleted file mode 100644 index 817756c..0000000 --- a/client/src/pages/importer_tutorial_fanbox.html +++ /dev/null @@ -1,38 +0,0 @@ -{% extends 'components/shell.html' %} -{% block content %} -{% include "components/importer_states.html" %} -
    -

    How to get your Fanbox session key

    -

    {{ g.site_name }} needs your session key in order to access posts from the {{ g.artists_or_creators|lower }} you are subscribed to.

    - -

    After going to the paysite you want to import and signing in, ( - Fanbox - ) you need to find where cookies are located in your browser, follow the instructions bellow.

    -

    Chrome

    -
      -
    • Press F12 to open Developer tools. If it didn't work for you try Ctrl+Shift+I or right click inspect element.
    • -
    • In the menu at the top, navigate to "Application" tab, if this isn't visible at a first glance simply press >> for more tabs.
    • - Select Application in Developer tools. -
    • In the "Application" tab, go to "Cookies".
    • -
    • Within the "Cookies" dropdown, select "fanbox.cc".
    • -
    • Now in list of cookies find FANBOXSESSID and select it, copy the contents and that will be the value you will use.
    • - Copy cookie in the correct menu -
    • Paste the content of the cookie you copied and submit in the {{ g.site_name }} import page
    • -
    -

    Safari

    -
      -
    • Ensure "Show Develop Menu" is enabled in Preferences (⌘,)
    • -
    • Open Web Inspector (⌘⌥I)
    • -
    • Go to Storage > Cookies
    • -
    • Right-click the cookie for your service and click "Copy"
    • -
    -

    Firefox

    -
      -
    • Open DevTools by pressing F12 and open the Storage tab
    • -
    • Go to Cookies > [site]
    • -
    • Go to Storage > Cookies
    • -
    • Right-click the cookie for your service and click "Copy"
    • -
    -

    For other browsers, please consult browser documentation on how to access stored cookies.

    -
    -{% endblock %} \ No newline at end of file diff --git a/client/src/pages/matrix.tsx b/client/src/pages/matrix.tsx new file mode 100644 index 0000000..52f16e1 --- /dev/null +++ b/client/src/pages/matrix.tsx @@ -0,0 +1,42 @@ +import { PageSkeleton } from "#components/pages"; + +export function MatrixPage() { + const title = "Matrix ecosystem"; + const heading = "Welcome to the Matrix ecosystem"; + + return ( + + + + ); +} diff --git a/client/src/pages/post-revision.module.scss b/client/src/pages/post-revision.module.scss new file mode 100644 index 0000000..88af0d3 --- /dev/null +++ b/client/src/pages/post-revision.module.scss @@ -0,0 +1,5 @@ +@use "../css/config/variables/sass.scss" as *; + +.article { + margin: 0 auto +} diff --git a/client/src/pages/post-revision.tsx b/client/src/pages/post-revision.tsx new file mode 100644 index 0000000..d8ae7f8 --- /dev/null +++ b/client/src/pages/post-revision.tsx @@ -0,0 +1,208 @@ +import { useEffect } from "react"; +import { LoaderFunctionArgs, useLoaderData, Link } from "react-router"; +import { Helmet } from "@dr.pogodin/react-helmet"; +import { + ICONS_PREPEND, + IS_ARCHIVER_ENABLED, + KEMONO_SITE, + SITE_NAME, +} from "#env/env-vars"; +import { fetchArtistProfile } from "#api/profiles"; +import { fetchPostRevision, fetchPostComments } from "#api/posts"; +import { PageSkeleton } from "#components/pages"; +import { SliderAd } from "#components/advs"; +import { paysites, validatePaysite } from "#entities/paysites"; +import { + IComment, + IPost, + IPostAttachment, + IPostPreview, + IPostVideo, + PostOverview, +} from "#entities/posts"; +import { IArtistDetails } from "#entities/profiles"; + +import * as styles from "./post-revision.module.scss"; + +interface IProps { + post: IPost; + profile: IArtistDetails; + revisions: Awaited< + ReturnType + >["props"]["revisions"]; + flagged: string | null; + videos?: IPostVideo[]; + attachments?: IPostAttachment[]; + previews?: IPostPreview[]; + archives_enabled?: boolean; + comments: Promise; +} + +export function PostRevisionPage() { + const { + post, + profile, + revisions, + flagged, + videos, + attachments, + previews, + archives_enabled, + comments, + } = useLoaderData() as IProps; + const paysite = paysites[post.service]; + const postTitle = post.title ?? "Untitled"; + const artistName = profile.name ?? post.user; + + const title = !profile + ? `Post "${postTitle}"` + : `Post "${postTitle}" by "${artistName}" from ${paysite.title}`; + + function handlePrevNextLinks(event: KeyboardEvent) { + switch (event.key) { + case "ArrowLeft": + document + .querySelector(".post__nav-link.prev") + ?.click(); + break; + case "ArrowRight": + document + .querySelector(".post__nav-link.next") + ?.click(); + break; + } + } + + useEffect(() => { + document.addEventListener("keydown", handlePrevNextLinks); + + return () => { + document.removeEventListener("keydown", handlePrevNextLinks); + }; + }, []); + + return ( + + + + + + {!post.published ? undefined : ( + + )} + + {/* */} + + + + + + {/* */} + + + + + + + + + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Profile ID is required."); + } + } + + const postID = params.post_id?.trim(); + { + if (!postID) { + throw new Error("Post ID is required."); + } + } + + const revisionID = params.revision_id?.trim(); + { + if (!revisionID) { + throw new Error("Revision ID is required."); + } + } + + const profile = await fetchArtistProfile(service, profileID); + const { post, result_attachments, result_previews, videos, props } = + await fetchPostRevision(service, profileID, postID, revisionID); + const { flagged, revisions } = props; + + const comments = fetchPostComments(service, profileID, postID); + + const pageProps = { + profile, + post, + revisions, + attachments: result_attachments, + previews: result_previews, + videos, + archives_enabled: IS_ARCHIVER_ENABLED, + flagged, + comments, + } satisfies IProps; + + return pageProps; +} diff --git a/client/src/pages/post.html b/client/src/pages/post.html deleted file mode 100644 index 4918c42..0000000 --- a/client/src/pages/post.html +++ /dev/null @@ -1,420 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/timestamp.html' import timestamp %} -{% from 'components/links.html' import kemono_link, local_link %} -{% from 'components/fancy_image.html' import fancy_image, background_image %} -{% from 'components/image_link.html' import image_link %} -{% from 'components/ads.html' import middle_ad, slider_ad %} - -{% set paysite = g.paysites[props.service] %} -{% set post_title = post.title if post.title else 'Untitled' %} -{% set artist_name = props.artist.name if props.artist.name else props.user %} -{% set page_title = "\"" ~ post_title ~ "\" by " ~ props.artist.name ~ " from " ~ paysite.title ~ " | " ~ g.site_name if props.artist else post_title ~ " | " ~ g.site_name %} -{% set user_link = g.freesites.kemono.user.profile(post.service, post.user) %} -{% set user_icon = g.freesites.kemono.user.icon(post.service, post.user) %} -{% set user_banner = g.freesites.kemono.user.banner(post.service, post.user) %} -{% set post_link = g.freesites.kemono.post.link(post.service, post.user, post.id) %} - -{% block title %} - - {{ page_title }} - -{% endblock title %} - -{% block meta %} - - - - {% if post.published %} - - {% endif %} - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} -{{ slider_ad() }} -
    - {% if post %} - - -
    -
    - {{ background_image(user_banner) }} - {{ image_link( - url=user_link, - src=user_icon, - is_lazy=false, - class_name='post__user-profile' - ) }} - -
    - -
    - -
    - {{ middle_ad() }} - {{ post_view(post, result_attachments, result_previews) }} -
    - -
    -

    Comments

    - {# TODO: comment filters #} -
    - {% for comment in comments %} - {% set is_user = comment.commenter == post.user %} -
    -
    - {% if is_user %} - - {% call kemono_link(comment.id, class_name="comment__icon") %} - {{ fancy_image( g.icons_prepend ~ '/icons/' ~ post.service ~ '/' ~ post.user) }} - {% endcall %} - - {% call local_link(comment.id, class_name="comment__name") %} - {{ props.artist.name if props.artist else g.artists_or_creators[:-1] }} - {% endcall %} - - {% else %} - {{ local_link(comment.id, comment.commenter_name or 'Anonymous' , "comment__name") }} - {% endif %} - - {% if comment.revisions %} - (edited) -
    -
    -
    -
    -
    -

    Comment edits

    - - -
    - -
    - {% for revision in comment.revisions + [comment] %} -
    - {{(revision.published or revision.added)|simple_datetime}} - {{revision.content}} -
    - {% endfor %} -
    -
    -
    -
    -
    - {% endif %} -
    -
    - {% if comment.parent_id %} - - {% endif %} -

    - {{ comment.content }} -

    -
    -
    - {{ timestamp(comment.published) }} -
    -
    - {% else %} -

    No comments found for this post.

    - {% endfor %} -
    - -
    - - {% else %} -

    Nobody here but us chickens!

    - {% endif %} -
    -{% endblock content %} - -{% block components %} - - - - Flagged - - - Revisions -{% endblock components %} - -{% macro post_view(post, attachments, previews) %} - {% if post.service == 'dlsite' and post.attachments|length > 1 %} -

    - This DLsite post was received as a split set of multiple files due to file size. Download all the files, then open the .exe file to compile them into a single one. -

    - {% endif %} - - {% if videos %} -

    Videos

    - -
      - {% for video in videos %} -
    • - {{ video.name }} - {% if video.caption %} - {{video.caption}} - {% endif %} - -
    • - {% endfor %} -
    - {% endif %} - - {% if attachments %} -

    Downloads

    -
      - {% for attachment in attachments %} -
    • - - Download {{ attachment.name }} - - {% if archives_enabled and ( attachment.extension in [".zip", ".rar", ".7z"] or attachment.name_extension in [".zip", ".rar", ".7z"] )%} - (browse ») - {% endif %} -
    • - {% endfor %} -
    - {% endif %} - - {% if post.incomplete_rewards %} -
    -
    {{ post.incomplete_rewards|safe }}
    -
    - {% endif %} - - {% if post.poll %} -

    Poll

    - -
    -
    -

    {{post.poll.title}}

    - {% if post.poll.description %} -
    {{post.poll.description}}
    - {% endif %} -
    -
      - {% for choice in post.poll.choices %} - {% set pct = choice.votes / (post.poll.total_votes or 1) * 100 %} -
    • - {{choice.text}} - {{choice.votes}} - -
    • - {% endfor %} -
    -
    -
      -
    • {{post.poll.created_at|simple_date}}
    • - {% if post.poll.closes_at %} -
    • —{{post.poll.closes_at|simple_date}}
    • - {% endif %} - {% if post.poll.allow_multiple %} -
    • multiple choice
    • - {% endif %} -
    • {{post.poll.total_votes}} votes
    • -
    -
    - {{post.poll}} - {% endif %} - - {% if post.content %} -

    Content

    -
    - {% if props.service == "subscribestar" -%} -
    - {%- endif %} - {% if props.service == 'fantia' or props.service == 'onlyfans' or props.service == 'fansly' or props.service == 'candfans' -%} -
    {{ post.content|safe }}
    - {% else -%} - {{ post.content|safe }} - {%- endif %} -
    - {% endif %} - - - {% if previews %} -

    Files

    -
    - {% for preview in previews %} - {% if preview.type == 'thumbnail' %} -
    -
    - - {# TODO: move backup image logic to the script #} - - - {% if preview.caption %} -
    {{preview.caption}}
    - {% endif %} -
    -
    - {% elif preview.type == 'embed' %} - -
    -

    - {{ preview.subject if preview.subject else '(No title)' }} -

    - {% if preview.description %} -

    - {{ preview.description }} -

    - {% endif %} -
    -
    - {% endif %} - {% endfor %} -
    - {% endif %} - -{% endmacro %} diff --git a/client/src/pages/post.js b/client/src/pages/post.js deleted file mode 100644 index ca08966..0000000 --- a/client/src/pages/post.js +++ /dev/null @@ -1,375 +0,0 @@ -import { kemonoAPI } from "@wp/api"; -import { addFavouritePost, findFavouritePost, removeFavouritePost } from "@wp/js/favorites"; -import { LoadingIcon, registerMessage, showTooltip } from "@wp/components"; -import { createComponent } from "@wp/js/component-factory"; -import { isLoggedIn } from "@wp/js/account"; -import MicroModal from "micromodal"; -import { diffChars } from "diff"; - -import "fluid-player/src/css/fluidplayer.css"; -import fluidPlayer from "fluid-player"; - -const meta = { - service: null, - user: null, - postID: null, -}; - -/** - * @param {HTMLElement} section - */ -export async function postPage(section) { - /** - * @type {HTMLElement} - */ - const buttonPanel = section.querySelector(".post__actions"); - - meta.service = document.head.querySelector("[name='service']").content; - meta.user = document.head.querySelector("[name='user']").content; - meta.postID = document.head.querySelector("[name='id']").content; - const postBody = section.querySelector(".post__body"); - - section.addEventListener("click", Expander); - - cleanupBody(postBody); - await initButtons(buttonPanel); - addRevisionHandler(); - - document.addEventListener("DOMContentLoaded", (d, ev) => {addShowTagsButton()}); - window.addEventListener("resize", (d, ev) => {addShowTagsButton()}); - - MicroModal.init(); - // diffComments(); - - Array.from(document.getElementsByTagName("video")).forEach((_, i) => { - fluidPlayer(`kemono-player${i}`, { - layoutControls: { - fillToContainer: false, - preload: "none", - }, - vastOptions: { - adList: window.videoAds, - adTextPosition: "top left", - maxAllowedVastTagRedirects: 2, - vastAdvanced: { - vastLoadedCallback: function () {}, - noVastVideoCallback: function () {}, - vastVideoSkippedCallback: function () {}, - vastVideoEndedCallback: function () {}, - }, - }, - }); - }); -} - -/** - * Apply some fixes to the content of the post. - * @param {HTMLElement} postBody - */ -function cleanupBody(postBody) { - const postContent = postBody.querySelector(".post__content"); - const isNoPostContent = !postContent || (!postContent.childElementCount && !postContent.childNodes.length); - - // content is empty - if (isNoPostContent) { - return; - } - - // pixiv post - if (meta.service === "fanbox") { - // its contents is a text node - if (!postContent.childElementCount && postContent.childNodes.length === 1) { - // wrap the text node into `
    `
    -      const [textNode] = Array.from(postContent.childNodes);
    -      const pre = document.createElement("pre");
    -      textNode.after(pre);
    -      pre.appendChild(textNode);
    -    }
    -
    -    // remove paragraphs with only `
    ` in them - const paragraphs = postContent.querySelectorAll("p"); - paragraphs.forEach((para) => { - if (para.childElementCount === 1 && para.firstElementChild.tagName === "BR") { - para.remove(); - } - }); - } - - Array.from(document.links).forEach((anchour) => { - // remove links to fanbox from the post - const hostname = anchour.hostname; - if (hostname.includes("downloads.fanbox.cc")) { - if (anchour.classList.contains("image-link")) { - anchour.remove(); - } else { - let el = document.createElement("span"); - el.textContent = anchour.textContent; - anchour.replaceWith(el); - } - } - else if (hostname.includes("fanbox.cc")){ - anchour.href = anchour.href.replace(/https?:\/\/(?:[a-zA-Z0-9-]*.)?fanbox\.cc\/(?:(?:manage\/)|(?:@[a-zA-Z\d]+\/)|)posts\/(\d+)/g, '/fanbox/post/$1'); - } - else if (hostname.includes("patreon.com")){ - anchour.href = anchour.href.replace( /https?:\/\/(?:[\w-]*.)?patreon\.com\/posts\/.*\b(\d+)\b(?:\?.*)?/g, '/patreon/post/$1'); - } - }); - - // Remove needless spaces and empty paragraphs. - /** - * @type {NodeListOf { - if (paragraph.nextElementSibling && paragraph.nextElementSibling.tagName === "BR") { - paragraph.nextElementSibling.remove(); - paragraph.remove(); - } else { - paragraph.remove(); - } - }); -} - -/** - * @param {HTMLElement} buttonPanel - */ -async function initButtons(buttonPanel) { - /** - * @type {HTMLButtonElement} - */ - const flagButton = buttonPanel.querySelector(".post__flag"); - /** - * @type {HTMLButtonElement} - */ - const favButton = createComponent("post__fav"); - const isFavorited = isLoggedIn && (await findFavouritePost(meta.service, meta.user, meta.postID)); - - if (isFavorited) { - const [icon, text] = favButton.children; - favButton.classList.add("post__fav--unfav"); - icon.textContent = "★"; - text.textContent = "Unfavorite"; - } - - if (!flagButton.classList.contains("post__flag--flagged")) { - flagButton.addEventListener("click", handleFlagging(meta.service, meta.user, meta.postID)); - } - - favButton.addEventListener("click", handleFavouriting(meta.service, meta.user, meta.postID)); - - buttonPanel.appendChild(favButton); - - document.addEventListener("keydown", (e) => { - switch (e.key) { - case "ArrowLeft": - document.querySelector(".post__nav-link.prev")?.click(); - break; - case "ArrowRight": - document.querySelector(".post__nav-link.next")?.click(); - break; - } - }); -} - -function addRevisionHandler() { - let selector = document.getElementById("post-revision-selection"); - if (selector) { - selector.addEventListener("change", (ev) => { - let revision = ev.target.selectedOptions[0].value; - if (revision) - location.pathname = `/${meta.service}/user/${meta.user}/post/${meta.postID}/revision/${revision}`; - else - location.pathname = `/${meta.service}/user/${meta.user}/post/${meta.postID}`; - }); - } -} - -/** - * @param {string} service - * @param {string} user - * @param {string} postID - * @returns {(event: MouseEvent) => Promise} - */ -function handleFlagging(service, user, postID) { - return async (event) => { - /** - * @type {HTMLButtonElement} - */ - const button = event.target; - const [icon, text] = button.children; - const loadingIcon = LoadingIcon(); - const isConfirmed = confirm( - "Are you sure you want to flag this post for reimport? Only do this if data in the post is broken/corrupted/incomplete.\nThis is not a deletion button.", - ); - - button.classList.add("post__flag--loading"); - button.disabled = true; - button.insertBefore(loadingIcon, text); - - try { - if (isConfirmed) { - const isFlagged = await kemonoAPI.posts.attemptFlag(service, user, postID); - - if (isFlagged) { - const parent = button.parentElement; - const newButton = createComponent("post__flag post__flag--flagged"); - - parent.insertBefore(newButton, button); - button.remove(); - } - } - } catch (error) { - console.error(error); - } finally { - loadingIcon.remove(); - button.disabled = false; - button.classList.remove("post__flag--loading"); - } - }; -} - -/** - * @param {string} service - * @param {string} user - * @param {string} postID - * @returns {(event: MouseEvent) => Promise} - */ -function handleFavouriting(service, user, postID) { - return async (event) => { - /** - * @type {HTMLButtonElement} - */ - const button = event.currentTarget; - const isLoggedIn = localStorage.getItem("logged_in") === "yes"; - - if (!isLoggedIn) { - showTooltip(button, registerMessage(null, "Favoriting")); - return; - } - - const [icon, text] = button.children; - const loadingIcon = LoadingIcon(); - - button.disabled = true; - button.classList.add("post__fav--loading"); - button.insertBefore(loadingIcon, text); - - try { - if (button.classList.contains("post__fav--unfav")) { - const isUnfavorited = await removeFavouritePost(service, user, postID); - - if (isUnfavorited) { - button.classList.remove("post__fav--unfav"); - icon.textContent = "☆"; - text.textContent = "Favorite"; - } - } else { - const isFavorited = await addFavouritePost(service, user, postID); - - if (isFavorited) { - button.classList.add("post__fav--unfav"); - icon.textContent = "★"; - text.textContent = "Unfavorite"; - } - } - } catch (error) { - console.error(error); - } finally { - loadingIcon.remove(); - button.disabled = false; - button.classList.remove("post__fav--loading"); - } - }; -} - -// expander.js -function Expand(c, t) { - if (!c.naturalWidth) { - return setTimeout(Expand, 10, c, t); - } - c.style.maxWidth = "100%"; - c.style.display = ""; - t.style.display = "none"; - t.style.opacity = ""; -} - -/** - * @param {MouseEvent} e - */ -function Expander(e) { - /** - * @type {HTMLElement} - */ - var t = e.target; - if (t.parentNode.classList.contains("fileThumb")) { - e.preventDefault(); - if (t.hasAttribute("data-src")) { - var c = document.createElement("img"); - c.setAttribute("src", t.parentNode.getAttribute("href")); - c.style.display = "none"; - t.parentNode.insertBefore(c, t.nextElementSibling); - t.style.opacity = "0.75"; - setTimeout(Expand, 10, c, t); - } else { - var a = t.parentNode; - a.firstChild.style.display = ""; - a.removeChild(t); - a.offsetTop < window.pageYOffset && a.scrollIntoView({ top: 0, behavior: "smooth" }); - } - } -} - -function addShowTagsButton() { - let div = document.querySelector("#post-tags > div"); - if (document.getElementById("show-tag-overflow-button")){ - document.getElementById("show-tag-overflow-button").remove(); - } - if (div && div.offsetWidth < div.scrollWidth) { - // tags overflow - let button = document.createElement("a"); - button.href = "javascript:void 0"; - button.id = "show-tag-overflow-button"; - button.textContent = "Show all »"; - button.onclick = (e) => { - if (div.classList.contains("show-overflow")) { - div.classList.remove("show-overflow"); - button.textContent = "Show all»"; - } else { - div.classList.add("show-overflow"); - button.textContent = "« Hide"; - } - } - div.parentElement.appendChild(button); - } -} - -function* pairwise(iterable) { - const iterator = iterable[Symbol.iterator](); - let a = iterator.next(); - if (a.done) return; - let b = iterator.next(); - while (!b.done) { - yield [a.value, b.value]; - a = b; - b = iterator.next(); - } -} - -function diffComments() { - let comments = Array.from(document.querySelectorAll(".comment-revisions-dialog .prose")); - let pairs = pairwise(comments); - for (let [old, new_] of pairs) { - let newSpan = document.createElement("span"); - newSpan.classList.add("prose"); - diffChars(old.textContent, new_.textContent) - .forEach(c => { - let span = document.createElement("span"); - if (c.added) { span.classList.add("added"); } - else if (c.removed) { span.classList.add("removed"); } - span.appendChild(document.createTextNode(c.value)); - newSpan.appendChild(span); - }); - - old.replaceWith(newSpan); - } -} diff --git a/client/src/pages/post.module.scss b/client/src/pages/post.module.scss new file mode 100644 index 0000000..88af0d3 --- /dev/null +++ b/client/src/pages/post.module.scss @@ -0,0 +1,5 @@ +@use "../css/config/variables/sass.scss" as *; + +.article { + margin: 0 auto +} diff --git a/client/src/pages/post.scss b/client/src/pages/post.scss index aa5d66e..469245f 100644 --- a/client/src/pages/post.scss +++ b/client/src/pages/post.scss @@ -1,4 +1,4 @@ -@use "../css/config/variables" as *; +@use "../css/config/variables/sass" as *; .post { &__nav-list { @@ -74,9 +74,10 @@ &__actions { font-size: 1.5em; + display: flex; & > * { - margin-right: 1em; + margin-right: 0.5em; user-select: none; &:last-child { @@ -85,40 +86,6 @@ } } - &__flag { - display: inline-block; - color: hsl(3, 100%, 69%); - font-weight: bold; - text-shadow: - hsl(0, 0%, 0%) 0px 0px 3px, - hsl(0, 0%, 0%) -1px -1px 0px, - hsl(0, 0%, 0%) 1px 1px 0px; - background-color: transparent; - border: transparent; - - // hack to overwrite * selector color - & span { - color: hsl(3, 100%, 69%); - } - - &--flagged { - color: hsl(0, 0%, 45%); - - // hack to overwrite * selector color - & span { - color: hsl(0, 0%, 45%); - } - } - - &--loading { - cursor: progress; - - & .post__flag-icon { - display: none; - } - } - } - &__fav { color: hsl(0, 0%, 100%); font-weight: bold; diff --git a/client/src/pages/post.tsx b/client/src/pages/post.tsx new file mode 100644 index 0000000..12260e1 --- /dev/null +++ b/client/src/pages/post.tsx @@ -0,0 +1,202 @@ +import { useEffect } from "react"; +import { LoaderFunctionArgs, useLoaderData, Link } from "react-router"; +import { Helmet } from "@dr.pogodin/react-helmet"; +import { + ICONS_PREPEND, + IS_ARCHIVER_ENABLED, + KEMONO_SITE, + SITE_NAME, +} from "#env/env-vars"; +import { fetchArtistProfile } from "#api/profiles"; +import { fetchPost, fetchPostComments } from "#api/posts"; +import { PageSkeleton } from "#components/pages"; +import { SliderAd } from "#components/advs"; +import { paysites, validatePaysite } from "#entities/paysites"; +import { + IComment, + IPost, + IPostAttachment, + IPostPreview, + IPostVideo, + PostOverview, +} from "#entities/posts"; +import { IArtistDetails } from "#entities/profiles"; + +import * as styles from "./post.module.scss"; + +interface IProps { + post: IPost; + profile: IArtistDetails; + revisions: Awaited>["props"]["revisions"]; + flagged: string | null; + videos?: IPostVideo[]; + attachments?: IPostAttachment[]; + previews?: IPostPreview[]; + archives_enabled?: boolean; + comments: Promise; +} + +export function PostPage() { + const { + post, + profile, + revisions, + flagged, + videos, + attachments, + previews, + archives_enabled, + comments, + } = useLoaderData() as IProps; + const paysite = paysites[post.service]; + const postTitle = post.title ?? "Untitled"; + const artistName = profile.name ?? post.user; + + const title = !profile + ? `Post "${postTitle}"` + : `Post "${postTitle}" by "${artistName}" from ${paysite.title}`; + + function handlePrevNextLinks(event: KeyboardEvent) { + switch (event.key) { + case "ArrowLeft": + document + .querySelector(".post__nav-link.prev") + ?.click(); + break; + case "ArrowRight": + document + .querySelector(".post__nav-link.next") + ?.click(); + break; + } + } + + useEffect(() => { + document.addEventListener("keydown", handlePrevNextLinks); + + return () => { + document.removeEventListener("keydown", handlePrevNextLinks); + }; + }, []); + + return ( + + + + + + {!post.published ? undefined : ( + + )} + + {/* */} + + + + + + {/* */} + + + + + + + + + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Profile ID is required."); + } + } + + const postID = params.post_id?.trim(); + { + if (!postID) { + throw new Error("Post ID is required."); + } + } + + const profile = await fetchArtistProfile(service, profileID); + const { post, attachments, previews, videos, props } = await fetchPost( + service, + profileID, + postID + ); + const { flagged, revisions } = props; + + const comments = fetchPostComments(service, profileID, postID); + + const pageProps = { + profile, + post, + revisions, + attachments, + previews, + videos, + archives_enabled: IS_ARCHIVER_ENABLED, + flagged, + comments, + } satisfies IProps; + + return pageProps; +} diff --git a/client/src/pages/post/data.tsx b/client/src/pages/post/data.tsx new file mode 100644 index 0000000..a8a623e --- /dev/null +++ b/client/src/pages/post/data.tsx @@ -0,0 +1,30 @@ +import { LoaderFunctionArgs, redirect } from "react-router"; +import { fetchPostData } from "#api/posts"; +import { createPostURL } from "#lib/urls"; +import { HTTP_STATUS } from "#lib/http"; +import { validatePaysite } from "#entities/paysites"; + +export async function loader({ params }: LoaderFunctionArgs) { + const inputService = params.service?.trim(); + + if (!inputService) { + throw new Error("Service is required."); + } + + validatePaysite(inputService); + + const postID = params.post_id?.trim(); + + if (!postID) { + throw new Error("Post ID is required."); + } + + const { service, artist_id, post_id } = await fetchPostData( + inputService, + postID + ); + + const url = String(createPostURL(service, artist_id, post_id)); + + return redirect(url, HTTP_STATUS.SEE_OTHER); +} diff --git a/client/src/pages/posts.html b/client/src/pages/posts.html deleted file mode 100644 index ae6d223..0000000 --- a/client/src/pages/posts.html +++ /dev/null @@ -1,57 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/post.html' import post_card %} -{% from 'components/ads.html' import slider_ad, header_ad, footer_ad %} - -{% block content %} - {{ slider_ad() }} -
    -
    -

    Posts

    -
    -
    - {% include 'components/paginator.html' %} -
    - - -
    -
    - - {{ header_ad() }} - - {% call card_list() %} - {% for post in results %} - {{ post_card(post) }} - {% else %} -
    -

    Nobody here but us chickens!

    -

    - There are no posts for your query. -

    -
    - {% endfor %} - {% endcall %} - - {{ footer_ad() }} - -
    - {% include 'components/paginator.html' %} -
    -
    -{% endblock %} - - diff --git a/client/src/pages/posts.js b/client/src/pages/posts.js deleted file mode 100644 index 7c10cd4..0000000 --- a/client/src/pages/posts.js +++ /dev/null @@ -1,35 +0,0 @@ -import { CardList, PostCard, registerPaginatorKeybinds } from "@wp/components"; -import { isLoggedIn } from "@wp/js/account"; -import { findFavouriteArtist, findFavouritePost } from "@wp/js/favorites"; - -/** - * @param {HTMLElement} section - */ -export function postsPage(section) { - const cardListElement = section.querySelector(".card-list"); - if (!cardListElement){ - return; - } - const { cardList, cardItems } = CardList(cardListElement); - - cardItems.forEach(async (card) => { - registerPaginatorKeybinds(); - - const { postID, userID, service } = PostCard(card); - const favPost = isLoggedIn && (await findFavouritePost(service, userID, postID)); - const favUser = isLoggedIn && (await findFavouriteArtist(userID, service)); - - if (favPost) { - card.classList.add("post-card--fav"); - } - - if (favUser) { - const postHeader = card.querySelector(".post-card__header"); - const postFooter = card.querySelector(".post-card__footer"); - - postHeader.classList.add("post-card__header--fav"); - postFooter.classList.add("post-card__footer--fav"); - /* userName.textContent = favUser.name; this is doing nothing does it */ - } - }); -} diff --git a/client/src/pages/posts.tsx b/client/src/pages/posts.tsx new file mode 100644 index 0000000..a729bc6 --- /dev/null +++ b/client/src/pages/posts.tsx @@ -0,0 +1,219 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { parseOffset } from "#lib/pagination"; +import { createPostsPageURL } from "#lib/urls"; +import { fetchPosts } from "#api/posts"; +import { PageSkeleton } from "#components/pages"; +import { Paginator } from "#components/pagination"; +import { FooterAd, HeaderAd, SliderAd } from "#components/advs"; +import { CardList, PostCard } from "#components/cards"; +import { ButtonSubmit, FormRouter } from "#components/forms"; +import { IPost } from "#entities/posts"; +import { findFavouritePosts, findFavouriteProfiles } from "#entities/account"; +import { useRef, useState } from "react"; + +interface IProps { + count: number; + trueCount: number; + offset?: number; + posts: IPost[]; + query?: string; + tags?: string[]; +} + +export function PostsPage() { + const { count, trueCount, offset, query, posts, tags } = + useLoaderData() as IProps; + const [isLoading, setIsLoading] = useState(false); + const title = "Posts"; + const heading = "Posts"; + + return ( + + + + + +
    + setIsLoading(loading)} + /> + + + String(createPostsPageURL(offset, query, tags)) + } + /> +
    + + + {count === 0 ? ( +
    +

    Nobody here but us chickens!

    +

    There are no posts for your query.

    +
    + ) : ( + posts.map((post) => ( + + )) + )} +
    + +
    + + String(createPostsPageURL(offset, query, tags)) + } + /> +
    + + +
    + ); +} + +interface ISearchFormProps + extends Pick { + onLoadingChange: (loading: boolean) => void; +} + +// TODO: TAGS! add tag search!! +function SearchForm({ query, tags, onLoadingChange }: ISearchFormProps) { + const timeoutRef = useRef(null); + const onInputChange = (e: React.ChangeEvent) => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + + const target = e.currentTarget as HTMLInputElement; + + onLoadingChange(true); + + timeoutRef.current = setTimeout(() => { + if (target.form) target.form.requestSubmit(); + onLoadingChange(false); + }, 1000); + }; + + return ( + + {(state) => ( + <> +
    + + { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + onLoadingChange(false); + }} + > + + +
    + + )} +
    + ); +} + +export async function loader({ request }: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + let offset: number | undefined = undefined; + { + const parsedOffset = searchParams.get("o")?.trim(); + + if (parsedOffset) { + offset = parseOffset(parsedOffset); + } + } + + const query = searchParams.get("q")?.trim(); + const tags = searchParams.getAll("tag"); + const { count, true_count, posts } = await fetchPosts(offset, query, tags); + const postsData = posts.map(({ service, user, id }) => ({ + service, + user, + id, + })); + const profilesData = posts.reduce<{ service: string; id: string }[]>( + (profilesData, post) => { + const match = profilesData.find( + (profileData) => + profileData.id === post.user && profileData.service === post.service + ); + + if (!match) { + profilesData.push({ service: post.service, id: post.user }); + } + + return profilesData; + }, + [] + ); + const favPosts = await findFavouritePosts(postsData); + const favProfiles = await findFavouriteProfiles(profilesData); + const postsWithFavs = posts.map((post) => { + const isFavPost = Boolean( + favPosts.find( + ({ service, user, id }) => + id === post.id && user === post.user && service === post.service + ) + ); + const isFavProfile = Boolean( + favProfiles.find( + ({ service, id }) => id === post.user && service === post.service + ) + ); + + if (!isFavPost && !isFavProfile) { + return post; + } + + return { + ...post, + isFavourite: isFavPost, + isFavouriteProfile: isFavProfile, + }; + }); + + return { + offset, + query, + tags, + count, + trueCount: true_count, + posts: postsWithFavs, + }; +} diff --git a/client/src/pages/posts/archive.html b/client/src/pages/posts/archive.html deleted file mode 100644 index 1edf998..0000000 --- a/client/src/pages/posts/archive.html +++ /dev/null @@ -1,53 +0,0 @@ -{% extends "components/shell.html" %} - -{% block title %} - Archived Files | {{ g.site_name }} -{% endblock %} - -{% block content %} -
    -
    -

    Archive Files

    -
    -
    - -
    -

    - {% if archive.password %} - Archive password: {{archive.password}} - {% elif archive.password == "" %} - Archive needs password, but none was provided. Click to input - {% endif %} -

    -
    - - {% for file_name in archive.file_list %} - {% if file_serving_enabled and archive.password %} - {{file_name}}
    - {% elif file_serving_enabled and archive.password == None %} - {{file_name}}
    - {% else %} - {{file_name}}
    - {% endif %} - {% else %} - {% if archive %} - Archive is empty or missing password. - {% else %} - File does not exist or is not an archive. - {% endif %} - {% endfor %} - - -{% endblock %} diff --git a/client/src/pages/posts/popular.html b/client/src/pages/posts/popular.html deleted file mode 100644 index 3c4e918..0000000 --- a/client/src/pages/posts/popular.html +++ /dev/null @@ -1,114 +0,0 @@ -{% extends "components/shell.html" %} - -{% from "components/card_list.html" import card_list %} -{% from "components/cards/post.html" import post_fav_card %} -{% from "components/ads.html" import slider_ad, header_ad, footer_ad %} - -{% block title %} - Popular Posts | {{ g.site_name }} -{% endblock %} - -{% block content %} - {{ slider_ad() }} - - - -{% endblock %} diff --git a/client/src/pages/posts/popular.tsx b/client/src/pages/posts/popular.tsx new file mode 100644 index 0000000..9e41a49 --- /dev/null +++ b/client/src/pages/posts/popular.tsx @@ -0,0 +1,378 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { createPopularPostsPageURL } from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { fetchPopularPosts } from "#api/posts"; +import { PageSkeleton } from "#components/pages"; +import { Paginator } from "#components/pagination"; +import { FooterAd, HeaderAd, SliderAd } from "#components/advs"; +import { CardList, PostCard } from "#components/cards"; +import { + IPopularPostsPeriod, + IPost, + validatePeriod, +} from "#entities/posts"; +import { KemonoLink } from "#components/links"; +import { findFavouritePosts, findFavouriteProfiles } from "#entities/account"; + +interface IProps { + /** + * Datetime string. + */ + minDate: string; + /** + * Datetime string. + */ + maxDate: string; + /** + * Human description of range. + */ + rangeDescription: string; + /** + * Date string. + */ + earliestDateForPopular: string; + /** + * Value is a tuple of date strings. + */ + navigationDates: Record; + scale?: IPopularPostsPeriod; + /** + * Date string. + */ + today: string; + count: number; + posts: IPost[]; + offset?: number; + /** + * Datetime string. + */ + date?: string; +} + +/** + * A tuple of date strings. + */ +type INavigationDate = [prev: string, next: string, current: string]; + +export function PopularPostsPage() { + const { + minDate, + maxDate, + rangeDescription, + navigationDates, + earliestDateForPopular, + scale, + today, + count, + offset, + date, + posts, + } = useLoaderData() as IProps; + const title = `Popular posts for ${rangeDescription}`; + + return ( + + Popular Posts for{" "} + {rangeDescription} + + } + > + + +
    + + + + + + +
    + + String(createPopularPostsPageURL(date, scale, offset)) + } + /> + + + + + {count === 0 ? ( +
    +

    Nobody here but us chickens!

    +

    There are no posts for your query.

    +
    + ) : ( + posts.map((post) => ( + + )) + )} +
    + + + +
    + + String(createPopularPostsPageURL(date, scale, offset)) + } + /> +
    +
    +
    +
    + ); +} + +interface IDailySelectorProps + extends Pick { + navigationDate: INavigationDate; +} + +function DailySelector({ + earliestDateForPopular, + scale, + today, + navigationDate, +}: IDailySelectorProps) { + const [prev, next, current] = navigationDate; + + return ( +
    + + {prev < earliestDateForPopular ? ( + next » + ) : ( + + « prev + + )} + {" "} + + {scale === "day" ? ( + Day + ) : ( + + Day + + )} + {" "} + + {next > today ? ( + next » + ) : ( + + next » + + )} + +
    + ); +} + +interface IWeeklySelectorProps + extends Pick { + navigationDate: [string, string, string]; +} + +function WeeklySelector({ + earliestDateForPopular, + scale, + today, + navigationDate, +}: IWeeklySelectorProps) { + const [prev, next, current] = navigationDate; + + return ( +
    + + {prev < earliestDateForPopular ? ( + next » + ) : ( + + « prev + + )} + {" "} + + {scale === "week" ? ( + Week + ) : ( + + Week + + )} + {" "} + + {next > today ? ( + next » + ) : ( + + next » + + )} + +
    + ); +} + +interface IMonthlySelectorProps + extends Pick { + navigationDate: [string, string, string]; +} + +function MonthlySelector({ + earliestDateForPopular, + scale, + today, + navigationDate, +}: IMonthlySelectorProps) { + const [prev, next, current] = navigationDate; + + return ( +
    + + {prev < earliestDateForPopular ? ( + next » + ) : ( + + « prev + + )} + {" "} + + {scale === "month" ? ( + Month + ) : ( + + Month + + )} + {" "} + + + {next > today ? ( + next » + ) : ( + + next » + + )} + + +
    + ); +} + +export async function loader({ request }: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + const inputDate = searchParams.get("date")?.trim(); + + const scale = searchParams.get("period")?.trim() ?? "recent"; + validatePeriod(scale); + + let offset: number | undefined; + { + const inputOffset = searchParams.get("o")?.trim(); + + if (inputOffset) { + offset = parseOffset(inputOffset); + } + } + + const { + info, + props, + results: posts, + } = await fetchPopularPosts(inputDate, scale, offset); + const { count, earliest_date_for_popular, today } = props; + const { date, range_desc, min_date, max_date, navigation_dates } = info; + const postsData = posts.map(({ service, user, id }) => ({ + service, + user, + id, + })); + const profilesData = posts.reduce<{ service: string; id: string }[]>( + (profilesData, post) => { + const match = profilesData.find( + (profileData) => + profileData.id === post.user && profileData.service === post.service + ); + + if (!match) { + profilesData.push({ service: post.service, id: post.user }); + } + + return profilesData; + }, + [] + ); + const favPosts = await findFavouritePosts(postsData); + const favProfiles = await findFavouriteProfiles(profilesData); + const postsWithFavs = posts.map((post) => { + const isFavPost = Boolean( + favPosts.find( + ({ service, user, id }) => + id === post.id && user === post.user && service === post.service + ) + ); + const isFavProfile = Boolean( + favProfiles.find( + ({ service, id }) => id === post.user && service === post.service + ) + ); + + if (!isFavPost && !isFavProfile) { + return post; + } + + return { + ...post, + isFavourite: isFavPost, + isFavouriteProfile: isFavProfile, + }; + }); + + return { + date, + count, + scale, + offset, + posts: postsWithFavs, + today, + earliestDateForPopular: earliest_date_for_popular, + rangeDescription: range_desc, + minDate: min_date, + maxDate: max_date, + navigationDates: navigation_dates, + }; +} diff --git a/client/src/pages/posts/random.tsx b/client/src/pages/posts/random.tsx new file mode 100644 index 0000000..3959f56 --- /dev/null +++ b/client/src/pages/posts/random.tsx @@ -0,0 +1,10 @@ +import { redirect } from "react-router"; +import { createPostURL } from "#lib/urls"; +import { fetchRandomPost } from "#api/posts"; + +export async function loader() { + const { service, artist_id, post_id } = await fetchRandomPost(); + const url = String(createPostURL(service, artist_id, post_id)); + + return redirect(url); +} diff --git a/client/src/pages/user.scss b/client/src/pages/profile.scss similarity index 98% rename from client/src/pages/user.scss rename to client/src/pages/profile.scss index 3febb0b..8e31111 100644 --- a/client/src/pages/user.scss +++ b/client/src/pages/profile.scss @@ -1,4 +1,4 @@ -@use "../css/config/variables" as *; +@use "../css/config/variables/sass" as *; .tabs { margin: 0 auto; diff --git a/client/src/pages/profile.tsx b/client/src/pages/profile.tsx new file mode 100644 index 0000000..72b7e94 --- /dev/null +++ b/client/src/pages/profile.tsx @@ -0,0 +1,255 @@ +import { LoaderFunctionArgs, redirect, useLoaderData } from "react-router"; +import { createDiscordServerPageURL, createProfilePageURL } from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { ElementType } from "#lib/types"; +import { fetchProfilePosts } from "#api/profiles"; +import { FooterAd, SliderAd } from "#components/advs"; +import { Paginator } from "#components/pagination"; +import { CardList, PostCard } from "#components/cards"; +import { ProfilePageSkeleton } from "#components/pages"; +import { ButtonSubmit, FormRouter } from "#components/forms"; +import { + ProfileHeader, + Tabs, + IArtistDetails, + getArtist, +} from "#entities/profiles"; +import { paysites } from "#entities/paysites"; +import { IPost } from "#entities/posts"; +import { findFavouritePosts } from "#entities/account"; +import { useRef, useState } from "react"; + +interface IProps { + profile: IArtistDetails; + postsData?: { + count: number; + offset?: number; + posts: (IPost & { isFavourite: boolean })[]; + }; + + query?: string; + tags?: string[]; + dmCount?: number; + hasLinks?: boolean; +} + +export function ProfilePage() { + const { profile, postsData, query, tags, dmCount, hasLinks } = + useLoaderData() as IProps; + const [isLoading, setIsLoading] = useState(false); + const { service, id, name } = profile; + const paysite = paysites[service]; + const title = `Posts of "${name}" from "${paysite.title}"`; + + return ( + + + + + +
    + + + {!(postsData && (postsData?.count !== 0 || query)) ? undefined : ( + <> + setIsLoading(loading)} + /> + + String( + createProfilePageURL({ + service, + profileID: id, + offset, + query, + tags, + }) + ) + } + /> + + )} +
    + + {!postsData ? ( +
    +

    + Nobody here but us chickens! +

    +

    There are no posts for your query.

    +
    + ) : ( + <> + + {postsData.posts.map((post) => ( + + ))} + + + + +
    + + String( + createProfilePageURL({ + service, + profileID: id, + offset, + query, + tags, + }) + ) + } + /> +
    + + )} +
    + ); +} + +interface ISearchFormProps + extends Pick { + onLoadingChange: (loading: boolean) => void; +} + +function SearchForm({ query, onLoadingChange }: ISearchFormProps) { + const timeoutRef = useRef(null); + + const onInputChange = (e: React.ChangeEvent) => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + + const target = e.currentTarget as HTMLInputElement; + + onLoadingChange(true); + + timeoutRef.current = setTimeout(() => { + if (target.form) target.form.requestSubmit(); + onLoadingChange(false); + }, 1000); + }; + + return ( + + {(state) => ( + <> +
    + + { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + onLoadingChange(false); + }} + > + + +
    + + )} +
    + ); +} + +export async function loader({ + params, + request, +}: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + const service = params.service?.trim() || ""; + const profileID = params.creator_id?.trim() || ""; + + if (service === "discord") { + return redirect(String(createDiscordServerPageURL(profileID))); + } + + const offsetParam = searchParams.get("o")?.trim(); + const offset = offsetParam ? parseOffset(offsetParam) : undefined; + const query = searchParams.get("q")?.trim(); + const tags = searchParams.getAll("tag"); + + const profile = await getArtist(service, profileID); + + if (profileID == profile.public_id && profile.public_id != profile.id) { + return redirect(String(createProfilePageURL({ service, profileID: profile.id }))); + } + + const { props, results: posts } = await fetchProfilePosts( + service, + profileID, + offset, + query, + tags + ); + const { count, dm_count, has_links } = props; + const hasLinks = !has_links || has_links === "0" ? false : true; + const favPostData = await findFavouritePosts( + posts.map(({ service, user, id }) => { + return { + service, + user, + id, + }; + }) + ); + const finalPosts = posts.map< + ElementType["postsData"]["posts"]> + >((post) => { + const match = favPostData.find( + ({ service, user, id }) => + service === post.service && user === post.user && id === post.id + ); + + return { ...post, isFavourite: !match ? false : true }; + }); + + return { + profile, + query, + tags, + postsData: { + count, + offset, + posts: finalPosts, + }, + dmCount: dm_count, + hasLinks, + }; +} diff --git a/client/src/pages/artist/_index.scss b/client/src/pages/profile/_index.scss similarity index 80% rename from client/src/pages/artist/_index.scss rename to client/src/pages/profile/_index.scss index 7227f44..cdeb657 100644 --- a/client/src/pages/artist/_index.scss +++ b/client/src/pages/profile/_index.scss @@ -1,3 +1,4 @@ @use "dms"; @use "fancards"; @use "linked_accounts"; +@use "tags"; diff --git a/client/src/pages/profile/announcements.tsx b/client/src/pages/profile/announcements.tsx new file mode 100644 index 0000000..071f0aa --- /dev/null +++ b/client/src/pages/profile/announcements.tsx @@ -0,0 +1,107 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { Helmet } from "@dr.pogodin/react-helmet"; +import { ICONS_PREPEND, KEMONO_SITE, SITE_NAME } from "#env/env-vars"; +import { fetchAnnouncements } from "#api/posts"; +import { fetchArtistProfile } from "#api/profiles"; +import { PageSkeleton } from "#components/pages"; +import { CardList } from "#components/cards"; +import { ProfileHeader, Tabs, IArtistDetails } from "#entities/profiles"; +import { paysites, validatePaysite } from "#entities/paysites"; +import { IAnnouncement } from "#entities/posts"; +import { AnnouncementPreview } from "#entities/posts"; + +interface IProps { + service: string; + profile: IArtistDetails; + announcements: IAnnouncement[]; +} + +export function AnnouncementsPage() { + const { service, profile, announcements } = useLoaderData() as IProps; + const paysite = paysites[service]; + const title = `Announcements of "${profile.name}" from ${paysite.title}`; + const heading = "Announcements"; + + return ( + + + + + + {/* */} + + + + + + {/* */} + + + + +
    + +
    + + + {!announcements.length ? ( +
    +

    + Nobody here but us chickens! +

    +

    + There are no Announcements for your query. +

    +
    + ) : ( + announcements.map((announcement) => ( + + )) + )} +
    +
    + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service name is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Artist ID is required."); + } + } + + const profile = await fetchArtistProfile(service, profileID); + const announcements = await fetchAnnouncements(service, profileID); + + return { + service, + profile, + announcements, + }; +} diff --git a/client/src/pages/artist/dms.scss b/client/src/pages/profile/dms.scss similarity index 73% rename from client/src/pages/artist/dms.scss rename to client/src/pages/profile/dms.scss index 3a755a4..80f7338 100644 --- a/client/src/pages/artist/dms.scss +++ b/client/src/pages/profile/dms.scss @@ -1,4 +1,4 @@ -@use "../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .site-section--dms { .no-results { diff --git a/client/src/pages/profile/dms.tsx b/client/src/pages/profile/dms.tsx new file mode 100644 index 0000000..d3d69ce --- /dev/null +++ b/client/src/pages/profile/dms.tsx @@ -0,0 +1,101 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { Helmet } from "@dr.pogodin/react-helmet"; +import { ICONS_PREPEND, KEMONO_SITE, SITE_NAME } from "#env/env-vars"; +import { fetchProfileDMs } from "#api/dms"; +import { PageSkeleton } from "#components/pages"; +import { CardList, DMCard } from "#components/cards"; +import { ProfileHeader, Tabs, IArtist } from "#entities/profiles"; +import { paysites, validatePaysite } from "#entities/paysites"; +import { IApprovedDM } from "#entities/dms"; + +interface IProps { + profile: IArtist; + service: string; + dmCount: number; + dms: IApprovedDM[]; +} + +export function ProfileDMsPage() { + const { profile, service, dmCount, dms } = useLoaderData() as IProps; + const paysite = paysites[service]; + const title = `DMs of "${profile.name}" (${profile.id}) from ${paysite.title}`; + const heading = "DMs"; + + return ( + + + + + + {/* */} + + + + + + {/* */} + + + + +
    + +
    + + + {dmCount === 0 ? ( +
    +

    + Nobody here but us chickens! +

    +

    There are no DMs for your query.

    +
    + ) : ( + dms.map((dm) => ) + )} +
    +
    + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service name is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Artist ID is required."); + } + } + + const { props } = await fetchProfileDMs(service, profileID); + const { artist, dm_count, dms } = props; + + return { + profile: artist, + service, + dmCount: dm_count, + dms, + }; +} diff --git a/client/src/pages/artist/fancards.scss b/client/src/pages/profile/fancards.scss similarity index 75% rename from client/src/pages/artist/fancards.scss rename to client/src/pages/profile/fancards.scss index d634373..bcaac05 100644 --- a/client/src/pages/artist/fancards.scss +++ b/client/src/pages/profile/fancards.scss @@ -1,14 +1,15 @@ div#fancard-container { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); - margin-top: 0.5em; - gap: 0.5em 0.25em; + display: flex; + flex-wrap: wrap; + justify-content: center; article.fancard__file { width: 400px; height: 293px; display: inline-grid; background-color: var(--colour1-secondary); + margin: 0.5em; + margin-bottom: 0.25em; span { padding-top: 0.5em; diff --git a/client/src/pages/profile/fancards.tsx b/client/src/pages/profile/fancards.tsx new file mode 100644 index 0000000..ad09908 --- /dev/null +++ b/client/src/pages/profile/fancards.tsx @@ -0,0 +1,123 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { Helmet } from "@dr.pogodin/react-helmet"; +import { + ICONS_PREPEND, + KEMONO_SITE, + SITE_NAME, + THUMBNAILS_PREPEND, +} from "#env/env-vars"; +import { fetchFanboxProfileFancards } from "#api/profiles"; +import { PageSkeleton } from "#components/pages"; +import { validatePaysite } from "#entities/paysites"; +import { + ProfileHeader, + Tabs, + IArtistDetails, + getArtist, +} from "#entities/profiles"; +import { IFanCard } from "#entities/files"; + +interface IProps { + profile: IArtistDetails; + cards: IFanCard[]; +} + +export function FancardsPage() { + const { profile, cards } = useLoaderData() as IProps; + const title = "Fancards"; + const heading = "Fancards"; + + return ( + + + + + + {/* */} + + + + + + {/* */} + + + + +
    + +
    + {cards.length === 0 ? ( +
    +

    + Nobody here but us chickens! +

    +

    There are no uploads for your query.

    +
    + ) : ( + cards.map((card) => ( +
    + + Added {card.added.slice(0, 7)} + + + + +
    + )) + )} +
    +
    +
    + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service name is required."); + } + + validatePaysite(service); + + if (service !== "fanbox") { + throw new Error(`Service must be "fanbox".`); + } + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Artist ID is required."); + } + } + + const profile = await getArtist(service, profileID); + const cards = await fetchFanboxProfileFancards(profileID); + + return { + profile, + cards, + }; +} diff --git a/client/src/pages/artist/linked_accounts.scss b/client/src/pages/profile/linked_accounts.scss similarity index 100% rename from client/src/pages/artist/linked_accounts.scss rename to client/src/pages/profile/linked_accounts.scss diff --git a/client/src/pages/profile/linked_accounts.tsx b/client/src/pages/profile/linked_accounts.tsx new file mode 100644 index 0000000..f31b4ee --- /dev/null +++ b/client/src/pages/profile/linked_accounts.tsx @@ -0,0 +1,100 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { createProfileNewLinksPageURL } from "#lib/urls"; +import { fetchArtistProfile, fetchProfileLinks } from "#api/profiles"; +import { CardList, ArtistCard } from "#components/cards"; +import { ProfilePageSkeleton } from "#components/pages"; +import { ProfileHeader, Tabs, IArtistDetails } from "#entities/profiles"; +import { validatePaysite } from "#entities/paysites"; + +interface IProps { + service: string; + profile: IArtistDetails; + links: Awaited>; +} + +export function ProfileLinksPage() { + const { service, profile, links } = useLoaderData() as IProps; + const title = "Linked profiles"; + const heading = "Linked Profiles"; + + return ( + + + +
    + +
    + + + + + {links.length === 0 ? ( +

    + No linked accounts found. +

    + ) : ( + links.map((profile) => ( + + )) + )} +
    +
    + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service name is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Artist ID is required."); + } + } + + const profile = await fetchArtistProfile(service, profileID); + const links = await fetchProfileLinks(service, profileID); + + return { + service, + profile, + links, + }; +} diff --git a/client/src/pages/profile/new-linked-profile.module.scss b/client/src/pages/profile/new-linked-profile.module.scss new file mode 100644 index 0000000..b698d5c --- /dev/null +++ b/client/src/pages/profile/new-linked-profile.module.scss @@ -0,0 +1,3 @@ +.selected { + border: 2px solid green; +} diff --git a/client/src/pages/profile/new-linked-profile.tsx b/client/src/pages/profile/new-linked-profile.tsx new file mode 100644 index 0000000..368faaf --- /dev/null +++ b/client/src/pages/profile/new-linked-profile.tsx @@ -0,0 +1,277 @@ +import { useEffect, useState } from "react"; +import clsx from "clsx"; +import { + ActionFunctionArgs, + LoaderFunctionArgs, + useActionData, + useLoaderData, +} from "react-router"; +import { SITE_NAME } from "#env/env-vars"; +import { AVAILABLE_PAYSITE_LIST } from "#env/derived-vars"; +import { ElementType } from "#lib/types"; +import { fetchAddProfileLink } from "#api/account"; +import { + ProfilePageSkeleton, + createAccountPageLoader, +} from "#components/pages"; +import { FormRouter, FormSection, ButtonSubmit } from "#components/forms"; +import { InputHidden } from "#components/forms/inputs"; +import { ArtistCard } from "#components/cards"; +import { Button } from "#components/buttons"; +import { + ProfileHeader, + Tabs, + IArtistDetails, + getArtist, + getArtists, +} from "#entities/profiles"; +import { validatePaysite } from "#entities/paysites"; + +import * as styles from "./new-linked-profile.module.scss"; + +interface IProps { + profile: IArtistDetails; +} + +interface IAction { + message: string; +} + +export function NewProfileLinkPage() { + const { profile } = useLoaderData() as IProps; + const [currentService, changeCurrentService] = useState(); + const [currentQuery, changeCurrentQuery] = useState(); + const [profileSuggestions, changeProfileSuggestions] = + useState>>(); + const [selectedProfile, changeSelectedProfile] = + useState>["artists"]>>(); + const title = "Link new profile"; + const heading = "Link New Profile"; + + useEffect(() => { + (async () => { + const profiles = await getArtists({ + service: currentService, + query: currentQuery, + }); + + changeProfileSuggestions(profiles); + })(); + }, [currentService, currentQuery]); + + return ( + + + +
    + +
    + +

    + If you believe this profile has other profiles on {SITE_NAME}, you can + use this form to request they be linked. +

    + + + id="new_link_form" + className="form--wide" + method="POST" + successElement={({ message }) => ( +
      +
    • {message}
    • +
    + )} + > + + + + + + + + + { + const query = event.currentTarget.value.trim(); + + changeCurrentQuery(query.length === 0 ? undefined : query); + }} + /> + + + + + + + + + + + Request link + + + +
    +
    + {!profileSuggestions ? ( + <>Please select a creator. + ) : profileSuggestions.count === 0 ? ( + <>No results found. + ) : ( + profileSuggestions.artists.slice(0, 20).map((profile) => ( +
    + + +
    + )) + )} +
    +
    +
    + ); +} + +export const loader = createAccountPageLoader(async function loader({ + params, +}: LoaderFunctionArgs): Promise { + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service name is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Profile ID is required."); + } + } + + const profile = await getArtist(service, profileID); + + return { profile }; +}); + +export async function action({ + params, + request, +}: ActionFunctionArgs): Promise { + if (request.method !== "POST") { + throw new Error(`Unknown method "${request.method}".`); + } + + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service name is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Profile ID is required."); + } + } + + const formData = await request.formData(); + + const inputData = (formData.get("creator") as string | null) + ?.trim() + .split("/"); + + if (!inputData) { + throw new Error("Input data is required."); + } + + if (inputData.length !== 2) { + throw new Error("Invalid input data length."); + } + + const [suggestedService, suggestedProfileID] = inputData; + + const reason = (formData.get("reason") as string | null)?.trim(); + + const { message } = await fetchAddProfileLink( + service, + profileID, + suggestedService, + suggestedProfileID, + reason + ); + + return { message }; +} diff --git a/client/src/pages/tags.scss b/client/src/pages/profile/tags.scss similarity index 93% rename from client/src/pages/tags.scss rename to client/src/pages/profile/tags.scss index 73e6282..8160aa1 100644 --- a/client/src/pages/tags.scss +++ b/client/src/pages/profile/tags.scss @@ -1,4 +1,4 @@ -@use "../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; h2#all-tags-header { margin-left: auto; diff --git a/client/src/pages/profile/tags.tsx b/client/src/pages/profile/tags.tsx new file mode 100644 index 0000000..7e642b7 --- /dev/null +++ b/client/src/pages/profile/tags.tsx @@ -0,0 +1,73 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { createProfileTagURL } from "#lib/urls"; +import { PageSkeleton } from "#components/pages"; +import { getTags } from "#entities/tags"; +import { paysites, validatePaysite } from "#entities/paysites"; +import { ProfileHeader, Tabs } from "#entities/profiles"; + +interface IProps extends Awaited> {} + +export function ProfileTagsPage() { + const { service, artist, tags } = useLoaderData() as IProps; + const paysite = paysites[service]; + const title = `Tags of "${artist.name}" from ${paysite.title}`; + + return ( + + + +
    + +
    + +
    + {tags.length === 0 ? ( +
    +

    + Nobody here but us chickens! +

    +

    There are no tags for your query.

    +
    + ) : ( + tags.map((tag, index) => ( + + )) + )} +
    +
    + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service name is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Artist ID is required."); + } + } + + const result = await getTags(service, profileID); + + return result; +} diff --git a/client/src/pages/profiles.module.scss b/client/src/pages/profiles.module.scss new file mode 100644 index 0000000..e913635 --- /dev/null +++ b/client/src/pages/profiles.module.scss @@ -0,0 +1,7 @@ +.loading { + text-align: center; +} + +.error { + text-align: center; +} diff --git a/client/src/pages/profiles.tsx b/client/src/pages/profiles.tsx new file mode 100644 index 0000000..f3f65f4 --- /dev/null +++ b/client/src/pages/profiles.tsx @@ -0,0 +1,327 @@ +import clsx from "clsx"; +import { Suspense, useRef, useState } from "react"; +import { + useLoaderData, + LoaderFunctionArgs, + Await, + useAsyncError, +} from "react-router"; +import { PAYSITE_LIST } from "#env/env-vars"; +import { + ARTISTS_OR_CREATORS_LOWERCASE, + AVAILABLE_PAYSITE_LIST, +} from "#env/derived-vars"; +import { createArtistsPageURL } from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { PageSkeleton } from "#components/pages"; +import { FooterAd, HeaderAd, SliderAd } from "#components/advs"; +import { Paginator } from "#components/pagination"; +import { CardList, ArtistCard } from "#components/cards"; +import { ButtonSubmit, FormRouter, FormSection } from "#components/forms"; +import { LoadingIcon } from "#components/loading"; +import { getArtists } from "#entities/profiles"; + +import * as styles from "./profiles.module.scss"; + +interface IProps { + results: ReturnType; + query?: string; + service?: string; + sort_by?: ISortField; + order?: "asc" | "desc"; + offset?: number; + true_count?: number; +} + +const sortFields = [ + "favorited", + "indexed", + "updated", + "name", + "service", +] as const; + +type ISortField = (typeof sortFields)[number]; + +function validateSortField(input: unknown): asserts input is ISortField { + if (!sortFields.includes(input as ISortField)) { + throw new Error(`Invalid sort field value "${input}".`); + } +} + +export function ArtistsPage() { + const { results, query, service, sort_by, order, offset } = + useLoaderData() as IProps; + const title = "Artists"; + const heading = "Artists"; + + return ( + + + + + +
    + + }> + } resolve={results}> + {(resolvedResult: Awaited) => ( + { + const url = createArtistsPageURL( + offset, + query, + service, + sort_by, + order + ); + + return String(url); + }} + /> + )} + + +
    + + + + Loading creators... please wait! +

    + } + > + }> + {(resolvedResult: Awaited) => + resolvedResult.artists.length === 0 ? ( +

    + No {ARTISTS_OR_CREATORS_LOWERCASE} found for your query. +

    + ) : ( + resolvedResult.artists.map((artist) => ( + + )) + ) + } +
    +
    +
    + +
    + }> + } resolve={results}> + {(resolvedResult: Awaited) => ( + { + const url = createArtistsPageURL( + offset, + query, + service, + sort_by, + order + ); + + return String(url); + }} + /> + )} + + +
    + + +
    + ); +} + +interface ISearchFormProps + extends Pick { } + +function SearchForm({ query, service, sort_by, order }: ISearchFormProps) { + const sortRef = useRef(null); + const timeoutRef = useRef(null); + const [sortDirection, setSortDirection] = useState(order); + + const onSortChange = (e: React.MouseEvent) => { + e.preventDefault(); + setSortDirection(sortDirection === "asc" ? "desc" : "asc"); + if (sortRef.current) { + sortRef.current.value = sortDirection === "asc" ? "desc" : "asc"; + sortRef.current.form?.requestSubmit(); + } + } + const onSelectChange = (e: React.ChangeEvent) => e.currentTarget.form?.requestSubmit(); + const onInputChange = (e: React.ChangeEvent) => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + + const target = e.currentTarget as HTMLInputElement; + + timeoutRef.current = setTimeout(() => { + if (target.form) target.form.requestSubmit(); + }, 500); + }; + + return ( + + {(state) => ( + <> +
    + + + + +
    +
    + + + +
    + + + )} +
    + ); +} + +function CollectionError() { + const error = useAsyncError(); + console.error(error); + + return ( +
    +

    Failed to load artists.

    +
    + Details + {/* @ts-expect-error vague type definition */} +

    {error?.statusText || error?.message}

    +
    +
    + ); +} + +export async function loader({ + request, +}: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + let offset: IProps["offset"] | undefined = undefined; + { + const inputOffset = searchParams.get("o")?.trim(); + + if (inputOffset) { + offset = parseOffset(inputOffset); + } + } + + let query: IProps["query"] | undefined = searchParams.get("q")?.trim(); + + let sort_by: IProps["sort_by"] | undefined = undefined; + { + const inputValue = searchParams.get("sort_by")?.trim(); + + if (inputValue) { + validateSortField(inputValue); + sort_by = inputValue; + } + } + + let order_by: IProps["order"] | undefined = undefined; + { + const inputValue = searchParams.get("order")?.trim(); + + if (inputValue) { + if (inputValue !== "asc" && inputValue !== "desc") { + throw new Error(`Invalid order by field "${inputValue}".`); + } + + order_by = inputValue; + } + } + + let service: IProps["service"] = undefined; + { + const inputValue = searchParams.get("service")?.trim(); + + if (inputValue) { + if (!PAYSITE_LIST.includes(inputValue)) { + throw new Error(`Unknown service "${inputValue}".`); + } + } + + service = inputValue; + } + + const results = getArtists({ + offset, + order: order_by, + service, + sort_by, + query, + }); + + const pageProps = { + results, + sort_by, + order: order_by, + offset, + service, + query, + } satisfies IProps; + + return pageProps; +} diff --git a/client/src/pages/profiles/random.tsx b/client/src/pages/profiles/random.tsx new file mode 100644 index 0000000..575cad7 --- /dev/null +++ b/client/src/pages/profiles/random.tsx @@ -0,0 +1,10 @@ +import { redirect } from "react-router"; +import { createProfilePageURL } from "#lib/urls"; +import { fetchRandomArtist } from "#api/profiles"; + +export async function loader() { + const { service, artist_id } = await fetchRandomArtist(); + const url = String(createProfilePageURL({ service, profileID: artist_id })); + + return redirect(url); +} diff --git a/client/src/pages/profiles/updated.tsx b/client/src/pages/profiles/updated.tsx new file mode 100644 index 0000000..857d811 --- /dev/null +++ b/client/src/pages/profiles/updated.tsx @@ -0,0 +1,97 @@ +import clsx from "clsx"; +import { useLoaderData, LoaderFunctionArgs } from "react-router"; +import { ARTISTS_OR_CREATORS_LOWERCASE } from "#env/derived-vars"; +import { createArtistsUpdatedPageURL } from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { PageSkeleton } from "#components/pages"; +import { FooterAd, HeaderAd, SliderAd } from "#components/advs"; +import { Paginator } from "#components/pagination"; +import { CardList, ArtistCard } from "#components/cards"; +import { getArtists } from "#entities/profiles"; + +interface IProps { + results: Awaited>["artists"]; + offset: number; + count: number; +} + +export function ArtistsUpdatedPage() { + const { results, count, offset } = useLoaderData() as IProps; + const title = "Latest cached updated artists"; + const heading = "Latest Cached Updated Artists"; + + return ( + + + +
    + { + const url = createArtistsUpdatedPageURL(offset); + + return String(url); + }} + /> +
    + + + + + {results.length === 0 ? ( +

    + No {ARTISTS_OR_CREATORS_LOWERCASE} found for your query. +

    + ) : ( + results.map((artist) => ( + + )) + )} +
    + +
    + { + const url = createArtistsUpdatedPageURL(offset); + + return String(url); + }} + /> +
    + + +
    + ); +} + +export async function loader({ request }: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + const sort_by = "updated"; + + let offset: IProps["offset"] = 0; + { + const inputOffset = searchParams.get("o")?.trim(); + + if (inputOffset) { + offset = parseOffset(inputOffset); + } + } + + const { artists, count } = await getArtists({ offset, sort_by }); + + return { + results: artists, + count, + offset, + }; +} diff --git a/client/src/pages/review_dms/dms.js b/client/src/pages/review_dms/dms.js deleted file mode 100644 index eb87036..0000000 --- a/client/src/pages/review_dms/dms.js +++ /dev/null @@ -1,14 +0,0 @@ -import { initPendingReviewDms } from "@wp/js/pending-review-dms"; - -export async function reviewDMsPage() { - - const status_selector = document.getElementById("status"); - status_selector.addEventListener("change", async function (e) { - e.preventDefault(); - const currentUrl = new URL(window.location.href); - const urlParams = currentUrl.searchParams; - urlParams.set('status', status_selector.value); - window.location.href = currentUrl.toString(); - }); - await initPendingReviewDms(true); -} diff --git a/client/src/pages/review_dms/dms.scss b/client/src/pages/review_dms/dms.scss index 3309d35..a3d42de 100644 --- a/client/src/pages/review_dms/dms.scss +++ b/client/src/pages/review_dms/dms.scss @@ -1,4 +1,4 @@ -@use "../../css/config/variables" as *; +@use "../../css/config/variables/sass" as *; .site-section--review-dms { .dms { diff --git a/client/src/pages/review_dms/review_dms.html b/client/src/pages/review_dms/review_dms.html deleted file mode 100644 index 7c13def..0000000 --- a/client/src/pages/review_dms/review_dms.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/cards/dm.html' import dm_card %} - -{% block title %} - Approve DMs for import to {{ g.site_name }}. -{% endblock title %} - -{% block meta %} - -{% endblock meta %} - -{% block content %} -
    -
    -

    - DM Review for {{ props.import_id }} -

    -
    -
    - - -
    -
    -
    - {% if props.dms %} -
    - {% for dm in props.dms %} -
    - -
    - {{ dm_card(dm, class_name='dms__card', is_private=true, artist=(dm|attr("artist") or {}) ) }} - -
    -
    - {% endfor %} - {% if props.status == "ignored" %} - - {% endif %} -
    - -
    -
    - {% else %} -

    - There are no DMs waiting for approval. -

    - {% endif %} -
    -{% endblock %} diff --git a/client/src/pages/review_dms/review_dms.module.scss b/client/src/pages/review_dms/review_dms.module.scss new file mode 100644 index 0000000..0e3a7bb --- /dev/null +++ b/client/src/pages/review_dms/review_dms.module.scss @@ -0,0 +1,3 @@ +.link { + text-align: center; +} diff --git a/client/src/pages/review_dms/review_dms.tsx b/client/src/pages/review_dms/review_dms.tsx new file mode 100644 index 0000000..5075b6c --- /dev/null +++ b/client/src/pages/review_dms/review_dms.tsx @@ -0,0 +1,157 @@ +import clsx from "clsx"; +import { + ActionFunctionArgs, + LoaderFunctionArgs, + redirect, + useLoaderData, +} from "react-router"; +import { createAccountDMsReviewPageURL } from "#lib/urls"; +import { fetchApproveDMs, fetchDMsForReview } from "#api/account/dms"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; +import { DMCard } from "#components/cards"; +import { FormRouter } from "#components/forms"; +import { KemonoLink } from "#components/links"; +import { IUnapprovedDM } from "#entities/dms"; + +import * as styles from "./review_dms.module.scss"; + +interface IProps { + status: "pending" | "ignored"; + dms: IUnapprovedDM[]; +} + +export function DMsReviewPage() { + const { status, dms } = useLoaderData() as IProps; + const title = `Approve DMs`; + const heading = `DM Review`; + + return ( + +

    + + {status === "pending" ? <>Ignored DMs : <>Pending DMs} + +

    + + {!dms || dms.length === 0 ? ( +

    There are no DMs waiting for approval.

    + ) : ( + <> + + {dms.map((dm) => ( +
    + +
    + + +
    +
    + ))} + + {status === "ignored" && ( + + )} + +
    + +
    +
    + + )} +
    + ); +} + +export const loader = createAccountPageLoader(async function loader({ + request, +}: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + let status: undefined | IProps["status"] = undefined; + { + const inputStatus = searchParams.get("status")?.trim() ?? "pending"; + + if (inputStatus !== "pending" && inputStatus !== "ignored") { + throw new Error(`Unknown status "${inputStatus}".`); + } + + status = inputStatus; + } + + const { dms } = await fetchDMsForReview(status); + + return { + status, + dms, + }; +}); + +export async function action({ request }: ActionFunctionArgs) { + try { + if (request.method !== "POST") { + throw new Error(`Unknown method ${request.method}.`); + } + + const formData = await request.formData(); + const approvedHashes = formData.getAll("approved_hashes") as string[]; + const deleteIgnored = + (formData.get("delete_ignored") as string | null)?.trim() === "true"; + + if (approvedHashes.length === 0) { + throw new Error("At least one DM must be provided for approval."); + } + + await fetchApproveDMs(approvedHashes, deleteIgnored); + + return redirect(String(createAccountDMsReviewPageURL())); + } catch (error) { + return error; + } +} diff --git a/client/src/pages/schema.html b/client/src/pages/schema.html deleted file mode 100644 index f7829da..0000000 --- a/client/src/pages/schema.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'components/shell.html' %} -{% block content %} - - -{% endblock %} \ No newline at end of file diff --git a/client/src/pages/search_hash.html b/client/src/pages/search_hash.html deleted file mode 100644 index 5b92c83..0000000 --- a/client/src/pages/search_hash.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "components/shell.html" %} -{% from "components/file_hash_search.html" import search_form %} - -{% block title %} - Search files | {{ g.site_name }} -{% endblock title %} - -{% block content %} - -{% endblock content %} diff --git a/client/src/pages/search_hash.js b/client/src/pages/search_hash.js deleted file mode 100644 index 404875d..0000000 --- a/client/src/pages/search_hash.js +++ /dev/null @@ -1,43 +0,0 @@ -import sha256 from "sha256-wasm"; - -export function searchHashPage() { - const FORM = document.getElementById("file-search"); - const FILE = document.getElementById("file"); - const HASH = document.getElementById("hash"); - - FORM.addEventListener("submit", async function (e) { - - e.preventDefault(); - let hash = undefined; - if (FILE.value !== "") { - hash = await getFileHash(FILE.files[0]); - } else if (HASH.value !== "") { - if (HASH.value.match(/[A-Fa-f0-9]{64}/)) { - hash = HASH.value; - } else { - alert("Invalid SHA256 hash"); - } - } else { - alert("Neither file or hash provided"); - } - - if (hash) { - window.location.search = "?hash=" + hash; - } - }); -} - -async function getFileHash(file) { - const fileSize = file.size; - const chunkSize = 1024 * 1024; // 1Mi - let offset = 0; - let hash = new sha256(); - - while (offset < fileSize) { - const arr = new Uint8Array(await file.slice(offset, chunkSize + offset).arrayBuffer()); - hash.update(arr); - offset += chunkSize; - } - - return hash.digest("hex"); -} diff --git a/client/src/pages/search_hash.module.scss b/client/src/pages/search_hash.module.scss new file mode 100644 index 0000000..af0a7ea --- /dev/null +++ b/client/src/pages/search_hash.module.scss @@ -0,0 +1,21 @@ +.searchForm { + text-align: center; + padding-top: 1em; + padding-bottom: 0.5em; + width: fit-content; + margin-left: auto; + margin-right: auto; + + span { + user-select: none; + } + + .error { + color: red; + } + + button { + width: 100%; + margin-top: 1em; + } +} diff --git a/client/src/pages/search_hash.tsx b/client/src/pages/search_hash.tsx new file mode 100644 index 0000000..785545a --- /dev/null +++ b/client/src/pages/search_hash.tsx @@ -0,0 +1,149 @@ +// TODO: https://github.com/Daninet/hash-wasm probably +// since this one wasn't updated in 3 years +import sha256 from "sha256-wasm"; +import { + createDiscordChannelPageURL, +} from "#lib/urls"; +import { fetchSearchFileByHash } from "#api/files"; +import { PageSkeleton } from "#components/pages"; +import { CardList, PostCard } from "#components/cards"; +import { KemonoLink } from "#components/links"; +import { MouseEvent, useEffect, useState } from "react"; +import { LoadingIcon } from "#components/loading"; +import { useSearchParams } from "react-router"; + +import * as styles from "./search_hash.module.scss"; + +export function SearchFilesPage() { + const [searchParams, setSearchParams] = useSearchParams(); + const initialHash = searchParams.get("hash")?.toLowerCase(); + const title = "Search files"; + const heading = "Search Files"; + const [loading, setLoading] = useState(false); + const [error, setError] = useState(""); + const [files, setFiles] = useState(null); + const [hash, setHash] = useState(initialHash ?? ""); + const [result, setResult] = useState> | null>(null); + + function setHashParam(hash: string) { + setSearchParams(params => { + params.set("hash", hash); + return params; + }, { replace: true }); + } + + async function lookup(hash: string) { + setLoading(true); + + try { + if (files?.length) { + let fileHash = await getFileHash(files[0]); + setResult(await fetchSearchFileByHash(fileHash)); + setHash(fileHash); + setHashParam(fileHash); + } else { + if (hash.match(/[a-f0-9]{64}/)) { + setResult(await fetchSearchFileByHash(hash)); + setHash(hash); + setHashParam(hash); + } else { + setError("Invalid hash!"); + } + } + } finally { + setLoading(false); + } + } + + useEffect(() => { + if (initialHash) { + lookup(initialHash); + } + }, []); + + async function submitClicked(event: MouseEvent) { + event.preventDefault(); + await lookup(hash); + } + + return ( + +
    +
    + + setFiles(e.target.files)} /> +
    + +
    + +
    + —or— +
    +
    +
    + +
    + + setHash(e.target.value.toLowerCase())} value={hash} /> +
    + +
    + {error} +
    + + +
    + + {loading ? : result?.posts?.length ? ( + + {result.posts.map((post, index) => ( + + ))} + + ) : result?.discord_posts?.length ? ( + <> +

    Discord

    + {result.discord_posts.map((post, index) => ( +

    + + Server {post.server} channel {post.channel} + +

    + ))} + + ) : ( +
    +

    + Nobody here but us chickens! +

    +

    There are no posts for your query.

    +
    + )} +
    + ); +} + +async function getFileHash(file: File) { + const fileSize = file.size; + const chunkSize = 1024 * 1024; // 1Mi + let offset = 0; + let hash = new sha256(); + + while (offset < fileSize) { + const arr = new Uint8Array( + await file.slice(offset, chunkSize + offset).arrayBuffer() + ); + hash.update(arr); + offset += chunkSize; + } + + return hash.digest("hex"); +} diff --git a/client/src/pages/search_results.html b/client/src/pages/search_results.html deleted file mode 100644 index b2195bd..0000000 --- a/client/src/pages/search_results.html +++ /dev/null @@ -1,41 +0,0 @@ -{% extends "components/shell.html" %} - -{% from "components/card_list.html" import card_list %} -{% from "components/cards/post.html" import post_card %} -{% from "components/file_hash_search.html" import search_form %} - -{% block title %} - File search results | {{ g.site_name }} -{% endblock title %} - -{% block meta %} - -{% endblock meta %} - -{% block content %} - -{% endblock content %} diff --git a/client/src/pages/search_results.js b/client/src/pages/search_results.js deleted file mode 100644 index e69de29..0000000 diff --git a/client/src/pages/share.html b/client/src/pages/share.html deleted file mode 100644 index 7515bb0..0000000 --- a/client/src/pages/share.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/site_section.html' import site_section, site_section_header %} - -{% block scripts_extra %} - - -{% endblock scripts_extra %} - -{% block content %} -{% call site_section('upload') %} -
    - {{ site_section_header(share.name) }} -
    {{ share.description }}
    - {% for file in share_files %} -
  • - - Download {{ file['filename'] }} - -
  • - {% endfor %} -
    -{% endcall %} -{% endblock %} diff --git a/client/src/pages/share.tsx b/client/src/pages/share.tsx new file mode 100644 index 0000000..6946fbd --- /dev/null +++ b/client/src/pages/share.tsx @@ -0,0 +1,54 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { createFileURL } from "#lib/urls"; +import { fetchShare } from "#api/shares"; +import { PageSkeleton } from "#components/pages"; +import { IShare, IShareFile } from "#entities/files"; + +interface IProps { + share: IShare; + files: IShareFile[]; +} + +export function SharePage() { + const { share, files } = useLoaderData() as IProps; + const title = `Share "${share.name}"`; + const heading = `Share "${share.name}"`; + + return ( + +
    +
    {share.description}
    + + {files.map((file) => ( +
  • + + Download {file.filename} + +
  • + ))} +
    +
    + ); +} + +export async function loader({ params }: LoaderFunctionArgs): Promise { + const shareID = params.share_id?.trim(); + + if (!shareID) { + throw new Error("Share ID is required."); + } + + const { share, share_files } = await fetchShare(shareID); + + return { + share, + files: share_files, + }; +} diff --git a/client/src/pages/shares-all.tsx b/client/src/pages/shares-all.tsx new file mode 100644 index 0000000..2019774 --- /dev/null +++ b/client/src/pages/shares-all.tsx @@ -0,0 +1,75 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { createSharesPageURL } from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { fetchShares } from "#api/shares"; +import { PageSkeleton } from "#components/pages"; +import { Paginator } from "#components/pagination"; +import { CardList, ShareCard } from "#components/cards"; +import { IShare } from "#entities/files"; + +interface IProps { + count: number; + offset?: number; + shares: IShare[]; +} + +export function SharesPage() { + const { count, offset, shares } = useLoaderData() as IProps; + const title = "Filehaus"; + const heading = "Filehaus"; + + return ( + +
    + String(createSharesPageURL(offset))} + /> +
    + + + {count === 0 ? ( +
    +

    + Nobody here but us chickens! +

    +

    There are no uploads.

    +
    + ) : ( + shares.map((share) => ) + )} +
    + +
    + String(createSharesPageURL(offset))} + /> +
    +
    + ); +} + +export async function loader({ request }: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + + let offset: number | undefined = undefined; + { + const inputOffset = searchParams.get("o")?.trim(); + + if (inputOffset) { + offset = parseOffset(inputOffset); + } + } + + const { props } = await fetchShares(offset); + const { count, shares } = props; + + return { + offset, + count, + shares, + }; +} diff --git a/client/src/pages/shares.html b/client/src/pages/shares.html deleted file mode 100644 index d46faec..0000000 --- a/client/src/pages/shares.html +++ /dev/null @@ -1,49 +0,0 @@ -{% extends 'components/shell.html' %} - -{% import 'components/site.html' as site %} -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/share.html' import share_card %} - -{% block content %} -{% call site.section("all-dms", title="Filehaus") %} -
    - {% include 'components/paginator.html' %} - {# - - #} -
    - - {% call card_list("phone") %} - {% for dm in props.shares %} - {{ share_card(dm) }} - {% else %} -
    -

    Nobody here but us chickens!

    -

    - There are no uploads. -

    -
    - {% endfor %} - {% endcall %} - -
    - {% include 'components/paginator.html' %} -
    -{% endcall %} -{% endblock %} diff --git a/client/src/pages/shares.tsx b/client/src/pages/shares.tsx new file mode 100644 index 0000000..64d1cf7 --- /dev/null +++ b/client/src/pages/shares.tsx @@ -0,0 +1,107 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { createProfilesSharesPageURL } from "#lib/urls"; +import { parseOffset } from "#lib/pagination"; +import { fetchProfileShares } from "#api/shares"; +import { PageSkeleton } from "#components/pages"; +import { Paginator } from "#components/pagination"; +import { CardList, ShareCard } from "#components/cards"; +import { validatePaysite } from "#entities/paysites"; +import { IShare } from "#entities/files"; + +interface IProps { + service: string; + profileID: string; + offset?: number; + count: number; + shares: IShare[]; +} + +export function ProfileSharesPage() { + const { service, profileID, count, offset, shares } = + useLoaderData() as IProps; + const title = "Filehaus"; + const heading = "Filehaus"; + + return ( + +
    + + String(createProfilesSharesPageURL(service, profileID, offset)) + } + /> +
    + + + {!count ? ( +
    +

    + Nobody here but us chickens! +

    +

    There are no uploads.

    +
    + ) : ( + shares.map((share) => ) + )} +
    + +
    + + String(createProfilesSharesPageURL(service, profileID, offset)) + } + /> +
    +
    + ); +} + +export async function loader({ + params, + request, +}: LoaderFunctionArgs): Promise { + const searchParams = new URL(request.url).searchParams; + const service = params.service?.trim(); + { + if (!service) { + throw new Error("Service name is required."); + } + + validatePaysite(service); + } + + const profileID = params.creator_id?.trim(); + { + if (!profileID) { + throw new Error("Artist ID is required."); + } + } + + let offset: number | undefined = undefined; + { + const inputOffset = searchParams.get("o")?.trim(); + + if (inputOffset) { + offset = parseOffset(inputOffset); + } + } + + const { results, props } = await fetchProfileShares( + service, + profileID, + offset + ); + const { share_count } = props; + + return { + service, + profileID, + shares: results, + count: share_count, + offset, + }; +} diff --git a/client/src/pages/success.html b/client/src/pages/success.html deleted file mode 100644 index eb5aa8a..0000000 --- a/client/src/pages/success.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends 'components/shell.html' %} - -{% block content %} -

    {{ props.message or 'Success!' }}

    - {% if props.redirect %} - - {% endif %} -{% endblock %} diff --git a/client/src/pages/swagger_schema.html b/client/src/pages/swagger_schema.html deleted file mode 100644 index aa38187..0000000 --- a/client/src/pages/swagger_schema.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - SwaggerUI - - - -
    - - - - - \ No newline at end of file diff --git a/client/src/pages/tags-all.tsx b/client/src/pages/tags-all.tsx new file mode 100644 index 0000000..cccba09 --- /dev/null +++ b/client/src/pages/tags-all.tsx @@ -0,0 +1,36 @@ +import { LoaderFunctionArgs, useLoaderData } from "react-router"; +import { PageSkeleton } from "#components/pages"; +import { ITag } from "#entities/tags"; +import { createTagPageURL } from "#lib/urls"; +import { fetchTags } from "#api/tags"; + +interface IProps { + tags: ITag[]; +} + +export function TagsPage() { + const { tags } = useLoaderData() as IProps; + const title = "All tags"; + const heading = "All Tags"; + + return ( + +
    + {tags.map((tag) => ( + + ))} +
    +
    + ); +} + +export async function loader({}: LoaderFunctionArgs): Promise { + const { tags } = await fetchTags(); + + return { tags }; +} diff --git a/client/src/pages/tags.html b/client/src/pages/tags.html deleted file mode 100644 index decf5b2..0000000 --- a/client/src/pages/tags.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends "components/shell.html" %} - -{% from "components/headers.html" import user_header %} - -{% block title %} - Tags | {{g.site_name}} -{% endblock %} - -{% block content %} - -{% endblock %} - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} diff --git a/client/src/pages/updated.html b/client/src/pages/updated.html deleted file mode 100644 index 09520f1..0000000 --- a/client/src/pages/updated.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/user.html' import user_card, user_card_header %} - -{% block content %} -
    - {% if results|length %} -
    - {% include 'components/paginator.html' %} -
    - {% endif %} - {% call card_list('phone') %} - {% for user in results %} - {{ user_card(user, is_date=true) }} - {% else %} -

    - No {{ g.artists_or_creators|lower }} found. -

    - {% endfor %} - {% endcall %} - {% if results|length %} -
    - {% include 'components/paginator.html' %} -
    - {% endif %} -
    -{% endblock %} diff --git a/client/src/pages/updated.js b/client/src/pages/updated.js deleted file mode 100644 index 4ae8559..0000000 --- a/client/src/pages/updated.js +++ /dev/null @@ -1,23 +0,0 @@ -import { CardList, registerPaginatorKeybinds } from "@wp/components"; -import { isLoggedIn } from "@wp/js/account"; -import { findFavouriteArtist } from "@wp/js/favorites"; - -/** - * @param {HTMLElement} section - */ -export async function updatedPage(section) { - registerPaginatorKeybinds(); - - const cardListElement = section.querySelector(".card-list"); - const { cardContainer } = CardList(cardListElement); - - for await (const userCard of cardContainer.children) { - const { id, service } = userCard.dataset; - - const isFaved = isLoggedIn && (await findFavouriteArtist(id, service)); - - if (isFaved) { - userCard.classList.add("user-card--fav"); - } - } -} diff --git a/client/src/pages/upload.html b/client/src/pages/upload.html deleted file mode 100644 index ea74e65..0000000 --- a/client/src/pages/upload.html +++ /dev/null @@ -1,87 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/site_section.html' import site_section, site_section_header %} - -{% block scripts_extra %} - - -{% endblock scripts_extra %} - -{% block content %} -{% call site_section('upload') %} -
    - {{ site_section_header('Upload file') }} -
    -
    - {% if request.args.get('service') and request.args.get('user') %} - - - {% else %} - {# #} - {% endif %} -
    -
    - - - - example, "February 2020 Rewards" - -
    -
    - - - - Specify what the file/archive is, where the original data can be found, include relevant keys/passwords, etc. - -
    -
      -
    -
    - Add files -
    -
    - -
    -
    -
    -
    -
    -{% endcall %} -{% endblock %} diff --git a/client/src/pages/upload.js b/client/src/pages/upload.js deleted file mode 100644 index a8a6975..0000000 --- a/client/src/pages/upload.js +++ /dev/null @@ -1,57 +0,0 @@ -import Dashboard from "@uppy/dashboard"; -import Form from "@uppy/form"; -import Uppy from "@uppy/core"; -import Tus from "@uppy/tus"; - -import "@uppy/dashboard/dist/style.min.css"; -import "@uppy/core/dist/style.min.css"; - -// import "@wp/js/resumable"; - -/** - * @param {HTMLElement} section - */ -export async function uploadPage(section) { - Array.from(document.getElementsByTagName("textarea")).forEach((tx) => { - function onTextareaInput() { - this.style.height = "auto"; - this.style.height = this.scrollHeight + "px"; - } - tx.setAttribute("style", "height:" + tx.scrollHeight + "px;overflow-y:hidden;"); - tx.addEventListener("input", onTextareaInput, false); - }); - - const uppy = new Uppy({ - restrictions: { - maxTotalFileSize: 2 * 1024 * 1024 * 1024, - maxNumberOfFiles: 10, - minNumberOfFiles: 1, - }, - }) - .use(Dashboard, { - note: "Up to 10 files permitted.", - fileManagerSelectionType: "both", - target: "#upload", - // inline: true, - inline: false, - trigger: "#upload-button", - theme: "dark", - }) - .use(Tus, { - // endpoint: 'https://tusd.tusdemo.net/files/', - endpoint: "http://localhost:1080/files/", - retryDelays: [0, 1000, 3000, 5000], - }) - .use(Form, { - resultName: "uppyResult", - target: "#upload-form", - submitOnSuccess: false, - }); - - uppy.on("complete", ({ successful }) => { - successful.forEach((file) => { - const fileList = document.getElementById("file-list"); - fileList.innerHTML += `
  • ${file.meta.name}
  • `; - }); - }); -} diff --git a/client/src/pages/upload.tsx b/client/src/pages/upload.tsx new file mode 100644 index 0000000..bac8d70 --- /dev/null +++ b/client/src/pages/upload.tsx @@ -0,0 +1,179 @@ +import { useEffect, useState } from "react"; +import { + ActionFunctionArgs, + LoaderFunctionArgs, + useLoaderData, +} from "react-router"; +import Uppy from "@uppy/core"; +import Dashboard from "@uppy/dashboard"; +import Form from "@uppy/form"; +import Tus from "@uppy/tus"; +import { FormRouter, FormSection } from "#components/forms"; +import { InputHidden } from "#components/forms/inputs"; +import { PageSkeleton, createAccountPageLoader } from "#components/pages"; + +import "@uppy/dashboard/dist/style.min.css"; +import "@uppy/core/dist/style.min.css"; + +interface IProps { + service?: string; + profileID?: string; +} + +export function Component() { + const { service, profileID } = useLoaderData() as IProps; + const [fileList, changeFileList] = useState(); + const title = "Upload file"; + const heading = "Upload File"; + + useEffect(() => { + (async () => { + try { + const uppy = new Uppy({ + restrictions: { + maxTotalFileSize: 2 * 1024 * 1024 * 1024, + maxNumberOfFiles: 10, + minNumberOfFiles: 1, + }, + }) + .use(Dashboard, { + note: "Up to 10 files permitted.", + fileManagerSelectionType: "both", + target: "#upload", + // inline: true, + inline: false, + trigger: "#upload-button", + theme: "dark", + }) + .use(Tus, { + // endpoint: 'https://tusd.tusdemo.net/files/', + endpoint: "http://localhost:1080/files/", + retryDelays: [0, 1000, 3000, 5000], + }) + .use(Form, { + resultName: "uppyResult", + target: "#upload-form", + submitOnSuccess: false, + }); + + uppy.on("complete", ({ successful }) => { + const files = successful?.map( + (file) => file.meta.name + ); + + changeFileList(files); + }); + } catch (error) { + console.error(error); + } + })(); + }, []); + + return ( + +
    + "Finish"} + > + + {Boolean(service && profileID) && ( + <> + + + + )} + + + + + + example, "February 2020 Rewards" + + + + + + + Specify what the file/archive is, where the original data can be + found, include relevant keys/passwords, etc. + + + +
      + {fileList?.map((name, index) => ( +
    • {name as string}
    • + ))} +
    + +
    + Add files +
    +
    + +
    +
    +
    + ); +} + +Component.displayName = "PostsUploadPage"; + +export const loader = createAccountPageLoader(async function loader({ + request, +}: LoaderFunctionArgs): Promise { + throw new Error("Not implemented"); + const searchParams = new URL(request.url).searchParams; + + const service = searchParams.get("service")?.trim(); + const profileID = searchParams.get("user")?.trim(); + + return { + service, + profileID, + }; +}); + +export async function action({ request }: ActionFunctionArgs) { + throw new Error("Not implemented"); + if (request.method !== "POST") { + throw new Error(`Unknown method "${request.method}".`); + } + + const formData = await request.formData(); + + const service = (formData.get("service") as string | null)?.trim(); + const profileID = (formData.get("user") as string | null)?.trim(); + const content = (formData.get("content") as string | null)?.trim(); +} diff --git a/client/src/pages/user.html b/client/src/pages/user.html deleted file mode 100644 index be968d5..0000000 --- a/client/src/pages/user.html +++ /dev/null @@ -1,91 +0,0 @@ -{% extends 'components/shell.html' %} - -{% from 'components/ads.html' import slider_ad, header_ad, footer_ad %} -{% from 'components/headers.html' import user_header %} -{% from "components/loading_icon.html" import loading_icon %} -{% from 'components/card_list.html' import card_list %} -{% from 'components/cards/post.html' import post_card %} - -{% set paysite = g.paysites[props.service] %} -{% set page_title = 'Posts of ' ~ props.name ~ ' from ' ~ paysite.title ~ ' | ' ~ g.site_name %} - -{% block title %} - {{ page_title }} -{% endblock title %} - -{% block meta %} - - - - -{% endblock meta %} - -{% block opengraph %} - - - - - -{% endblock opengraph %} - -{% block content %} -{{ slider_ad() }} -
    - {{ user_header(request, props) }} -
    - {% include 'components/tabs.html' %} - {% if results or request.args.get('q') %} - {% include 'components/paginator.html' %} -
    - - -
    - {% endif %} -
    - {% if results or request.args.get('q') %} - {{ header_ad() }} - - {% call card_list() %} - {% for post in results %} - {{ post_card(post) }} - {% endfor %} - {% endcall %} - - {{ footer_ad() }} - -
    - {% include 'components/paginator.html' %} -
    - {% endif %} - {% if not results %} -
    -

    Nobody here but us chickens!

    -

    - There are no posts for your query. -

    -
    - {% endif %} - -
    -{% endblock content %} - -{% block components %} - - {{ loading_icon() }} -{% endblock components %} diff --git a/client/src/pages/user.js b/client/src/pages/user.js deleted file mode 100644 index b27401e..0000000 --- a/client/src/pages/user.js +++ /dev/null @@ -1,122 +0,0 @@ -import { addFavouriteArtist, findFavouriteArtist, findFavouritePost, removeFavouriteArtist } from "@wp/js/favorites"; -import { CardList, PostCard, registerMessage, registerPaginatorKeybinds, showTooltip } from "@wp/components"; -import { createComponent } from "@wp/js/component-factory"; -import { isLoggedIn } from "@wp/js/account"; - -/** - * @param {HTMLElement} section - */ -export async function userPage(section) { - registerPaginatorKeybinds(); - - const artistID = document.head.querySelector("[name='id']")?.content; - const artistService = document.head.querySelector("[name='service']")?.content; - /** - * @type {HTMLElement} - */ - const buttonsPanel = section.querySelector(".user-header__actions"); - const cardListElement = section.querySelector(".card-list"); - - document.styleSheets[0].insertRule(".post-card__footer > div > img { display: none; }", 0); - await initButtons(buttonsPanel, artistID, artistService); - const urlPath = document.location.pathname; - if (urlPath.includes("fancards") ||urlPath.includes("tags")) return; - if (cardListElement) { - await initCardList(cardListElement); - } -} - -/** - * @param {HTMLElement} panelElement - * @param {string} artistID - * @param {string} artistService - */ -async function initButtons(panelElement, artistID, artistService) { - /** - * @type {HTMLButtonElement} - */ - const favButton = createComponent("user-header__favourite"); - if (!favButton) return; - const favItem = await findFavouriteArtist(artistID, artistService); - if (localStorage.getItem("logged_in") && favItem) { - favButton.classList.add("user-header__favourite--unfav"); - const [icon, text] = favButton.children; - icon.textContent = "★"; - text.textContent = "Unfavorite"; - } - - favButton.addEventListener("click", handleFavouriting(artistID, artistService)); - - panelElement?.appendChild(favButton); -} - -/** - * @param {HTMLElement} cardListElement - */ -async function initCardList(cardListElement) { - const { cardItems } = CardList(cardListElement); - - cardItems.forEach(async (card) => { - const { postID, userID, service } = PostCard(card); - const favPost = isLoggedIn && (await findFavouritePost(service, userID, postID)); - - if (favPost) { - card.classList.add("post-card--fav"); - } - }); -} - -/** - * @param {string} id - * @param {string} service - * @returns {(event: MouseEvent) => Promise} - */ -function handleFavouriting(id, service) { - return async (event) => { - /** - * @type {HTMLButtonElement} - */ - const button = event.target; - - if (!isLoggedIn) { - showTooltip(button, registerMessage(null, "Favoriting")); - return; - } - - const [icon, text] = button.children; - /** - * @type {HTMLElement} - */ - const loadingIcon = createComponent("loading-icon"); - - button.disabled = true; - button.classList.add("user-header__favourite--loading"); - button.insertBefore(loadingIcon, text); - - try { - if (button.classList.contains("user-header__favourite--unfav")) { - const isRemoved = await removeFavouriteArtist(id, service); - - if (isRemoved) { - button.classList.remove("user-header__favourite--unfav"); - icon.textContent = "☆"; - text.textContent = "Favorite"; - } - } else { - const isAdded = await addFavouriteArtist(id, service); - - if (isAdded) { - button.classList.add("user-header__favourite--unfav"); - icon.textContent = "★"; - text.textContent = "Unfavorite"; - } - } - } catch (error) { - console.error(error); - } finally { - loadingIcon.remove(); - button.disabled = false; - button.classList.remove("user-header__favourite--loading"); - } - }; -} diff --git a/client/src/router.tsx b/client/src/router.tsx new file mode 100644 index 0000000..34acc26 --- /dev/null +++ b/client/src/router.tsx @@ -0,0 +1,17 @@ +import { createBrowserRouter } from "react-router"; + +import { routes } from "./routes"; + +export const router = createBrowserRouter( + routes, + { + future: { + v7_relativeSplatPath: true, + v7_normalizeFormMethod: true, + v7_startTransition: true, + v7_fetcherPersist: true, + v7_partialHydration: true, + v7_skipActionErrorRevalidation: true, + }, + } +); diff --git a/client/src/routes.tsx b/client/src/routes.tsx new file mode 100644 index 0000000..f856872 --- /dev/null +++ b/client/src/routes.tsx @@ -0,0 +1,438 @@ +import { Layout } from "#components/layout"; +import { ErrorPage } from "#components/pages"; +import { HomePage } from "#pages/home"; +import { ImporterTutorialPage } from "#pages/importer/importer_tutorial"; +import { ImporterTutorialFanboxPage } from "#pages/importer/importer_tutorial_fanbox"; +import { ImporterPage } from "#pages/importer/importer_list"; +import { SearchFilesPage } from "#pages/search_hash"; +import { ImporterOKPage } from "#pages/importer/importer_ok"; +import { + AdministratorDashboardPage, + loader as administratorDashboardPageLoader, +} from "#pages/account/administrator/dashboard"; +import { + AccountLoginPage, + action as accountLoginPageAction, +} from "#pages/account/login"; +import { ArtistsPage, loader as artistsPageLoader } from "#pages/profiles"; +import { + ArtistsUpdatedPage, + loader as artistsUpdatedPageLoader, +} from "#pages/profiles/updated"; +import { loader as artistRandomPageLoader } from "#pages/profiles/random"; +import { ProfilePage, loader as profilePageLoader } from "#pages/profile"; +import { + ProfileTagsPage, + loader as profileTagsPageLoader, +} from "#pages/profile/tags"; +import { + FancardsPage, + loader as fancardsLoader, +} from "#pages/profile/fancards"; +import { + ProfileSharesPage, + loader as profileSharesPageLoader, +} from "#pages/shares"; +import { + ProfileDMsPage, + loader as profileDMsPageLoader, +} from "#pages/profile/dms"; +import { + AnnouncementsPage, + loader as announcementsPageLoader, +} from "#pages/profile/announcements"; +import { + ProfileLinksPage, + loader as profileLinksPageLoader, +} from "#pages/profile/linked_accounts"; +import { + NewProfileLinkPage, + loader as newProfileLinkPageLoader, + action as newProfileLinkPageAction, +} from "#pages/profile/new-linked-profile"; +import { DMsPage, loader as dmsPageLoader } from "#pages/all_dms"; +import { loader as accountFavoritesPageLoader } from "#pages/favorites"; +import { SharePage, loader as sharePageLoader } from "#pages/share"; +import { SharesPage, loader as sharesPageLoader } from "#pages/shares-all"; +import { PostPage, loader as postPageLoader } from "#pages/post"; +import { loader as postPageDataLoader } from "#pages/post/data"; +import { PostsPage, loader as postsPageLoader } from "#pages/posts"; +import { + PopularPostsPage, + loader as popularPostsPageLoader, +} from "#pages/posts/popular"; +import { TagsPage, loader as tagsPageLoader } from "#pages/tags-all"; +import { + DiscordServerPage, + loader as discordServerPageLoader, +} from "#pages/discord"; +import { + DiscordChannelPage, + loader as discordChannelPageLoader, +} from "#pages/discord-channel"; +import { + ArchiveFilePage, + loader as archiveFilePageLoader, +} from "#pages/file/archive"; +import { loader as postRandomPageLoader } from "#pages/posts/random"; +import { + DMsReviewPage, + loader as dmsReviewPageLoader, + action as dmsReviewPageAction, +} from "#pages/review_dms/review_dms"; +import { + PostRevisionPage, + loader as postRevisionPageLoader, +} from "#pages/post-revision"; +import { + ImporterStatusPage, + loader as importerStatusPageLoader, +} from "#pages/importer/importer_status"; +import { AccountPage, loader as accountPageLoader } from "#pages/account/home"; +import { + AccountNotificationsPage, + loader as accountNotificationsPageLoader, +} from "#pages/account/notifications"; +import { + AccountAutoImportKeysPage, + loader as accountAutoImportKeysPageLoader, + action as accountAutoImportKeysPageAction, +} from "#pages/account/keys"; +import { + AccountChangePasswordPage, + loader as accountChangePasswordPageLoader, + action as accountChangePasswordPageAction, +} from "#pages/account/change_password"; +import { + AdministratorAccountsPage, + loader as administratorAccountsPageLoader, + baseLoader as administratorAccountsPageBaseLoader, +} from "#pages/account/administrator/accounts"; +import { + ModeratorDashboardPage, + loader as moderatorDashboardPageLoader, +} from "#pages/account/moderator/dashboard"; +import { + ProfileLinkRequestsPage, + loader as profileLinkRequestsPageLoader, +} from "#pages/account/moderator/profile_links"; +import { + RegisterPage, + action as registerPageAction, +} from "#pages/account/register"; +import { loader as accountLogoutPageLoader } from "#pages/authentication/logout"; +import { loader as favoritesLegacyPageLoader } from "#pages/account/favorites/legacy"; +import { + FavoriteProfilesPage, + loader as favoritesProfilesPageLoader, +} from "#pages/account/favorites/profiles"; +import { + FavoritePostsPage, + loader as favoritesPostsPageLoader, +} from "#pages/account/favorites/posts"; +import { Compliance2257Page } from "#pages/2257"; +import { ContactPage } from "#pages/contact"; +import { DMCAPage } from "#pages/dmca"; +import { FanboxImportsPage } from "#pages/fanboximports"; +import { GumroadAndCoPage } from "#pages/gumroad-and-co"; +import { MatrixPage } from "#pages/matrix"; +import { + AdministratorAccountOverviewPage, + loader as administratorAccountOverviewPageLoader, + action as administratorAccountOverviewPageAction, +} from "#pages/account/administrator/account"; +import { + LegacyFilePage, + loader as legacyFilePageLoader, +} from "#pages/file/legacy"; +import { Error404 } from "#pages/errors/404"; + +export const routes = [ + { + path: "/", + element: , + errorElement: , + children: [ + { + errorElement: , + children: [ + { index: true, element: }, + { + path: "/2257", + element: , + }, + { + path: "/contact", + element: , + }, + { + path: "/dmca", + element: , + }, + { + path: "/fanboximports", + element: , + }, + { + path: "/gumroad-and-co", + element: , + }, + { + path: "/matrix", + element: , + }, + { + path: "/importer", + element: , + }, + { + path: "/importer/ok", + element: , + }, + { + path: "/importer/tutorial", + element: , + }, + { + path: "/importer/tutorial_fanbox", + element: , + }, + { + path: "/importer/status/:import_id", + element: , + loader: importerStatusPageLoader, + }, + { + path: "/search_hash", + element: , + }, + { + path: "/artists", + element: , + loader: artistsPageLoader, + }, + { + path: "/artists/updated", + element: , + loader: artistsUpdatedPageLoader, + }, + { + path: "/artists/random", + loader: artistRandomPageLoader, + }, + { + path: "/posts", + element: , + loader: postsPageLoader, + }, + { + path: "/posts/popular", + element: , + loader: popularPostsPageLoader, + }, + { + path: "/posts/tags", + element: , + loader: tagsPageLoader, + }, + { + path: "/posts/archives/:file_hash", + element: , + loader: legacyFilePageLoader, + }, + { + path: "/file/:file_hash", + element: , + loader: archiveFilePageLoader, + }, + { + path: "/posts/random", + loader: postRandomPageLoader, + }, + { + path: "/favorites", + loader: favoritesLegacyPageLoader, + }, + { + path: "/discord/server/:server_id", + element: , + loader: discordServerPageLoader, + }, + { + path: "/discord/server/:server_id/:channel_id", + element: , + loader: discordChannelPageLoader, + }, + { + path: "/:service/user/:creator_id", + element: , + loader: profilePageLoader, + }, + { + path: "/:service/user/:creator_id/tags", + element: , + loader: profileTagsPageLoader, + }, + { + path: "/:service/user/:creator_id/fancards", + element: , + loader: fancardsLoader, + }, + { + path: "/:service/user/:creator_id/shares", + element: , + loader: profileSharesPageLoader, + }, + { + path: "/:service/user/:creator_id/dms", + element: , + loader: profileDMsPageLoader, + }, + { + path: "/:service/user/:creator_id/announcements", + element: , + loader: announcementsPageLoader, + }, + { + path: "/:service/user/:creator_id/links", + element: , + loader: profileLinksPageLoader, + }, + { + path: "/:service/user/:creator_id/post/:post_id", + element: , + loader: postPageLoader, + }, + { + path: "/:service/user/:creator_id/post/:post_id/revision/:revision_id", + element: , + loader: postRevisionPageLoader, + }, + { + path: "/:service/post/:post_id", + loader: postPageDataLoader, + }, + { + path: "/dms", + element: , + loader: dmsPageLoader, + }, + { + path: "/shares", + element: , + loader: sharesPageLoader, + }, + { + path: "/share/:share_id", + element: , + loader: sharePageLoader, + }, + { + path: "/documentation/api", + lazy: () => import("#pages/documentation/api"), + }, + { + path: "/authentication/register", + element: , + action: registerPageAction, + }, + { + path: "/authentication/login", + element: , + action: accountLoginPageAction, + }, + { + path: "/authentication/logout", + loader: accountLogoutPageLoader, + }, + { + path: "/account", + element: , + loader: accountPageLoader, + }, + { + path: "/account/favorites", + loader: accountFavoritesPageLoader, + }, + { + path: "/account/favorites/artists", + element: , + loader: favoritesProfilesPageLoader, + }, + { + path: "/account/favorites/posts", + element: , + loader: favoritesPostsPageLoader, + }, + { + path: "/account/notifications", + element: , + loader: accountNotificationsPageLoader, + }, + { + path: "/account/keys", + element: , + loader: accountAutoImportKeysPageLoader, + action: accountAutoImportKeysPageAction, + }, + { + path: "/account/change_password", + element: , + loader: accountChangePasswordPageLoader, + action: accountChangePasswordPageAction, + }, + { + path: "/account/:service/user/:creator_id/links/new", + element: , + loader: newProfileLinkPageLoader, + action: newProfileLinkPageAction, + }, + { + path: "/account/posts/upload", + lazy: () => import("#pages/upload"), + }, + { + path: "/account/review_dms", + element: , + loader: dmsReviewPageLoader, + action: dmsReviewPageAction, + }, + { + path: "/account/moderator", + element: , + loader: moderatorDashboardPageLoader, + }, + { + path: "/account/moderator/tasks/creator_links", + element: , + loader: profileLinkRequestsPageLoader, + }, + { + path: "/account/administrator", + element: , + loader: administratorDashboardPageLoader, + }, + { + path: "/account/administrator/accounts", + loader: administratorAccountsPageBaseLoader, + }, + { + path: "/account/administrator/accounts/:page", + element: , + loader: administratorAccountsPageLoader, + }, + { + path: "/account/administrator/account/:account_id", + element: , + loader: administratorAccountOverviewPageLoader, + action: administratorAccountOverviewPageAction, + }, + { + path: "/*", + element: , + } + ], + }, + ], + }, +]; diff --git a/client/src/templates/page.html b/client/src/templates/page.html deleted file mode 100644 index 66555e3..0000000 --- a/client/src/templates/page.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends 'components/shell.html' %} - -{% import 'components/site.html' as site %} - -{% set page_title = 'Heading | ' ~ g.site_name %} - -{% block title %} - - {{ page_title }} - -{% endblock title %} - -{% block content %} -{% call site.section('modifier', 'Heading') %} - -{% endcall %} -{% endblock content %} diff --git a/client/src/types/global.d.ts b/client/src/types/global.d.ts deleted file mode 100644 index b50a491..0000000 --- a/client/src/types/global.d.ts +++ /dev/null @@ -1,93 +0,0 @@ -interface KemonoAPI { - favorites: KemonoAPI.Favorites; - posts: KemonoAPI.Posts; - api: KemonoAPI.API; - dms: KemonoAPI.dms; -} - -namespace KemonoAPI { - interface Post { - id: string; - service: string; - title: string; - user: string; - added: string; - published: string; - attachments: string[]; - content: string; - edited: null; - embed: {}; - file: {}; - shared_file: boolean; - faved_seq?: number; - } - - interface User { - id: string; - name: string; - service: string; - indexed: string; - updated: string; - faved_seq?: number; - } - - interface Favorites { - retrieveFavoriteArtists: () => Promise; - favoriteArtist: (service: string, id: string) => Promise; - unfavoriteArtist: (service: string, id: string) => Promise; - retrieveFavoritePosts: () => Promise; - favoritePost: (service: string, user: string, post_id: string) => Promise; - unfavoritePost: (service: string, user: string, post_id: string) => Promise; - } - - namespace Favorites { - interface User extends KemonoAPI.User {} - - interface Post { - id: string; - service: string; - user: string; - } - } - - interface dms { - retrieveHasPendingDMs: () => Promise; - } - interface Posts { - attemptFlag: (service: string, user: string, post_id: string) => Promise; - } - - interface API { - bans: () => Promise; - bannedArtist: (id: string, service: string) => Promise; - creators: () => Promise; - logs: (importID: string) => Promise; - } - - namespace API { - interface BanItem { - id: string; - service: string; - } - - interface BannedArtist { - name: string; - } - - interface LogItem {} - } -} - -namespace Events { - interface Click { - (event: MouseEvent): void; - } - - interface NavClick { - (event: NavClickEvent): void; - } - - interface NavClickEvent extends MouseEvent { - target: HTMLButtonElement; - } -} diff --git a/client/src/utils/_index.js b/client/src/utils/_index.js deleted file mode 100644 index 903d953..0000000 --- a/client/src/utils/_index.js +++ /dev/null @@ -1,217 +0,0 @@ -export { KemonoError } from "./kemono-error"; - -const defaultDelay = parseInt(document.documentElement.style.getPropertyValue("--duration-global")); - -/** - * @param {string} name - * @param {string} url - * @returns - */ -function getParameterByName(name, url) { - if (!url) url = window.location.href; - name = name.replace(/[[]]/g, "\\$&"); - var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"); - var results = regex.exec(url); - if (!results) return null; - if (!results[2]) return ""; - return decodeURIComponent(results[2].replace(/\+/g, " ")); -} - -/** - * @param {() => void} func - * @param {number} wait - * @param {boolean} immediate - * @returns {void} - */ -function debounce(func, wait, immediate) { - let timeout; - return function () { - var context = this; - var args = arguments; - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (callNow) func.apply(context, args); - - function later() { - timeout = null; - if (!immediate) func.apply(context, args); - } - }; -} - -/** - * @param {number} time - * @returns - */ -export function setTimeoutAsync(time = defaultDelay) { - const timeOut = new Promise((resolve) => { - setTimeout(resolve, time); - }); - return timeOut; -} - -/** - * Iterate over the list of images - * and add `image_link` class - * if they are a descendant of an `a` element - * and don't have that class already. - * @param {HTMLImageElement[] | HTMLCollectionOf} imageElements - */ -export function fixImageLinks(imageElements) { - const images = Array.from(imageElements); - - images.forEach((image) => { - const link = image.closest("a"); - - if ( - link && - // && !image.nextSibling - // && !image.previousSibling - // TODO: fix this later - !link.classList.contains("user-header__profile") && - !link.classList.contains("user-card") && - !link.classList.contains("image-link") && - !link.classList.contains("global-sidebar-entry-item") - ) { - link.classList.add("image-link"); - } - }); -} - -/** - * @type {{[paysite:string]: {title: string, color: string, user: { profile: (userID: string) => string }, post: {}}}} - */ -export const paysites = { - patreon: { - title: "Patreon", - color: "#fa5742", - user: { - profile: (userID) => `https://www.patreon.com/user?u=${userID}`, - }, - post: {}, - }, - fanbox: { - title: "Pixiv Fanbox", - color: "#2c333c", - user: { - profile: (userID) => `https://www.pixiv.net/fanbox/creator/${userID}`, - }, - post: {}, - }, - subscribestar: { - title: "SubscribeStar", - color: "#009688", - user: { - profile: (userID) => `https://subscribestar.adult/${userID}`, - }, - post: {}, - }, - gumroad: { - title: "Gumroad", - color: "#2b9fa4", - user: { - profile: (userID) => `https://gumroad.com/${userID}`, - }, - post: {}, - }, - discord: { - title: "Discord", - color: "#5165f6", - user: { - profile: (userID) => ``, - }, - post: {}, - }, - dlsite: { - title: "DLsite", - color: "#052a83", - user: { - profile: (userID) => `https://www.dlsite.com/eng/circle/profile/=/maker_id/${userID}`, - }, - post: {}, - }, - fantia: { - title: "Fantia", - color: "#e1097f", - user: { - profile: (userID) => `user_id: f"https://fantia.jp/fanclubs/${userID}`, - }, - post: {}, - }, - boosty: { - title: "Boosty", - color: "#fd6035", - user: { - profile: (userID) => `https://boosty.to/${userID}`, - }, - post: {}, - }, - afdian: { - title: "Afdian", - color: "#9169df", - user: { - profile: (userID) => ``, - }, - post: {}, - }, - fansly: { - title: "Fansly", - color: "#2399f7", - user: { - profile: (userID) => `https://fansly.com/${userID}`, - }, - post: {}, - }, - onlyfans: { - title: "OnlyFans", - color: "#008ccf", - user: { - profile: (userID) => `https://onlyfans.com/${userID}`, - }, - post: {}, - }, - candfans: { - title: "CandFans", - color: "#e8486c", - user: { - profile: (userID) => `https://candfans.jp/${userID}`, - }, - post: {}, - }, -}; - -export const freesites = { - kemono: { - title: "Kemono", - user: { - /** - * @param {string} service - * @param {string} artistID - */ - profile: (service, artistID) => `/${service}/${service === "discord" ? "server" : "user"}/${artistID}`, - /** - * @param {string} service - * @param {string} artistID - */ - icon: (service, artistID) => `/icons/${service}/${artistID}`, - banner: (service, artistID) => `/banners/${service}/${artistID}`, - }, - post: { - /** - * @param {string} service - * @param {string} userID - * @param {string} postID - * @returns - */ - link: (service, userID, postID) => `/${service}/user/${userID}/post/${postID}`, - }, - }, -}; - -/** - * @param {number} time - */ -export function waitAsync(time) { - return new Promise((resolve) => setTimeout(resolve, time)); -} diff --git a/client/src/utils/kemono-error.js b/client/src/utils/kemono-error.js deleted file mode 100644 index a54c25b..0000000 --- a/client/src/utils/kemono-error.js +++ /dev/null @@ -1,23 +0,0 @@ -const errorList = { - 0: "Could not connect to server.", - 1: "Could not favorite post.", - 2: "Could not unfavorite post.", - 3: "Could not favorite artist.", - 4: "Could not unfavorite artist.", - 5: "There might already be a flag here.", - 6: "Could not retrieve the list of bans.", - 7: "Could not retrieve banned artist.", - 8: "Could not retrieve artists.", - 9: "Could not retrieve import logs.", -}; - -export class KemonoError extends Error { - /** - * @param {number} code - */ - constructor(code) { - super(); - this.code = String(code).padStart(3, "0"); - this.message = `${this.code}: ${errorList[code]}`; - } -} diff --git a/client/static/boosty.svg b/client/static/boosty.svg new file mode 100644 index 0000000..68f7172 --- /dev/null +++ b/client/static/boosty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/static/favicon-coomer.ico b/client/static/favicon-coomer.ico new file mode 100644 index 0000000000000000000000000000000000000000..8e4d5c86013a685f3828a6651cea32ea0f44f892 GIT binary patch literal 15086 zcmdU$U5H&*701`jOdXjh-3ye?Sp7Qv8hE83*&%T1dCcHAW>2KpadLSd?`t> zG@#%hmWm=Kh@kc22R;ZQ=ydWX)fW*f()NO)FA)Y6nKYR>{(pP+|7Oq0Idks~H_5nR zW$m-i`uMMpz0bL4+K5g}#E~N*J{LcHOT@b(Vs0*9&qlnYwOMiQKQbBdlmzaPj8x*J zi1jqyyv=UHzqiZBLXCg}9Te^LvE1pzznVzEyCUM-tK-P4Cgbm&h^mnkmw;27y*S8g z_paAO1vTMk9U0MHtig#l9f-}Jd@-s&el05aw>}fqmp{7ApL-%I2pQo&A=*ph;N-se z16Zr>?u3khuZi~3US2tRII4eqdw1-_hD@%(@*XL`0(+Kz8I*h9r?05j9;iXuvnP*7 z^`Gw#kDnS)FX3Og#Wh%_7uc`P?XaABQ8(e|xpphYkzx02Q%uzB!FSx!8VtQ>oA9&7 zd75i*v!7`r@7bmpr~!LN&2uxKX`I_@_-(>8>e?-Mrd{`*ZHw&-ALu{R{9Zwh#<8z? z#+1F8-p@F{+pt{EI_FpInZ~(FPmMZ=-#LKuoQJ&L<;)o6tRFTW-YfDmE$uD&?20`6 zd&1XkoP49_catvfk-Fx6E4`o5uft**Mb6JOzkg>Ou%2NYkAWziYzaxZ++=Goh zO)r$O&|AdHp5b1q7kJUf7QH#j`&o&pK4GOx?v@1)LWaz{T1Q&+UcJU{Qs zvx!(%((hHpY>qCN$AKHnV8SMOp+CqC1kU<-;P^_}ybsB9iCvdzP@5CP=A4uFrrgwX zHOw_RX!pecU(Y*bTP)<*Setm;J1iKe8TZ{g z`D~$|5@vE<+C-jwj4StkHkCe_=52ih7BD59t7jwl$-DEP&V6E}e~=#+e*8D#ZCb1M z5g1&%yl=^Q*+05WgE-Q;L#?ngj{c#C`?=$67(m|7_;>GvKlP7vbMKIA@G^+yg!>-* z*g&51qOG5YT?YsD2H_rfKle>K8#NbZ`iB@G=4&F({}rD>;J@A)PpZMsbWqQbX!B0N1hrg!YA13GECO+4+ z$&R0M#6iuG&-lrEI`75ZE1K>Y^j4B9d&l{wA6PGYiF<=`PTb_S)N8^{4zQ0O(}x6 znwpSfQ)*n)D!GJQ>Y^toEJ&0iQ3MBW$JN>ucU8;J^m)fZOYEDYl&@#E_mn zU-KyAf1C0IeJIo6?e=B9JUYA1b zmQRVn-$Bd$&vRrPIlox}f*1U*FLC|94f-VEuF}w9U0s=~bm~;qM&|1i+t=p3&i3`H zxnz+)6Q_6Zh+|xDUFCwYDSnx3z8rChOdg8RZ5fDo9zGGV3ZIHt zhtFiLL;4KY;yt+6CAZ48@7rE+|8LxveZflH{t~ymc=8AD^d?rN-cMAvQycJO zy@@O0tEZp;#+Lj(SG{@%{2v`B2KD=SVr$C#4h+h{ z&mK$fQ|HI%fAQq;c!k(@_^Q?4_mD$g{ujr9A@$tvzcNJZ#-kk2qx7o$bLv5(^yHG{ z6Lxy;$%luF+wq&ztFp6%4M=lF+bKMoWfIS4$s#?+zOv1sxpF|x(4V?3{+Vqr(nl>A zQl9aP%brxmRn`s+gtDM{SQR?CP6HBW7p#1ATv0=Z>ce!qi_`zT9 z0Wi#GEJwNLx{+6?tro;YeoG(B(YLSqJ#wF)&peyxefNJ*5BwuT{La@73^``!v9ym* za)F-p=}XqQM_#cnIuFTrIl#f0yTm>sX6&F>?jzQkV#YT4NLZ;`CU79neb-7ph<#pk z%^(MU#=5V-z#4tYyo?#!-0S;ge`MdRxi?Y_TE~W*5@*v$?-$@i*EuF1P~9(ksoY!m zMGxHE0~Z|3WlkG%Z!Amrv~T*rc8C)__XzfklUkueZCIzTh4oQ5@nQp8;6W$%U%&6{ z9Q)J|9oG{)#XhlU+9%}J_>e;!#dd!&sePXG@vS_YGg2ED;ZJ;UnkN zai!-z*mjB8me3)0v-r<(EMNh8&0UQP&ywb$Zt2Ud6WaFm6A)+3V-5+B&UIG>7zgW@ek#^_hlGGd&TXWS}!T z*F;L%y*+&`S=T3pRee1Xb9teOZOoj#u>ST7E1SRh z>p6X~(ASDfqKf~Y3@~$|PWo39{l8`-j01Pv9?$N7b^K0!^u(yz54<%#|J28#f*yY; zE*`ui-Z`vqWVNSW_TLUKemAO5yf>a162m02=vW{AtHe?T-{vvUC3olboG%tzt^vUPo~e|t7AlT+lRe>mH~-YN3DbbnmzJri4{ z?xvmt#KJmuzxnCdeEn?vCD-IIe$ge*^_a2qr!#s9v2@k`{uhkf*zBa06Din~tF=6XyM3z#5sM68c2T=j`<;s7JD zkf)r(R5N-Fy-z+6)raqk3K{(I_Z#%U0>?i0YrQZ{UAgz!h1k&Fe}0PX`|pl5@FRQb z{qZ8XqOXuamO1sKSLttLz@a62V_N6X)8rLmt~KgBi45}e339}a&)WXL#$kLy%#jr_ zCRqa?I{7}fn+Ex5-1X!h+By~iT{)z0xRAb$u21RvXh+{_OX8cZ=*jtr@7$+PusXD= GD&l{r?<2|p literal 0 HcmV?d00001 diff --git a/client/static/small_icons/boosty.png b/client/static/small_icons/boosty.png new file mode 100644 index 0000000000000000000000000000000000000000..6573b946eab35937c413a9c56d94018153bf7fc3 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^fVSC4{<&utH9#GpmyWqXYacoGCQ`W-!}aTw2Z;i)z4*}Q$iB} D1SmCD literal 0 HcmV?d00001 diff --git a/client/static/small_icons/canfans.png b/client/static/small_icons/candfans.png similarity index 100% rename from client/static/small_icons/canfans.png rename to client/static/small_icons/candfans.png diff --git a/client/static/sort.svg b/client/static/sort.svg new file mode 100644 index 0000000..e72ea3d --- /dev/null +++ b/client/static/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..815731a --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "rootDir": ".", + "outDir": "./dist", + "sourceMap": true, + "lib": ["dom", "esnext"], + "types": ["vite/client", "@modyfi/vite-plugin-yaml/modules"], + "allowJs": true, + "checkJs": true, + "skipLibCheck": true, + "strict": true, + "esModuleInterop": true, + "target": "ES2017", + "module": "esnext", + "moduleResolution": "bundler", + "noEmit": true, + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules", "dist", "dev", "static"] +} diff --git a/client/vite.config.mjs b/client/vite.config.mjs new file mode 100644 index 0000000..f9b4625 --- /dev/null +++ b/client/vite.config.mjs @@ -0,0 +1,179 @@ +// @ts-check +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import legacy from "@vitejs/plugin-legacy"; +import ViteYaml from "@modyfi/vite-plugin-yaml"; +import { viteStaticCopy } from "vite-plugin-static-copy"; +import { createHtmlPlugin } from "vite-plugin-html"; +import { patchCssModules } from 'vite-css-modules' +import { + siteName, + favicon, + analyticsEnabled, + analyticsCode, + kemonoSite, + sentryDSN, + iconsPrepend, + bannersPrepend, + thumbnailsPrepend, + artistsOrCreators, + disableDMs, + disableFAQ, + disableFilehaus, + sidebarItems, + footerItems, + bannerGlobal, + bannerWelcome, + homeBackgroundImage, + homeMascotPath, + homeLogoPath, + homeWelcomeCredits, + homeAnnouncements, + paysiteList, + headerAd, + middleAd, + footerAd, + sliderAd, + videoAd, + isArchiveServerEnabled, + apiServerBaseURL, + apiServerPort, + gitCommitHash, + isFileServingEnabled, + buildDate, + AnnouncementBannerGlobal, +} from "./configs/vars.mjs"; + +export const baseConfig = defineConfig(async ({ command, mode }) => { + /** + * @type {import("vite").UserConfig} + */ + const config = { + plugins: [ + legacy({ + targets: ["defaults", "not IE 11"], + }), + patchCssModules({ exportMode: "named" }), + ViteYaml(), + // TODO: remove it after settling the static files situation + // by using the vite option of copying public folder instead + viteStaticCopy({ + structured: true, + targets: [ + { + src: "static", + dest: "./", + }, + ], + }), + createHtmlPlugin({ + entry: "./src/index.tsx", + inject: { + data: { + title: siteName, + analytics: !analyticsEnabled + ? undefined + : !analyticsCode + ? undefined + : atob(analyticsCode), + }, + tags: [ + { + tag: "link", + attrs: { + rel: "icon", + href: favicon, + }, + injectTo: "head", + }, + { + tag: "meta", + attrs: { + name: "og:type", + content: "website", + }, + injectTo: "head", + }, + { + tag: "meta", + attrs: { + name: "og:site_name", + content: siteName, + }, + injectTo: "head", + }, + { + tag: "meta", + attrs: { + name: "og:title", + content: siteName, + }, + injectTo: "head", + }, + { + tag: "meta", + attrs: { + name: "og:image", + content: `${kemonoSite}/static/kemono-logo.svg`, + }, + injectTo: "head", + }, + { + tag: "meta", + attrs: { + name: "og:image:width", + content: "150", + }, + injectTo: "head", + }, + { + tag: "meta", + attrs: { + name: "og:image:height", + content: "150", + }, + injectTo: "head", + }, + ], + }, + }), + react(), + ], + define: { + BUNDLER_ENV_KEMONO_SITE: JSON.stringify(kemonoSite), + BUNDLER_ENV_SENTRY_DSN: JSON.stringify(sentryDSN), + BUNDLER_ENV_SITE_NAME: JSON.stringify(siteName), + BUNDLER_ENV_ICONS_PREPEND: JSON.stringify(iconsPrepend), + BUNDLER_ENV_BANNERS_PREPEND: JSON.stringify(bannersPrepend), + BUNDLER_ENV_THUMBNAILS_PREPEND: JSON.stringify(thumbnailsPrepend), + BUNDLER_ENV_ARTISTS_OR_CREATORS: JSON.stringify(artistsOrCreators), + BUNDLER_ENV_DISABLE_DMS: JSON.stringify(disableDMs), + BUNDLER_ENV_DISABLE_FAQ: JSON.stringify(disableFAQ), + BUNDLER_ENV_DISABLE_FILEHAUS: JSON.stringify(disableFilehaus), + BUNDLER_ENV_SIDEBAR_ITEMS: JSON.stringify(sidebarItems), + BUNDLER_ENV_FOOTER_ITEMS: JSON.stringify(footerItems), + BUNDLER_ENV_BANNER_GLOBAL: JSON.stringify(bannerGlobal), + BUNDLER_ENV_ANNOUNCEMENT_BANNER_GLOBAL: JSON.stringify(AnnouncementBannerGlobal), + BUNDLER_ENV_BANNER_WELCOME: JSON.stringify(bannerWelcome), + BUNDLER_ENV_HOME_BACKGROUND_IMAGE: JSON.stringify(homeBackgroundImage), + BUNDLER_ENV_HOME_MASCOT_PATH: JSON.stringify(homeMascotPath), + BUNDLER_ENV_HOME_LOGO_PATH: JSON.stringify(homeLogoPath), + BUNDLER_ENV_HOME_WELCOME_CREDITS: JSON.stringify(homeWelcomeCredits), + BUNDLER_ENV_HOME_ANNOUNCEMENTS: JSON.stringify(homeAnnouncements), + BUNDLER_ENV_PAYSITE_LIST: JSON.stringify(paysiteList), + BUNDLER_ENV_HEADER_AD: JSON.stringify(headerAd), + BUNDLER_ENV_MIDDLE_AD: JSON.stringify(middleAd), + BUNDLER_ENV_FOOTER_AD: JSON.stringify(footerAd), + BUNDLER_ENV_SLIDER_AD: JSON.stringify(sliderAd), + BUNDLER_ENV_VIDEO_AD: JSON.stringify(videoAd), + BUNDLER_ENV_IS_ARCHIVER_ENABLED: JSON.stringify(isArchiveServerEnabled), + BUNDLER_ENV_API_SERVER_BASE_URL: JSON.stringify(apiServerBaseURL), + BUNDLER_ENV_API_SERVER_PORT: JSON.stringify(apiServerPort), + BUNDLER_ENV_GIT_COMMIT_HASH: JSON.stringify(gitCommitHash), + BUNDLER_ENV_BUILD_DATE: JSON.stringify(buildDate), + BUNDLER_ENV_IS_FILE_SERVING_ENABLED: JSON.stringify(isFileServingEnabled), + }, + }; + + return config; +}); diff --git a/client/vite.dev.mjs b/client/vite.dev.mjs new file mode 100644 index 0000000..6e75486 --- /dev/null +++ b/client/vite.dev.mjs @@ -0,0 +1,65 @@ +// @ts-check +import { defineConfig, mergeConfig } from "vite"; +import { baseConfig } from "./vite.config.mjs"; +import { + apiServerBaseURL, + apiServerPort, +} from "./configs/vars.mjs"; + +const config = defineConfig(async (configEnv) => { + /** + * @type {import("vite").UserConfig} + */ + const targetBackend = `${apiServerBaseURL}${apiServerPort ? `:${apiServerPort}` : ''}`; + const proxyConfig = {}; + if (targetBackend.includes("kemono.su")) { + proxyConfig["/api/v1/creators"] = { + target: "https://kemono.su", // target the base URL for the proxy + changeOrigin: true, + secure: true, + rewrite: (path) => path.replace(/^\/api\/v1\/creators/, '/api/v1/creators.txt'), + }; + } + proxyConfig["/api"] = { + target: targetBackend, + changeOrigin: true, + secure: true, + }; + proxyConfig["/icons"] = { + target: targetBackend, + changeOrigin: true, + secure: true, + }; + proxyConfig["/banners"] = { + target: targetBackend, + changeOrigin: true, + secure: true, + }; + proxyConfig["/thumbnail"] = { + target: targetBackend, + changeOrigin: true, + secure: true, + }; + proxyConfig["/data"] = { + target: targetBackend, + changeOrigin: true, + secure: true, + }; + + const devConfig = { + server: { + host: "0.0.0.0", + port: 3450, + strictPort: true, + proxy: proxyConfig, + allowedHosts: ["all"], + }, + }; + + const resolvedBase = await baseConfig(configEnv); + const finalConfig = mergeConfig(resolvedBase, devConfig); + + return finalConfig; +}); + +export default config; diff --git a/client/vite.prod.mjs b/client/vite.prod.mjs new file mode 100644 index 0000000..d06f201 --- /dev/null +++ b/client/vite.prod.mjs @@ -0,0 +1,32 @@ +// @ts-check +import { defineConfig, mergeConfig } from "vite"; +import { baseConfig } from "./vite.config.mjs"; +import { apiServerBaseURL, apiServerPort } from "./configs/vars.mjs"; + +const config = defineConfig(async (configEnv) => { + /** + * @type {import("vite").UserConfig} + */ + const prodConfig = { + preview: { + host: "0.0.0.0", + port: 5000, + strictPort: true, + proxy: { + "/api": `${apiServerBaseURL}:${apiServerPort}`, + }, + }, + build: { + cssCodeSplit: false, + sourcemap: true, + outDir: "dist", + emptyOutDir: true, + }, + }; + const resolvedBase = await baseConfig(configEnv); + const finalConfig = mergeConfig(resolvedBase, prodConfig); + + return finalConfig; +}); + +export default config; diff --git a/client/webpack.config.js b/client/webpack.config.js index e5c0ee1..4c36536 100644 --- a/client/webpack.config.js +++ b/client/webpack.config.js @@ -1,46 +1,107 @@ -const path = require("path"); +// @ts-check const { DefinePlugin } = require("webpack"); const CopyWebpackPlugin = require("copy-webpack-plugin"); -const { buildHTMLWebpackPluginsRecursive } = require("./configs/build-templates"); +const HTMLWebpackPlugin = require("html-webpack-plugin"); const { kemonoSite, - nodeEnv, + sentryDSN, + siteName, iconsPrepend, bannersPrepend, thumbnailsPrepend, - creatorsLocation, -} = require("./configs/vars"); - -const projectPath = path.resolve(__dirname, "src"); -const pagesPath = path.join(projectPath, "pages"); -const pagePlugins = buildHTMLWebpackPluginsRecursive(pagesPath, { - fileExtension: "html", - pluginOptions: { - inject: false, - minify: false, - }, -}); + artistsOrCreators, + disableDMs, + disableFAQ, + disableFilehaus, + sidebarItems, + footerItems, + bannerGlobal, + bannerWelcome, + homeBackgroundImage, + homeMascotPath, + homeLogoPath, + paysiteList, + homeWelcomeCredits, + homeAnnouncements, + headerAd, + middleAd, + footerAd, + sliderAd, + videoAd, + isArchiveServerEnabled, + apiServerBaseURL, + apiServerPort, + analyticsEnabled, + analyticsCode, + gitCommitHash, + isFileServingEnabled, + buildDate, +} = require("./configs/vars.mjs"); /** - * TODO: make separate entries for `admin` and `moderator` * @type import("webpack").Configuration */ const webpackConfig = { entry: { - global: path.join(projectPath, "js", "global.js"), - admin: path.join(projectPath, "js", "admin.js"), - // moderator: path.join(projectPath, "js", "moderator.js"), + index: "./src/index.tsx", }, plugins: [ - ...pagePlugins, + // ...pagePlugins, + new HTMLWebpackPlugin({ + title: siteName, + filename: "index.html", + favicon: "./static/favicon.ico", + meta: { + "og:type": "website", + "og:site_name": siteName, + "og:title": siteName, + "og:image": `${kemonoSite}/static/kemono-logo.svg`, + "og:image:width": "150", + "og:image:height": "150", + }, + templateParameters: { + analytics: !analyticsEnabled + ? undefined + : !analyticsCode + ? undefined + : atob(analyticsCode), + }, + template: "./src/index.html", + }), + // https://webpack.js.org/plugins/define-plugin/ new DefinePlugin({ BUNDLER_ENV_KEMONO_SITE: JSON.stringify(kemonoSite), - BUNDLER_ENV_NODE_ENV: JSON.stringify(nodeEnv), + BUNDLER_ENV_SENTRY_DSN: JSON.stringify(sentryDSN), + BUNDLER_ENV_SITE_NAME: JSON.stringify(siteName), BUNDLER_ENV_ICONS_PREPEND: JSON.stringify(iconsPrepend), BUNDLER_ENV_BANNERS_PREPEND: JSON.stringify(bannersPrepend), BUNDLER_ENV_THUMBNAILS_PREPEND: JSON.stringify(thumbnailsPrepend), - BUNDLER_ENV_CREATORS_LOCATION: JSON.stringify(creatorsLocation), + BUNDLER_ENV_ARTISTS_OR_CREATORS: JSON.stringify(artistsOrCreators), + BUNDLER_ENV_DISABLE_DMS: JSON.stringify(disableDMs), + BUNDLER_ENV_DISABLE_FAQ: JSON.stringify(disableFAQ), + BUNDLER_ENV_DISABLE_FILEHAUS: JSON.stringify(disableFilehaus), + BUNDLER_ENV_SIDEBAR_ITEMS: JSON.stringify(sidebarItems), + BUNDLER_ENV_FOOTER_ITEMS: JSON.stringify(footerItems), + BUNDLER_ENV_BANNER_GLOBAL: JSON.stringify(bannerGlobal), + BUNDLER_ENV_BANNER_WELCOME: JSON.stringify(bannerWelcome), + BUNDLER_ENV_HOME_BACKGROUND_IMAGE: JSON.stringify(homeBackgroundImage), + BUNDLER_ENV_HOME_MASCOT_PATH: JSON.stringify(homeMascotPath), + BUNDLER_ENV_HOME_LOGO_PATH: JSON.stringify(homeLogoPath), + BUNDLER_ENV_HOME_WELCOME_CREDITS: JSON.stringify(homeWelcomeCredits), + BUNDLER_ENV_HOME_ANNOUNCEMENTS: JSON.stringify(homeAnnouncements), + BUNDLER_ENV_PAYSITE_LIST: JSON.stringify(paysiteList), + BUNDLER_ENV_HEADER_AD: JSON.stringify(headerAd), + BUNDLER_ENV_MIDDLE_AD: JSON.stringify(middleAd), + BUNDLER_ENV_FOOTER_AD: JSON.stringify(footerAd), + BUNDLER_ENV_SLIDER_AD: JSON.stringify(sliderAd), + BUNDLER_ENV_VIDEO_AD: JSON.stringify(videoAd), + BUNDLER_ENV_IS_ARCHIVER_ENABLED: JSON.stringify(isArchiveServerEnabled), + BUNDLER_ENV_API_SERVER_BASE_URL: JSON.stringify(apiServerBaseURL), + BUNDLER_ENV_API_SERVER_PORT: JSON.stringify(apiServerPort), + BUNDLER_ENV_GIT_COMMIT_HASH: JSON.stringify(gitCommitHash), + BUNDLER_ENV_BUILD_DATE: JSON.stringify(buildDate), + BUNDLER_ENV_IS_FILE_SERVING_ENABLED: JSON.stringify(isFileServingEnabled), }), new CopyWebpackPlugin({ patterns: [ @@ -52,18 +113,7 @@ const webpackConfig = { }), ], resolve: { - extensions: [".js"], - alias: { - ["@wp/pages"]: path.join(projectPath, "pages", "_index.js"), - ["@wp/components"]: path.join(projectPath, "pages", "components", "_index.js"), - ["@wp/env"]: path.join(projectPath, "env"), - ["@wp/lib"]: path.join(projectPath, "lib"), - ["@wp/js"]: path.join(projectPath, "js"), - ["@wp/css"]: path.join(projectPath, "css"), - ["@wp/assets"]: path.join(projectPath, "assets"), - ["@wp/api"]: path.join(projectPath, "api", "_index.js"), - ["@wp/utils"]: path.join(projectPath, "utils", "_index.js"), - }, + extensions: [".tsx", ".ts", ".js"], fallback: { stream: false, }, diff --git a/client/webpack.dev.js b/client/webpack.dev.js index ab8884e..9eb2cf7 100644 --- a/client/webpack.dev.js +++ b/client/webpack.dev.js @@ -1,9 +1,14 @@ +// @ts-check const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const path = require("path"); const { merge } = require("webpack-merge"); - +const yaml = require("yaml"); +const { + kemonoSite, + apiServerBaseURL, + apiServerPort, +} = require("./configs/vars.mjs"); const baseConfig = require("./webpack.config"); -const { kemonoSite } = require("./configs/vars"); const projectPath = path.resolve(__dirname, "src"); @@ -13,25 +18,25 @@ const projectPath = path.resolve(__dirname, "src"); const devServer = { host: "0.0.0.0", port: 3450, - devMiddleware: { - writeToDisk: true, - }, - watchFiles: { - options: { - poll: 500, - aggregateTimeout: 500, + proxy: [ + { + context: ["/api","/icons","/data", "/thumbnail"], + target: `localhost:3449`, }, - }, + ], static: { directory: path.resolve(__dirname, "static"), watch: true, }, - hot: false, - liveReload: true, + hot: true, + // liveReload: true, client: { overlay: true, progress: true, }, + historyApiFallback: { + index: "/index.html", + }, }; /** @@ -39,11 +44,8 @@ const devServer = { */ const webpackConfigDev = { mode: "development", - devtool: "eval-source-map", + devtool: "inline-source-map", devServer: devServer, - entry: { - development: path.join(projectPath, "development", "entry.js"), - }, plugins: [ new MiniCssExtractPlugin({ filename: "static/bundle/css/[name].css", @@ -51,12 +53,21 @@ const webpackConfigDev = { }), ], module: { + parser: { + javascript: { + exportsPresence: "error", + }, + }, rules: [ + { + test: /\.tsx?$/, + use: "ts-loader", + exclude: /node_modules/, + }, { test: /\.s[ac]ss$/i, - exclude: /\.module.s[ac]ss$/i, use: [ - MiniCssExtractPlugin.loader, + "style-loader", { loader: "css-loader", options: { @@ -89,6 +100,13 @@ const webpackConfigDev = { test: /\.css$/, use: ["style-loader", "css-loader"], }, + { + test: /\.yaml$/i, + type: "json", + parser: { + parse: yaml.parse, + }, + }, ], }, output: { @@ -96,7 +114,6 @@ const webpackConfigDev = { filename: "static/bundle/js/[name].bundle.js", assetModuleFilename: "static/bundle/assets/[name][ext][query]", publicPath: "/", - clean: true, }, }; diff --git a/client/webpack.prod.js b/client/webpack.prod.js index ff02923..6475d4d 100644 --- a/client/webpack.prod.js +++ b/client/webpack.prod.js @@ -1,7 +1,10 @@ -const path = require("path"); +// @ts-check +const path = require("path"); const MiniCSSExtractPlugin = require("mini-css-extract-plugin"); const { merge } = require("webpack-merge"); +const yaml = require("yaml"); +const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer"); const baseConfig = require("./webpack.config"); const { kemonoSite } = require("./configs/vars"); @@ -10,8 +13,9 @@ const { kemonoSite } = require("./configs/vars"); */ const webpackConfigProd = { mode: "production", - // devtool: "source-map", + devtool: "source-map", plugins: [ + new BundleAnalyzerPlugin({ analyzerMode: "static", openAnalyzer: false }), new MiniCSSExtractPlugin({ filename: "static/bundle/css/[name]-[contenthash].css", chunkFilename: "static/bundle/css/[id]-[contenthash].chunk.css", @@ -20,19 +24,25 @@ const webpackConfigProd = { module: { rules: [ { - test: /\.m?js$/i, - exclude: /node_modules/, - use: { - loader: "babel-loader", - options: { - presets: [["@babel/preset-env", { targets: "defaults" }]], - plugins: ["@babel/plugin-transform-runtime"], + test: /\.tsx?$/, + use: [ + { + loader: "babel-loader", + options: { + presets: [ + ["@babel/preset-env", { targets: "defaults" }], + ["@babel/preset-typescript"], + ["@babel/preset-react"], + ], + plugins: ["@babel/plugin-transform-runtime"], + }, }, - }, + "ts-loader", + ], + exclude: /node_modules/, }, { test: /\.s[ac]ss$/i, - exclude: /\.module\.s[ac]ss$/i, use: [ MiniCSSExtractPlugin.loader, { @@ -85,28 +95,26 @@ const webpackConfigProd = { test: /\.css$/, use: ["style-loader", "css-loader"], }, + { + test: /\.yaml$/i, + type: "json", + parser: { + parse: yaml.parse, + }, + }, ], }, output: { path: path.resolve(__dirname, "dist"), filename: "static/bundle/js/[name]-[contenthash].bundle.js", - assetModuleFilename: "static/bundle/assets/[name]-[contenthash][ext][query]", - // sourceMapFilename: "source-maps/[file].map[query]", + assetModuleFilename: + "static/bundle/assets/[name]-[contenthash][ext][query]", publicPath: "/", clean: true, }, optimization: { moduleIds: "deterministic", runtimeChunk: "single", - splitChunks: { - cacheGroups: { - vendor: { - test: /[\\/]node_modules[\\/]/, - name: "vendors", - chunks: "all", - }, - }, - }, }, }; diff --git a/config.example.json b/config.example.json index f2a558c..0a70c3c 100644 --- a/config.example.json +++ b/config.example.json @@ -1,16 +1,18 @@ { - "site": "http://localhost:5000", + "site": "http://localhost:3450", "development_mode": true, "automatic_migrations": true, "webserver": { "secret": "To SECRET name.", - "port": 80, + "base_url": "http://localhost", + "port": 3449, "ui": { "home": { "site_name": "Kemono" }, "config": { - "paysite_list": ["patreon", "fanbox", "afdian"] + "paysite_list": ["patreon", "fanbox", "afdian"], + "artists_or_creators": "Artists" } } }, diff --git a/config.example.production.json b/config.example.production.json new file mode 100644 index 0000000..9fbbb9a --- /dev/null +++ b/config.example.production.json @@ -0,0 +1,31 @@ +{ + "site": "http://localhost:3450", + "development_mode": true, + "automatic_migrations": true, + "webserver": { + "secret": "To SECRET name.", + "base_url": "https://kemono.su", + "ui": { + "home": { + "site_name": "Kemono" + }, + "config": { + "paysite_list": ["patreon", "fanbox", "afdian"], + "artists_or_creators": "Artists" + } + } + }, + "database": { + "host": "postgres", + "user": "kemono", + "password": "kemono", + "database": "kemono" + }, + "redis": { + "defaults": { + "host": "redis", + "port": 6379, + "db": 0 + } + } +} diff --git a/db/migrations/20241110_00_DASAD-add-favorite-counts-table.py b/db/migrations/20241110_00_DASAD-add-favorite-counts-table.py new file mode 100644 index 0000000..19fe141 --- /dev/null +++ b/db/migrations/20241110_00_DASAD-add-favorite-counts-table.py @@ -0,0 +1,62 @@ +""" +Add a favorite_counts table to aleviate the query time. +""" + +from yoyo import step + +__depends__ = {"20240223_00_ASDAS-reset_relation_id_seq"} + +steps = [ + step( + """ + CREATE TABLE IF NOT EXISTS favorite_counts ( + service varchar NOT NULL, + artist_id varchar NOT NULL, + favorite_count INTEGER DEFAULT 0, + PRIMARY KEY (service, artist_id) + ); + """ + ), + step( + """ + CREATE OR REPLACE FUNCTION update_favorite_count() + RETURNS TRIGGER AS $$ + BEGIN + -- For INSERT event: increment the count + IF TG_OP = 'INSERT' THEN + INSERT INTO favorite_counts (service, artist_id, favorite_count) + VALUES (NEW.service, NEW.artist_id, 1) + ON CONFLICT (service, artist_id) + DO UPDATE SET favorite_count = favorite_counts.favorite_count + 1; + + -- For DELETE event: decrement the count + ELSIF TG_OP = 'DELETE' THEN + UPDATE favorite_counts + SET favorite_count = favorite_count - 1 + WHERE service = OLD.service AND artist_id = OLD.artist_id; + END IF; + + RETURN NULL; -- triggers on INSERT/DELETE return NULL + END; + $$ LANGUAGE plpgsql; + """ + ), + step( + """ + CREATE TRIGGER update_favorite_count_trigger + AFTER INSERT OR DELETE ON account_artist_favorite + FOR EACH ROW + EXECUTE FUNCTION update_favorite_count(); + """ + ), + step( + """ + INSERT INTO favorite_counts (service, artist_id, favorite_count) + SELECT service, artist_id, COUNT(*) AS favorite_count + FROM account_artist_favorite + GROUP BY service, artist_id + ON CONFLICT (service, artist_id) + DO UPDATE SET favorite_count = EXCLUDED.favorite_count; + """ + ), +] diff --git a/db/migrations/20250328_01_KV3ap-add-reason-to-flags.py b/db/migrations/20250328_01_KV3ap-add-reason-to-flags.py new file mode 100644 index 0000000..75ed32d --- /dev/null +++ b/db/migrations/20250328_01_KV3ap-add-reason-to-flags.py @@ -0,0 +1,31 @@ +""" +Create new post_flags table. +""" + +from yoyo import step + +__depends__ = {"20241110_00_DASAD-add-favorite-counts-table"} + +steps = [ + step(""" + CREATE TABLE "public"."post_flags" ( + "post_id" TEXT NOT NULL, + "creator_id" TEXT NOT NULL, + "service" TEXT NOT NULL, + "contributor_id" int4 NOT NULL, + "created_at" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + "reason" int2 NOT NULL, + "reason_text" TEXT, + "flagger_ip_hash" UUID, + CONSTRAINT "post_flags_pk" PRIMARY KEY ("post_id", "creator_id", "service", "contributor_id") + ); + """, 'DROP TABLE "public"."post_flags"'), + step( + """CREATE INDEX "idx_post_flags_on_contributor_id_and_created_at" ON "post_flags" ("contributor_id", "created_at");""", + """DROP INDEX "idx_post_flags_on_contributor_id_and_created_at";""" + ), + step( + """CREATE INDEX "idx_post_flags_on_ip_hash_and_created_at" ON "post_flags" ("flagger_ip_hash", "created_at");""", + """DROP INDEX "idx_post_flags_on_ip_hash_and_created_at";""" + ), +] diff --git a/db/schema/public/accounts.sql b/db/schema/public/accounts.sql new file mode 100644 index 0000000..39bcbf5 --- /dev/null +++ b/db/schema/public/accounts.sql @@ -0,0 +1,52 @@ +-- accounts +CREATE TABLE account( + id serial PRIMARY KEY, + username varchar NOT NULL, + password_hash varchar NOT NULL, + created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + role varchar DEFAULT 'consumer', + UNIQUE (username) +); + +CREATE TABLE account_artist_favorite( + id serial, + created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, + account_id int NOT NULL REFERENCES account(id), + service varchar(20) NOT NULL, + artist_id varchar(255) NOT NULL, + PRIMARY KEY (service, id), + UNIQUE (account_id, service, artist_id) +); + +CREATE INDEX ON account_artist_favorite(service, artist_id); + +CREATE TABLE account_post_favorite( + id serial, + created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, + account_id int NOT NULL REFERENCES account(id), + service varchar(20) NOT NULL, + artist_id varchar(255) NOT NULL, + post_id varchar(255) NOT NULL, + PRIMARY KEY (service, id), + UNIQUE (account_id, service, artist_id, post_id) +); + +CREATE TABLE notifications( + id bigserial PRIMARY KEY, + account_id int NOT NULL, + type SMALLINT NOT NULL, + extra_info jsonb, + created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + is_seen boolean NOT NULL DEFAULT FALSE, + FOREIGN KEY (account_id) REFERENCES account(id) +); + +CREATE INDEX account_idx ON account USING BTREE(username, created_at, ROLE); + +CREATE INDEX ON account_post_favorite(service, artist_id, post_id); + +CREATE INDEX notifications_account_id_idx ON notifications USING BTREE("account_id"); + +CREATE INDEX notifications_created_at_idx ON notifications USING BTREE("created_at"); + +CREATE INDEX notifications_type_idx ON notifications USING BTREE("type"); diff --git a/db/schema/public/artists.sql b/db/schema/public/artists.sql new file mode 100644 index 0000000..3438305 --- /dev/null +++ b/db/schema/public/artists.sql @@ -0,0 +1,107 @@ +-- Lookup (aka artists) +CREATE TABLE lookup( + "id" varchar(255) NOT NULL, + "name" varchar(255) NOT NULL, + "service" varchar(20) NOT NULL, + "indexed" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + public_id text, + relation_id integer, + PRIMARY KEY (id, service) +); + +CREATE TABLE creators( + creator_id text NOT NULL, + service text NOT NULL, + creator_name text NOT NULL, + creator_slug text, + creator_internal_id text, + short_description text NOT NULL, + description text NOT NULL, + icon text, + banner text, + is_nsfw boolean, + deleted_at timestamp without time zone, + stopped_at timestamp without time zone, + paused_at timestamp without time zone, + post_count integer, + media_count integer, + tiers jsonb[], + access_groups jsonb[], + published_at timestamp without time zone, + added_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, + updated_at timestamp without time zone, + public_posts_refreshed_at timestamp without time zone, + public_posts_full_refreshed_at timestamp without time zone, + CONSTRAINT creators_pkey PRIMARY KEY (creator_id, service) +); + +CREATE TABLE creators_revisions( + revision_id serial NOT NULL PRIMARY KEY, + creator_id text NOT NULL, + service text NOT NULL, + creator_name text NOT NULL, + creator_slug text, + creator_internal_id text, + short_description text NOT NULL, + description text NOT NULL, + icon text, + banner text, + is_nsfw boolean, + deleted_at timestamp without time zone, + stopped_at timestamp without time zone, + paused_at timestamp without time zone, + post_count integer, + media_count integer, + tiers jsonb[], + access_groups jsonb[], + published_at timestamp without time zone, + added_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, + updated_at timestamp without time zone, + public_posts_refreshed_at timestamp without time zone, + public_posts_full_refreshed_at timestamp without time zone +); + +CREATE TYPE unapproved_link_status AS ENUM( + 'pending', + 'approved', + 'rejected' +); + +CREATE TABLE unapproved_link_requests( + id int PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + from_service text NOT NULL, + from_id text NOT NULL, + to_service text NOT NULL, + to_id text NOT NULL, + reason text, + requester_id int NOT NULL REFERENCES account(id), + status unapproved_link_status NOT NULL DEFAULT 'pending', + FOREIGN KEY (from_service, from_id) REFERENCES lookup(service, id), + FOREIGN KEY (to_service, to_id) REFERENCES lookup(service, id), + UNIQUE (from_service, from_id, to_service, to_id) +); + +CREATE INDEX name_idx ON lookup USING btree("name"); + +CREATE INDEX lookup_id_idx ON lookup USING btree("id"); + +CREATE INDEX lookup_service_idx ON lookup USING btree("service"); + +CREATE INDEX lookup_indexed_idx ON lookup USING btree("indexed"); + +CREATE SEQUENCE lookup_relation_id_seq; + +CREATE INDEX lookup_relation_id_index ON lookup USING btree(relation_id); + +CREATE INDEX lookup_public_id_idx ON lookup(public_id); + +CREATE INDEX lookup_relation_id_idx ON lookup(relation_id); + +-- the migrations refer to `updated_idx` index +-- but it wasn't declared prior being changed +CREATE INDEX updated_idx ON lookup USING btree("updated"); + +CREATE INDEX creators_revisions_creator_id_service_idx ON creators_revisions USING btree(creator_id, service); + +CREATE INDEX unapproved_link_requests_status_id_idx ON unapproved_link_requests(status, id); diff --git a/db/schema/public/dms.sql b/db/schema/public/dms.sql new file mode 100644 index 0000000..4d9fe21 --- /dev/null +++ b/db/schema/public/dms.sql @@ -0,0 +1,64 @@ +-- DMs +CREATE TABLE dms_temp_old( + "id" varchar(255) NOT NULL, + "user" varchar(255) NOT NULL, + "service" varchar(20) NOT NULL, + "content" text NOT NULL DEFAULT '', + "embed" jsonb NOT NULL DEFAULT '{}', + "added" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "published" timestamp, + "file" jsonb NOT NULL, + PRIMARY KEY (id, service) +); + +CREATE TABLE unapproved_dms_temp_old( + "import_id" varchar(255) NOT NULL, + contributor_id varchar(255), + "id" varchar(255) NOT NULL, + "user" varchar(255) NOT NULL, + "service" varchar(20) NOT NULL, + "content" text NOT NULL DEFAULT '', + "embed" jsonb NOT NULL DEFAULT '{}', + "added" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "published" timestamp, + "file" jsonb NOT NULL, + PRIMARY KEY (id, service) +); + +-- the old tables weren't dropped, apparently + +CREATE TABLE dms( + "hash" varchar NOT NULL, + "user" varchar(255) NOT NULL, + service varchar(20) NOT NULL, + "content" text NOT NULL DEFAULT ''::text, + embed jsonb NOT NULL DEFAULT '{}' ::jsonb, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + published timestamp NULL, + file jsonb NOT NULL, + CONSTRAINT dms_pkey PRIMARY KEY ("hash", "user", service) +); + +CREATE TABLE unapproved_dms( + "hash" varchar NOT NULL, + "user" varchar(255) NOT NULL, + service varchar(20) NOT NULL, + contributor_id varchar(255) NOT NULL, + "content" text NOT NULL DEFAULT ''::text, + embed jsonb NOT NULL DEFAULT '{}' ::jsonb, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + published timestamp NULL, + file jsonb NOT NULL, + import_id varchar(255) NOT NULL, + remote_user_id_hash varchar NULL, + deleted_at timestamp NULL, + CONSTRAINT unapproved_dms_pkey PRIMARY KEY ("hash", "user", service, contributor_id) +); + +CREATE INDEX dm_idx ON dms_temp_old USING btree("user"); + +CREATE INDEX dms_user_idx ON dms_temp_old("user"); + +CREATE INDEX unapproved_dm_idx ON unapproved_dms USING btree("import_id"); + +CREATE INDEX unapproved_dms_contributor_id_user_idx ON unapproved_dms(contributor_id, "user"); diff --git a/db/schema/public/extensions.sql b/db/schema/public/extensions.sql new file mode 100644 index 0000000..6e98b00 --- /dev/null +++ b/db/schema/public/extensions.sql @@ -0,0 +1,5 @@ +CREATE EXTENSION pgroonga; + +CREATE EXTENSION pgcrypto; + +CREATE EXTENSION citext; diff --git a/db/schema/public/files.sql b/db/schema/public/files.sql new file mode 100644 index 0000000..1b31a89 --- /dev/null +++ b/db/schema/public/files.sql @@ -0,0 +1,67 @@ +-- files +CREATE TABLE files( + id serial PRIMARY KEY, + hash varchar NOT NULL, + mtime timestamp NOT NULL, + ctime timestamp NOT NULL, + mime varchar, + ext varchar, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE (hash) +); + +CREATE TABLE file_post_relationships( + file_id int NOT NULL REFERENCES files(id), + filename varchar NOT NULL, + service varchar NOT NULL, + "user" varchar NOT NULL, + post varchar NOT NULL, + contributor_id int REFERENCES account(id), + inline boolean NOT NULL DEFAULT FALSE, + PRIMARY KEY (file_id, service, "user", post) +); + +CREATE TABLE file_discord_message_relationships( + file_id int NOT NULL REFERENCES files(id), + filename varchar NOT NULL, + server varchar NOT NULL, + channel varchar NOT NULL, + id varchar NOT NULL, + contributor_id int REFERENCES account(id), + PRIMARY KEY (file_id, SERVER, channel, id) +); + +CREATE TABLE file_server_relationships( + file_id int NOT NULL REFERENCES files(id), + remote_path varchar NOT NULL +); + +CREATE TABLE archive_files( + file_id int NOT NULL REFERENCES files(id), + -- this for sure won't have problems down the line + files text[] NOT NULL, + password TEXT, + CONSTRAINT archive_files_pk PRIMARY KEY (file_id) +); + +CREATE INDEX file_id_idx ON file_post_relationships USING btree("file_id"); + +CREATE INDEX file_post_service_idx ON file_post_relationships USING btree("service"); + +CREATE INDEX file_post_user_idx ON file_post_relationships USING btree("user"); + +CREATE INDEX file_post_id_idx ON file_post_relationships USING btree("post"); + +CREATE INDEX file_post_contributor_id_idx ON file_post_relationships USING btree("contributor_id"); + +CREATE INDEX file_discord_id_idx ON file_discord_message_relationships USING btree("file_id"); + +CREATE INDEX file_discord_message_server_idx ON file_discord_message_relationships USING btree("server"); + +CREATE INDEX file_discord_message_channel_idx ON file_discord_message_relationships USING btree("channel"); + +CREATE INDEX file_discord_message_id_idx ON file_discord_message_relationships USING btree("id"); + +CREATE INDEX file_discord_message_contributor_id_idx ON file_discord_message_relationships USING btree("contributor_id"); + +CREATE INDEX file_server_relationships_remote_path_idx ON file_server_relationships USING btree(remote_path); diff --git a/db/schema/public/posts/comments.sql b/db/schema/public/posts/comments.sql new file mode 100644 index 0000000..33a7f12 --- /dev/null +++ b/db/schema/public/posts/comments.sql @@ -0,0 +1,34 @@ +CREATE TABLE comments( + "id" varchar(255) NOT NULL, + "post_id" varchar(255) NOT NULL, + "parent_id" varchar(255), + "commenter" varchar(255) NOT NULL, + "service" varchar(20) NOT NULL, + "content" text NOT NULL DEFAULT '', + "added" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "published" timestamp, + deleted_at timestamp, + commenter_name text, + PRIMARY KEY (id, service) +); + +CREATE TABLE comments_revisions( + revision_id serial4 NOT NULL, + id varchar(255) NOT NULL, + post_id varchar(255) NOT NULL, + parent_id varchar(255) NULL, + commenter varchar(255) NOT NULL, + service varchar(20) NOT NULL, + "content" text NOT NULL DEFAULT ''::text, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + published timestamp NULL, + deleted_at timestamp, + commenter_name text, + CONSTRAINT comments_revisions_pkey PRIMARY KEY (revision_id) +); + +CREATE INDEX comments_revisions_post_id_idx ON comments_revisions USING btree(post_id); + +CREATE INDEX comments_revisions_id_idx ON comments_revisions USING btree(id); + +CREATE INDEX comment_idx ON comments USING btree("post_id"); diff --git a/db/schema/public/posts/discord.sql b/db/schema/public/posts/discord.sql new file mode 100644 index 0000000..9eb232a --- /dev/null +++ b/db/schema/public/posts/discord.sql @@ -0,0 +1,59 @@ +-- Posts (Discord) +CREATE TABLE discord_channels( + channel_id text NOT NULL, + server_id text NOT NULL, + name text NOT NULL, + parent_channel_id text NULL, + topic text NULL, + theme_color text NULL, + is_nsfw bool NOT NULL, + position int NOT NULL DEFAULT 0, + icon_emoji text NULL, + type int NOT NULL DEFAULT 0, + CONSTRAINT discord_channels_pkey PRIMARY KEY (channel_id) +); + +CREATE TABLE discord_posts( + "id" varchar(255) NOT NULL, + "author" jsonb NOT NULL, + "server" varchar(255) NOT NULL, + "channel" varchar(255) NOT NULL, + "content" text NOT NULL DEFAULT '', + "added" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "published" timestamp, + "edited" timestamp, + "embeds" jsonb[] NOT NULL, + "mentions" jsonb[] NOT NULL, + "attachments" jsonb[] NOT NULL, + PRIMARY KEY (id, SERVER, channel) +); + +CREATE TABLE discord_posts_revisions( + revision_id serial4 NOT NULL, + id varchar(255) NOT NULL, + author jsonb NOT NULL, + "server" varchar(255) NOT NULL, + channel varchar(255) NOT NULL, + "content" text NOT NULL DEFAULT ''::text, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + published timestamp NULL, + edited timestamp NULL, + embeds _jsonb NOT NULL, + mentions _jsonb NOT NULL, + attachments _jsonb NOT NULL, + CONSTRAINT discord_posts_revisions_pkey PRIMARY KEY (revision_id) +); + +CREATE INDEX discord_channels_server_id_idx ON discord_channels USING btree(server_id); + +CREATE INDEX discord_channels_parent_channel_id_idx ON discord_channels USING btree(parent_channel_id); + +CREATE INDEX discord_id_idx ON discord_posts USING HASH ("id"); + +CREATE INDEX server_idx ON discord_posts USING HASH ("server"); + +CREATE INDEX discord_posts_server_channel_idx ON discord_posts USING btree(SERVER, channel); + +CREATE INDEX discord_posts_channel_published_idx ON discord_posts USING btree(channel, published); + +CREATE INDEX discord_posts_revisions_id_idx ON public.discord_posts_revisions USING btree(id); diff --git a/db/schema/public/posts/fanbox.sql b/db/schema/public/posts/fanbox.sql new file mode 100644 index 0000000..dd0ea3e --- /dev/null +++ b/db/schema/public/posts/fanbox.sql @@ -0,0 +1,62 @@ +CREATE TABLE fanbox_newsletters_temp_old( + id varchar NOT NULL, + user_id varchar NOT NULL, + content text NOT NULL, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + published timestamp, + PRIMARY KEY (id) +); + +CREATE TABLE fanbox_newsletters( + user_id varchar NOT NULL, + hash varchar NOT NULL, + "content" varchar NOT NULL, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + published timestamp NOT NULL, + CONSTRAINT fanbox_newsletters_pkey PRIMARY KEY (user_id, hash) +); + +CREATE TABLE fanbox_embeds( + id varchar NOT NULL, + user_id varchar NOT NULL, + post_id varchar NOT NULL, + type varchar NOT NULL, + json varchar NOT NULL, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + processed varchar, + "iframely_key" varchar(255) NULL, + "iframely_data" jsonb NULL, + "iframely_url" text NULL, + PRIMARY KEY (id) +); + +CREATE TABLE fanbox_fancards( + id serial PRIMARY KEY, + user_id varchar NOT NULL, + file_id int REFERENCES files(id), + last_checked_at timestamp DEFAULT CURRENT_TIMESTAMP, + price text NOT NULL DEFAULT '', + CONSTRAINT fanbox_fancards_user_id_file_id_price_unique_idx UNIQUE (user_id, file_id, price) +); + +CREATE INDEX fanbox_newsletters_temp_old_user_id_idx ON fantia_newsletters USING btree(user_id); + +CREATE INDEX fanbox_newsletters_temp_old_added_idx ON fantia_newsletters USING btree(added); + +CREATE INDEX fanbox_newsletters_temp_old_published_idx ON fantia_newsletters USING btree(published); + +CREATE INDEX fanbox_newsletters_user_id_published_idx ON public.fanbox_newsletters_temp_new USING btree(user_id, published); + +CREATE INDEX fanbox_embeds_user_id_idx ON fanbox_embeds USING btree(user_id); + +CREATE INDEX fanbox_embeds_post_id_idx ON fanbox_embeds USING btree(post_id); + +CREATE INDEX fanbox_embeds_added_idx ON fanbox_embeds USING btree(added); + +CREATE INDEX fanbox_embeds_type_idx ON fanbox_embeds USING btree(type); + +CREATE INDEX fanbox_fancards_user_id_idx ON fanbox_fancards USING btree(user_id); + +CREATE UNIQUE INDEX fanbox_fancards_null_file_id_user_id_price_unique_idx ON fanbox_fancards(user_id, price) +WHERE + file_id IS NULL; diff --git a/db/schema/public/posts/posts.sql b/db/schema/public/posts/posts.sql new file mode 100644 index 0000000..02e18e4 --- /dev/null +++ b/db/schema/public/posts/posts.sql @@ -0,0 +1,115 @@ +-- Posts +CREATE TABLE posts( + "id" varchar(255) NOT NULL, + "user" varchar(255) NOT NULL, + "service" varchar(20) NOT NULL, + "title" text NOT NULL DEFAULT '', + "content" text NOT NULL DEFAULT '', + "embed" jsonb NOT NULL DEFAULT '{}', + "shared_file" boolean NOT NULL DEFAULT '0', + "added" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "published" timestamp, + "edited" timestamp, + "file" jsonb NOT NULL, + "attachments" jsonb[] NOT NULL, + poll jsonb, + captions jsonb, + -- wtf is this type? + tags _CITEXT, + PRIMARY KEY (id, service) +); + +CREATE TABLE revisions( + "revision_id" serial PRIMARY KEY, + "id" varchar(255) NOT NULL, + "user" varchar(255) NOT NULL, + "service" varchar(20) NOT NULL, + "title" text NOT NULL DEFAULT '', + "content" text NOT NULL DEFAULT '', + "embed" jsonb NOT NULL DEFAULT '{}', + "shared_file" boolean NOT NULL DEFAULT '0', + "added" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "published" timestamp, + "edited" timestamp, + "file" jsonb NOT NULL, + "attachments" jsonb[] NOT NULL, + poll jsonb, + -- wtf is this type? + tags _CITEXT, + captions jsonb +); + +CREATE TABLE introductory_messages( + service varchar NOT NULL, + user_id varchar NOT NULL, + hash varchar NOT NULL, + content varchar NOT NULL, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (service, user_id, hash) +); + +CREATE TABLE posts_incomplete_rewards( + id varchar(255) NOT NULL, + service varchar(20) NOT NULL, + last_checked_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + incomplete_attachments_info jsonb NOT NULL DEFAULT '{}' ::jsonb, + "user" varchar(255) NULL, + CONSTRAINT posts_incomplete_rewards_pkey PRIMARY KEY (id, service) +); + +CREATE TABLE posts_added_max( + "user" varchar NOT NULL, + service varchar NOT NULL, + added timestamp NOT NULL, + CONSTRAINT posts_added_max_pkey PRIMARY KEY ("user", service) +); + +CREATE TRIGGER posts_added_max + AFTER INSERT OR UPDATE ON posts + FOR EACH ROW + EXECUTE FUNCTION posts_added_max(); + +CREATE TABLE public_posts( + post_id text NOT NULL, + creator_id text NOT NULL, + service text NOT NULL, + title text NOT NULL, + body text NOT NULL, + tier_price_required text, + tier_required text[], + published_at timestamp without time zone, + edited_at timestamp without time zone, + deleted_at timestamp without time zone, + tags text[], + like_count integer, + comment_count integer, + is_public boolean, + is_nsfw boolean, + refreshed_at timestamp without time zone, + buy_price text, + CONSTRAINT public_posts_pkey PRIMARY KEY (post_id, service) +); + +CREATE INDEX id_idx ON posts USING HASH ("id"); + +CREATE INDEX service_idx ON posts USING btree("service"); + +CREATE INDEX added_idx ON posts USING btree("added"); + +CREATE INDEX published_idx ON posts USING btree("published"); + +CREATE INDEX user_idx ON posts USING btree("user"); + +CREATE INDEX updated_idx ON posts USING btree("user", "service", "added"); + +CREATE INDEX posts_tags_idx ON public.posts USING gin(tags); + +CREATE INDEX posts_user_published_id_idx ON posts USING btree("user", published, id); + +CREATE INDEX posts_incomplete_rewards_service_user_idx ON posts_incomplete_rewards USING btree(service, "user"); + +CREATE INDEX revisions_id_idx ON revisions USING HASH (id); + +CREATE INDEX introductory_messages_user_id_added_idx ON introductory_messages USING btree(user_id, added); + +CREATE INDEX public_posts_creator_id_service_idx ON public_posts USING btree(service, creator_id); diff --git a/db/schema/public/posts/triggers.sql b/db/schema/public/posts/triggers.sql new file mode 100644 index 0000000..dbcfac7 --- /dev/null +++ b/db/schema/public/posts/triggers.sql @@ -0,0 +1,27 @@ +CREATE FUNCTION posts_added_max() + RETURNS TRIGGER + LANGUAGE plpgsql + AS $$ +BEGIN + INSERT INTO posts_added_max AS pam("user", service, added) + SELECT + "user", + service, + max(added) AS added + FROM + posts + WHERE + posts.service = NEW.service + AND posts."user" = NEW."user" + GROUP BY + "user", + service + ON CONFLICT(service, + "user") + DO UPDATE SET + added = EXCLUDED.added + WHERE + EXCLUDED.added > pam.added; + RETURN NULL; +END; +$$; diff --git a/db/schema/public/schema.sql b/db/schema/public/schema.sql new file mode 100644 index 0000000..8414400 --- /dev/null +++ b/db/schema/public/schema.sql @@ -0,0 +1,157 @@ +-- Booru bans +CREATE TABLE dnp( + "id" varchar(255) NOT NULL, + "service" varchar(20) NOT NULL, + "import" boolean NOT NULL DEFAULT TRUE +); + +-- Flags +CREATE TABLE booru_flags( + "id" varchar(255) NOT NULL, + "user" varchar(255) NOT NULL, + "service" varchar(20) NOT NULL, + PRIMARY KEY (id, "user", service) +); + +-- Board +CREATE TABLE board_replies( + "reply" integer NOT NULL, + "in" integer NOT NULL +); + +-- Requests +CREATE TYPE request_status AS ENUM( + 'open', + 'fulfilled', + 'closed' +); + +CREATE TABLE requests( + "id" serial PRIMARY KEY, + "service" varchar(20) NOT NULL, + "user" varchar(255) NOT NULL, + "post_id" varchar(255), + "title" text NOT NULL, + "description" text NOT NULL DEFAULT '', + "created" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + "image" text, + "price" numeric NOT NULL, + "votes" integer NOT NULL DEFAULT 1, + "ips" text[] NOT NULL, + "status" request_status NOT NULL DEFAULT 'open' +); + +CREATE request_title_idx ON requests +USING btree( + "title" +); + +CREATE request_service_idx ON requests +USING btree( + "service" +); + +CREATE request_votes_idx ON requests +USING btree( + "votes" +); + +CREATE request_created_idx ON requests +USING btree( + "created" +); + +CREATE request_price_idx ON requests +USING btree( + "price" +); + +CREATE request_status_idx ON requests +USING btree( + "status" +); + +-- Request Subscriptions +CREATE TABLE request_subscriptions( + "request_id" numeric NOT NULL, + "endpoint" text NOT NULL, + "expirationTime" numeric, + "keys" jsonb NOT NULL +); + +CREATE INDEX request_id_idx ON request_subscriptions USING btree("request_id"); + +CREATE TABLE saved_session_keys( + id serial PRIMARY KEY, + service varchar NOT NULL, + discord_channel_ids varchar, + encrypted_key varchar NOT NULL, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + dead boolean NOT NULL DEFAULT FALSE, + contributor_id int REFERENCES account(id), + UNIQUE (service, encrypted_key) +); + +CREATE TABLE saved_session_keys_with_hashes( + id serial PRIMARY KEY, + service varchar NOT NULL, + discord_channel_ids varchar, + encrypted_key varchar NOT NULL, + hash varchar NOT NULL, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + dead boolean NOT NULL DEFAULT FALSE, + dead_at timestamp, + contributor_id int REFERENCES account(id), + remote_user_id_hash varchar, + UNIQUE (service, hash) +); + +CREATE TABLE saved_session_key_import_ids( + key_id int NOT NULL, + import_id varchar NOT NULL, + UNIQUE (key_id, import_id) +); + +CREATE TABLE complete_imports( + user_id varchar(255) NOT NULL, + service varchar(20) NOT NULL, + subscription varchar(255) NOT NULL, + last_successful_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + info jsonb NOT NULL DEFAULT '{}' ::jsonb, + CONSTRAINT complete_imports_pkey PRIMARY KEY (user_id, service, subscription) +); + +CREATE INDEX saved_session_keys_contributor_idx ON saved_session_keys USING btree("contributor_id"); + +CREATE INDEX saved_session_keys_with_hashes_contributor_idx ON saved_session_keys_with_hashes USING btree("contributor_id"); + +CREATE INDEX saved_session_keys_with_hashes_dead_idx ON saved_session_keys_with_hashes USING btree("dead"); + +CREATE INDEX saved_session_keys_dead_idx ON saved_session_keys USING btree("dead"); + +CREATE TABLE jobs( + job_id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + created_at timestamp DEFAULT CURRENT_TIMESTAMP, + queue_name text NOT NULL, + priority integer NOT NULL, + consumer_id text, + pids integer[], + started_at timestamp, + last_heartbeat_at timestamp, + job_input jsonb NOT NULL, + job_status jsonb DEFAULT '{}' ::jsonb, + finished_at timestamp, + resuming_at timestamp, + error text +); + +CREATE INDEX jobs_finished_at_queue_name_job_input_key_idx ON jobs(finished_at, queue_name,(job_input ->> 'key')); + +CREATE TABLE posts_forced_reimports( + creator_id text NOT NULL, + service text NOT NULL, + post_id text NOT NULL, + reason text NULL, + created_at timestamp DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT posts_forced_reimports_pkey PRIMARY KEY (creator_id, service, post_id) +); diff --git a/db/schema/public/shares.sql b/db/schema/public/shares.sql new file mode 100644 index 0000000..8038fdd --- /dev/null +++ b/db/schema/public/shares.sql @@ -0,0 +1,33 @@ +CREATE TABLE shares( + id serial4 NOT NULL, + "name" varchar NOT NULL, + description varchar NOT NULL, + uploader int4 NULL, + added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT shares_pkey PRIMARY KEY (id), + CONSTRAINT shares_uploader_fkey FOREIGN KEY (uploader) REFERENCES account(id) +); + +CREATE INDEX shares_added_idx ON shares USING btree(added); + +CREATE INDEX shares_uploader_idx ON shares USING btree(uploader); + +CREATE TABLE lookup_share_relationships( + share_id int4 NOT NULL, + service varchar NOT NULL, + user_id varchar NOT NULL, + CONSTRAINT lookup_share_relationships_pkey PRIMARY KEY (share_id, service, user_id), + CONSTRAINT lookup_share_relationships_service_user_id_fkey FOREIGN KEY (service, user_id) REFERENCES lookup(service, id), + CONSTRAINT lookup_share_relationships_share_id_fkey FOREIGN KEY (share_id) REFERENCES shares(id) +); + +CREATE TABLE file_share_relationships( + share_id int4 NOT NULL, + upload_url varchar NOT NULL, + upload_id varchar NOT NULL, + file_id int4 NULL, + filename varchar NOT NULL, + CONSTRAINT file_share_relationships_pkey PRIMARY KEY (share_id, upload_id), + CONSTRAINT file_share_relationships_file_id_fkey FOREIGN KEY (file_id) REFERENCES files(id), + CONSTRAINT file_share_relationships_share_id_fkey FOREIGN KEY (share_id) REFERENCES shares(id) +); diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..1a80656 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,79 @@ +services: + postgres: + image: groonga/pgroonga:3.1.6-alpine-16-slim + restart: unless-stopped + environment: + - POSTGRES_DB=kemono + - POSTGRES_USER=kemono + - POSTGRES_PASSWORD=kemono + volumes: + - ./storage/postgres:/var/lib/postgresql/data + command: ["postgres", "-c", "log_statement=all"] + ports: + - '15432:5432' + + redis: + image: redis:7-alpine + restart: always + ports: + - '16379:6379' + + api: + build: + context: . + args: + GIT_COMMIT_HASH: "custom" + BUILD_DATE: "1970.01.01" + restart: unless-stopped + depends_on: + - postgres + - redis + environment: + - FLASK_ENV=development + - KEMONO_SITE=http://localhost:5000 + - UPLOAD_LIMIT=2000000000 + - ARCHIVERHOST=kemono-archiver + - ARCHIVERPORT=80 + - PYTHONUNBUFFERED=1 + - KEMONO_CONFIG=config.example.json + - PYTHONPATH=/app + volumes: + - ./:/app + - ./storage/files:/storage + sysctls: + net.core.somaxconn: 2000 + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:80" ] + interval: 60s + timeout: 2m + retries: 3 + start_period: 30s + + command: + [ "python", "-m", "src", "run" ] + + web: + build: + context: . + dockerfile: Dockerfile-client + args: + GIT_COMMIT_HASH: "custom" + BUILD_DATE: "1970.01.01" + restart: unless-stopped + depends_on: + - api + volumes: + - ./:/app + command: + [ "npm", "run", "dev" ] + + nginx: + image: nginx + depends_on: + - web + ports: + - '5000:80' + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf + - ./storage/files:/storage + - ./:/app diff --git a/docs/FAQ.md b/docs/FAQ.md index 109074b..81d3206 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -1,142 +1,9 @@ # Frequently Asked Questions -
    - -### My dump doesn't migrate. - -_This assumes a running setup._ - -
    - -1. Enter into database container: - - ```sh - docker exec \ - --interactive \ - --username=nano \ - --tty kemono-db psql \ - kemonodb - ``` - -
    - -2. Check the contents of the  `posts`  table. - - ```sql - SELECT * FROM posts; - ``` - - _Most likely it has  `0`  rows._ - -
    - -3. Move contents of  `booru_posts`  ➞  `posts` - - ```sql - INSERT INTO posts SELECT * FROM booru_posts ON CONFLICT DO NOTHING; - ``` - -
    - -4. Restart the archiver. - - ```sh - docker restart kemono-archiver - ``` - - If you see a bunch of log entries from  `kemono-db` ,
    - then this indicates that the archiver is doing it's job. - -
    - -5. In case the frontend still doesn't show
    - the artists / posts, clear the redis cache. - - ```sh - docker exec \ - kemono-redis \ - redis-cli \ - FLUSHALL - ``` - -
    -
    - -### How do I git modules? - -_This assumes you haven't cloned the repository recursively._ - -
    - -1. Initiate the submodules - - ```sh - git submodule init - git submodule update \ - --recursive \ - --init - ``` - -
    - -2. Switch to the archiver folder and
    - add your fork to the remotes list. - - ```sh - cd archiver - git remote add - ``` - -
    - -3. Now you can interact with Kitsune repo the same
    - way you do as if it was outside of project folder. - -
    -
    - -### How do I import from db dump? - -
    - -1. Retrieve a database dump. - -
    - -2. Run the following in the folder of said dump. - - ```sh - cat db-filename.dump \ - | gunzip \ - | docker exec \ - --interactive kemono-db psql \ - --username=nano kemonodb - ``` - -
    - -3. Restart the archiver to trigger migrations. - - ```sh - docker restart kemono-archiver - ``` - -
    - - If that didn't start the migrations, refer
    - to  [`My Dump Doesn't Migrate`]  section. - -
    -
    - -### How do I put files into nginx container? - -
    +## How do I put files into nginx container? 1. Retrieve the files in required folder structure. -
    - 2. Copy them into nginx image. ```sh @@ -144,8 +11,6 @@ _This assumes you haven't cloned the repository recursively._ cp ./ kemono-nginx:/storage ``` -
    - 3. Add required permissions to that folder. ```sh @@ -155,8 +20,118 @@ _This assumes you haven't cloned the repository recursively._ nginx /storage ``` -
    +## How Do I Install Python 3.12 on Ubuntu 22? +Through a PPA (Personal Package Archives). - +1. Install required tooling and add the PPA: -[`My Dump Doesn't Migrate`]: #my-dump-doesnt-migrate + ```sh + sudo apt install --assume-yes software-properties-common + sudo add-apt-repository ppa:deadsnakes/ppa + ``` + +2. Update local `apt` listing and install required python dependencies: + + ```sh + sudo apt update + sudo apt install \ + python3.12 \ + python3.12-dev \ + python3.12-distutils + ``` + +3. Confirm python 3.12 is installed + ```sh + which python3.12 + ``` + +## How Do I Install Node.js 22.14? + +### For Linux/macOS: + +1. Install NVM: + + ```sh + # Using curl + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash + + # OR using wget + wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash + ``` + +2. Add NVM to your shell configuration: + + The installer should automatically add the necessary configuration to your shell profile + (`.bashrc`, `.zshrc`, etc.), but if it doesn't, add these lines manually: + + ```sh + export NVM_DIR="$HOME/.nvm" + [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm + [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion + ``` + +3. Either restart your terminal or source your profile: + + ```sh + # For bash + source ~/.bashrc + + # For zsh + source ~/.zshrc + ``` + +4. Verify NVM installation: + + ```sh + nvm --version + ``` + +5. Install Node.js 22.14: + + ```sh + nvm install 22.14 + ``` + +6. Set it as the default (optional): + + ```sh + nvm alias default 22.14 + ``` + +7. Verify the installation: + + ```sh + node --version # Should output v22.14.0 + npm --version # NPM is included with Node.js 10.9.2+ + ``` + +8. If you need to switch between Node.js versions: + + ```sh + nvm ls + + nvm use 22.14 + + nvm use default + ``` + +### For Windows: + +Windows users can install Node.js directly using the official installer: + +1. Go to the Node.js downloads page: + https://nodejs.org/en/download/current + +2. Download the Windows installer for v22.14.0: + - Look for `node-v22.14.X-x64.msi` (64-bit installer) + - The "X" represents the patch version which may change + +3. Run the downloaded MSI file and follow the installation wizard. + +4. Verify the installation by opening Command Prompt or PowerShell and running: + ``` + node --version + npm --version + ``` + +5. The installer includes npm, so no separate installation is needed. npm version should be 10.9.2 or newer. \ No newline at end of file diff --git a/docs/code-style.md b/docs/code-style.md new file mode 100644 index 0000000..f5a27c7 --- /dev/null +++ b/docs/code-style.md @@ -0,0 +1,15 @@ +# Code Style + +## General + +- Prepend all control flow keywords with an empty line. + +## SQL + +- Always declare aliases with `AS` construct. +- No star selects allowed. + +## Python + +- Prefix all `TypedDict` declarations with `TD`.
    + Otherwise it's easy to mix them up wtih actual classes and then do `isinstance()` accidentally. diff --git a/docs/database.md b/docs/database.md new file mode 100644 index 0000000..6a40317 --- /dev/null +++ b/docs/database.md @@ -0,0 +1,37 @@ +# Database + +## Schema reference + +The folder `/db/schema/` holds the information about relevant symbols for the codebase in ``.
    +This information is plain SQL files with only symbol declarations without any data-modifying queries.
    + +The main usecase is to be able to look into database schema without reving up the docker stack/setting up database.
    +The other perk coming from this is schema reference data is bound to commits, so it allows to diff schema changes
    +before trying to make sense of migrations. + +**From this point on (2024-07-03T00:00:0.000Z) any commit which includes schema-changing migrations
    +must also include changes in the schema reference.** + +## File structure + +There is no particular structure beyond having files in a specific schema folder.
    +But in general small enough declarations without any category go into `schema.sql`,
    +otherwise they go into separate files. If a separate file becomes too big, then it goes into
    +a separate folder split into separate files. + +## Migrations already include this information +They do, but as of time of writing (2024-07-03T00:00:0.000Z) there 75 migration files with a ton of data-changing boilerplate. + +## Why like this? +It's quick, located alongside migrations and (eventually) queries and doesn't require to learn some goofy DSL
    +which will eventually fall behind the new features of Postgresql. + +The alternative considered was relying on [`pg_dump` with `--schema-only` argument](https://www.postgresql.org/docs/current/app-pgdump.html)
    +but it has pretty big drawbacks: +- it requires a functioning and running database to work, which isn't going to always happen during development. +- The output SQL is not a clean one, i.e. it includes system-specific data, which is irrelevant to the repo code.
    + That means it has to be parsed and transformed which is not gonna happen. +- Included symbols make sense in context of the command, but not in the context of repo. I.e. the repo doesn't need to know the user ownership of symbols. +That means the repo has to store all symbol names somewhere in the first place. And that list has to be updated manually anyway. +- The output SQL is written in a desugarized form, which is a dealbreaker since migrations are written in sugar
    +and this disparity only makes it harder to understand them and the whole schema. diff --git a/docs/develop-docker.md b/docs/develop-docker.md new file mode 100644 index 0000000..a5936f0 --- /dev/null +++ b/docs/develop-docker.md @@ -0,0 +1,42 @@ +# Docker Universal Setup + +The quickest way to get started with development is using Docker. This approach works on all operating systems and requires minimal setup. + +## Prerequisites + +- [Docker](https://docs.docker.com/get-docker/) +- [Docker Compose](https://docs.docker.com/compose/install/) + +## Setup Steps + +1. Clone the repository (if you haven't already) + +2. Copy the example configuration file: + + ```sh + cp config.json.example config.json + ``` + +3. Start the containers using Docker Compose: + + ```sh + docker compose up + ``` + +4. Once the containers are running, access the application at: + + [http://localhost:5000](http://localhost:5000) + +## Stop the Environment + +To stop the containers, press `Ctrl+C` in the terminal where Docker Compose is running, or run: + +```sh +docker compose down +``` + +## Notes + +- No local dependencies are required with this method +- This setup is ideal for testing or quick development +- All services (backend, frontend, database) run in containers diff --git a/docs/develop-linux.md b/docs/develop-linux.md new file mode 100644 index 0000000..f2dcd6d --- /dev/null +++ b/docs/develop-linux.md @@ -0,0 +1,147 @@ +# Develop + +For now Docker is a primary way of working on the repo. +However dependencies are still needed to installed locally for +the IDE setup. + +## Requirements: + +Python: 3.12+ +NodeJS: 22.14+ +PostgreSQL: 16+ +Redis: 6+ + +## Installation + +1. Check if node 22.14 or 22.13 is installed in the system: + ``` + node --version + ``` + If fails, follow [installation instructions](./FAQ.md#how-do-i-install-nodejs-2214-using-nvm) + + +2. Check if python 3.12 is installed in the system: + + ```sh + which python 3.12 + ``` + + If no path returned, follow [installation instructions](./FAQ.md#how-do-i-install-python-312-on-ubuntu-22) + +3. Install `virtualenv` package if it's not installed. + + ```sh + pip install --user virtualenv + ``` + +4. Create a virtual environment: + + ```sh + virtualenv python=3.12 venv + ``` + +5. Activate the virtual environment. + + ```sh + # Windows ➞ venv\Scripts\activate + source venv/bin/activate + ``` + +6. Install python packages. + + ```sh + pip install --requirement requirements.txt + ``` + +7. Install `pre-commit` hooks. + + ```sh + pre-commit install --install-hooks + ``` + +## Database Setup + +1. Install PostgreSQL if not already installed. + +2. Create a database and user for the application. + +3. Write in the config.json the credentials + + +## Redis Setup + +1. Install Redis if not already installed. + +2. Verify Redis is running. + +3. Write in the config.json the credentials + + +## File Paths Configuration + +The application requires several directories for storing and serving files: + +1. Make sure you have the directories with files, /data, /thumbnails, /icons: + +2. Serve them with nginx or what is of your choice: + +3. Configure the base url to serve from that file server by setting the following env variables: + + ```env + ICONS_PREPEND + BANNERS_PREPEND + THUMBNAILS_PREPEND + ``` + + +## RUN + +1. Run the API dev server: + + ```sh + python -m src web + ``` +2. Run frontend dev server: + + ```sh + python -m src webpack + ``` + +## Git + +Configure `git` to store credentials: + +```sh +git config credential.helper store +``` + +After the next time creds are accepted, they will be saved on hard drive +as per rules listed in `man git-credential-store`and won't be asked again. + +Alternatively they can be stored temporarily in memory: + +```sh +git config credential.helper cache +``` + +The creds are stored as per rules in `man git-credential-cache`. + +## IDE + +_IDE specific instructions._ + +### VSCode + +1. Copy `.code-workspace` file. + + ```sh + cp \ + configs/workspace.code-workspace.example \ + kemono-2.code-workspace + ``` + +2. Install the recommended extensions. + +[`http://localhost:5000/development`]: http://localhost:5000/development +[`http://localhost:5000/`]: http://localhost:5000/ +[`http://localhost:8000/`]: http://localhost:8000/ \ No newline at end of file diff --git a/docs/develop-windows-client.md b/docs/develop-windows-client.md new file mode 100644 index 0000000..d6e13c1 --- /dev/null +++ b/docs/develop-windows-client.md @@ -0,0 +1,37 @@ +# Windows Client Only Setup with Reverse Proxy + +This guide covers setting up a frontend-only development environment on Windows with a reverse proxy to connect to a remote backend. + +## Requirements + +- NodeJS: 22.14+ +- Git +- Docker + +## Installation + +1. Open your console on the root of the project and check if Node.js 22.14+ is installed: + ``` + node --version + ``` + If not installed or version is older, follow the [Node.js installation instructions](./FAQ.md#how-do-i-install-nodejs-2214) + +2. Clone the repository (if you haven't already) + +3. To setup the configuration, navigate to the client directory and install the necessary packages run the following: + ``` + cp config.example.production.json config.json + cd client + npm i + ``` + +4. Finally to run the development server run: + ``` + npm run dev + ``` + +4. Access the application at: + [http://localhost:5000/](http://localhost:5000/) + + +5. Make sure the images and api calls are being reverse proxied. diff --git a/docs/develop.md b/docs/develop.md index 18f547c..ccf15c0 100644 --- a/docs/develop.md +++ b/docs/develop.md @@ -1,121 +1,28 @@ -# Develop +# Development Guide -For now Docker is a primary way of working on the repo. +This guide provides several ways to set up your development environment based on your needs and operating system. -## Installation +## Setup Options -1. Install `virtualenv` package if it's not installed. +### [Docker Universal](./develop-docker.md) +The quickest way to get started with minimal setup: +- Works on all operating systems +- Uses Docker Compose +- No need to install dependencies locally - ```sh - pip install --user virtualenv - ``` -2. Create a virtual environment: +### [Windows Client Only](./develop-windows-client.md) +Frontend development on Windows with reverse proxy: +- Only frontend dependencies required +- Uses reverse proxy to connect to remote backend +- Lightweight setup - ```sh - virtualenv venv - ``` +### [Linux Setup](./develop-linux.md) +Complete development environment for Linux: +- Local dependency installation +- Full development stack +- IDE configuration -2. Activate the virtual environment. +## Getting Help - ```sh - # Windows ➞ venv\Scripts\activate - source venv/bin/activate - ``` - -3. Install python packages. - - ```sh - pip install --requirement requirements.txt - ``` - -4. Install  `pre-commit`  hooks. - - ```sh - pre-commit install --install-hooks - ``` - -### Database - -1. Register an account. - -2. Visit  [`http://localhost:5000/development`] - -3. Click either seeded or random generation. - - _This will start a mock import process,_
    - _which will also populate the database._ - -### Build - -```sh -docker-compose build -docker-compose up --detach -``` - -In a browser, visit  [`http://localhost:8000/`] - -## Manual - -> **TODO** : Write installation and setup instructions - -This assumes you have  `Python 3.8+`  &  `Node 12+`  installed
    -as well as a running **PostgreSQL** server with **Pgroonga**. - -```sh -# Make sure your database is initialized -# cd to kemono directory - -pip install virtualenv -virtualenv venv - -# Windows ➞ venv\Scripts\activate -source venv/bin/activate - -pip install \ - --requirement requirements.txt - -cd client \ - && npm install \ - && npm run build \ - && cd .. -``` - -## Git - -Configure `git` to store credentials: - -```sh -git config credential.helper store -``` - -After the next time creds are accepted, they will be saved on hard drive -as per rules listed in `man git-credential-store`and won't be asked again. - -Alternatively they can be stored temporarily in memory: - -```sh -git config credential.helper cache -``` - -The creds are stored as per rules in `man git-credential-cache`. - -## IDE - -_IDE specific instructions._ - -### VSCode - -1. Copy  `.code-workspace`  file. - - ```sh - cp \ - configs/workspace.code-workspace.example \ - kemono-2.code-workspace - ``` - -2. Install the recommended extensions. - -[`http://localhost:5000/development`]: http://localhost:5000/development -[`http://localhost:5000/`]: http://localhost:5000/ -[`http://localhost:8000/`]: http://localhost:8000/ +For additional assistance, check the [FAQ](./FAQ.md). \ No newline at end of file diff --git a/docs/features/accounts.md b/docs/features/accounts.md index 8d0d4fc..9d347b2 100644 --- a/docs/features/accounts.md +++ b/docs/features/accounts.md @@ -3,7 +3,6 @@ ## Table of contents - [General Description](#general-description) -- [Issues](#issues) ## General Description @@ -26,5 +25,3 @@ The first registered account of the instance gets this role. Administrator can c #### Session Key Management Accounts can access the page which lists all keys set up for autoimport and revoke any of them. - -## Issues diff --git a/docs/projects/_index.md b/docs/projects/_index.md deleted file mode 100644 index d9efcad..0000000 --- a/docs/projects/_index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Projects - -- [Moderation system](./moderation-system.md) diff --git a/docs/projects/favorites1dot5.md b/docs/projects/favorites1dot5.md deleted file mode 100644 index afea33d..0000000 --- a/docs/projects/favorites1dot5.md +++ /dev/null @@ -1,18 +0,0 @@ -# Favorites V1.5 - -## Table of contents - -- [General Description](#general-description) -- [Interfaces](#interfaces) -- [Technical Description](#technical-description) -- [Issues](#issues) - -## General Description - -## Interfaces - -### SQL - -## Technical Description - -## Issues diff --git a/docs/projects/file-upload.md b/docs/projects/file-upload.md deleted file mode 100644 index 40119b9..0000000 --- a/docs/projects/file-upload.md +++ /dev/null @@ -1,30 +0,0 @@ -# File Upload - -## Table of contents - -- [Interfaces](#interfaces) -- [Core information](#core-information) -- [Process](#process) -- [Issues](#issues) - -## Interfaces - -```typescript -interface ManualUpload {} -``` - -## Core information - -## Process - -1. The account goes to `/posts/upload`. -2. Uploads the file. -3. The file gets processed. -4. The file gets sent for review to a moderator. -5. The moderator then decides to discard the upload or approve for public view. -6. ... - -## Issues - -- What happens when one mod approves a file while the other one discards it? -- Unlike DMs the file verification can take very variable amount of time, so there should be separate states for a given upload, like `"pending"`,`"approved"`,`"rejected"`. diff --git a/docs/projects/moderation-system.md b/docs/projects/moderation-system.md deleted file mode 100644 index 7a23482..0000000 --- a/docs/projects/moderation-system.md +++ /dev/null @@ -1,42 +0,0 @@ -# Moderation System - -## Table of contents - -- [General Description](#general-description) -- [Interfaces](#interfaces) -- [Technical Description](#technical-description) -- [Process](#process) -- [Issues](#issues) - -## General Description - -The moderation system allows certain users ("moderators") chosen by the administrator user to perform various tasks. - -## Interfaces - -```typescript -interface Action { - id: string; - account_id: string; - type: string; - categories: string[]; - /** - * A list of resource `id`s affected by the action. - */ - entity_ids: string[]; - status: "completed" | "failed" | "reverted"; - created_at: Date; -} -``` - -## Technical Description - -## Process - -### Moderator - -1. When the role of an account changes to `moderator`, the account gets notified of this. -1. The account then can access `/mod` endpoint, which leads to the moderator dashboard. On this page the mod can see various stats, among them is the list of various `tasks`. -1. Each performed `task` results in an `action`. - -## Issues diff --git a/docs/templates/feature-template.md b/docs/templates/feature-template.md deleted file mode 100644 index 7ff85ef..0000000 --- a/docs/templates/feature-template.md +++ /dev/null @@ -1,10 +0,0 @@ -# Title - -## Table of contents - -- [General Description](#general-description) -- [Issues](#issues) - -## General Description - -## Issues diff --git a/docs/templates/project-template.md b/docs/templates/project-template.md deleted file mode 100644 index 8cba19d..0000000 --- a/docs/templates/project-template.md +++ /dev/null @@ -1,16 +0,0 @@ -# Title - -## Table of contents - -- [General Description](#general-description) -- [Interfaces](#interfaces) -- [Technical Description](#technical-description) -- [Issues](#issues) - -## General Description - -## Interfaces - -## Technical Description - -## Issues diff --git a/docs/todos.md b/docs/todos.md deleted file mode 100644 index 972d0ca..0000000 --- a/docs/todos.md +++ /dev/null @@ -1,31 +0,0 @@ -# TODOs - -## Server - -## Archiver - -- Make dev file import work - -## Client - -### Webpack - -- SASS uses its own module name resolution mechanism which differs from the current webpack setup. Specifically `config.resolve.alias` rules will not apply to filenames in `@use "";` expression. -- Figure out how to pass env variables to stylesheets. -- Figure out how to set up source maps for production. - -### HTML/Templates - -- Find a way to nest macro calls. - -#### `user.html` - -- AJAX search. - -#### `import` pages - -- consolidate them into a single page, since most of them are just placeholders for AJAX scripts. - -### CSS - -### JS diff --git a/nginx.conf b/nginx.conf index 2e58f2c..4717115 100644 --- a/nginx.conf +++ b/nginx.conf @@ -32,18 +32,27 @@ http { root /storage; client_max_body_size 100m; + location @kemono { + proxy_pass http://web:3450; + } + + location @api { + proxy_pass http://api:3449; + } + location ~ "^/archive_files/([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{60})\.(.*)" { proxy_pass http://foobar:5000/extract/data/$1/$2/$1$2$3.$4$is_args$args; } + location /api { + try_files /dev/null @api; + } + location / { try_files $uri @kemono; if ($arg_f) { add_header Content-Disposition "inline; filename=$arg_f"; } } - location @kemono { - proxy_pass http://web; - } } } diff --git a/pyproject.toml b/pyproject.toml index 1d9ae3c..e19b7cd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,4 +6,5 @@ target-version = ["py312"] line_length = 120 [tool.mypy] +python_version = "3.12" exclude = "storage" diff --git a/requirements.txt b/requirements.txt index 03f3786..edd66eb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,9 +2,9 @@ bcrypt==4.0.1 beautifulsoup4==4.12.2 nh3==0.2.15 cloudscraper==1.2.71 -dill==0.3.7 Flask==2.3.2 humanize==4.8.0 +jsonschema==4.23.0 murmurhash2==0.2.10 pre-commit==3.7.0 psycopg[binary,pool]>=3.1.10 @@ -16,9 +16,9 @@ requests==2.31.0 httpx[http2,socks]==0.25.2 retry==0.9.2 sentry-sdk[flask]==1.29.2 -orjson==3.9.9 -#uWSGI==2.0.22 -git+https://github.com/unbit/uwsgi.git@0486062811be6f4bbed28e61bcb0d33dfeb2045c#uWSGI +setuptools==75.8.0 +orjson==3.9.15 +uWSGI==2.0.24; platform_system != "Windows" pyyaml==6.0.1 yoyo-migrations==8.2.0 zstandard==0.21.0 diff --git a/schema/config.schema.json b/schema/config.schema.json new file mode 100644 index 0000000..d9c53f1 --- /dev/null +++ b/schema/config.schema.json @@ -0,0 +1,642 @@ +{ + "$id": "configuration", + "title": "Configuration", + "description": "Configuration for Kemono.", + "type": "object", + "additionalProperties": false, + "required": ["site", "development_mode", "automatic_migrations", "webserver"], + "properties": { + "site": { + "description": "Deprecated in favour of `#/webserver/site`.", + "$comment": "`$deprecated` keyword was in introduced in draft `2019-09`, so just using `description` field instead.", + "type": "string" + }, + "favicon": { + "description": "favicon.ico file path.", + "type": "string" + }, + "development_mode": { + "type": "boolean" + }, + "automatic_migrations": { + "type": "boolean" + }, + "sentry_dsn": { + "type": "string" + }, + "sentry_dsn_js": { + "type": "string" + }, + "open_telemetry_endpoint": { + "type": "null" + }, + "ban_url": { + "description": "Kemono3 `BAN` URL prefix for cache purging.", + "anyOf": [ + { "type": "string" }, + { "type": "array", "items": { "type": "string" } } + ] + }, + "enable_notifications": { + "type": "boolean" + }, + "cache_ttl_for_recent_posts": { + "type": "integer" + }, + "webserver": { + "$ref": "#/definitions/webserver" + }, + "database": { + "$ref": "#/definitions/database" + }, + "redis": { + "$ref": "#/definitions/redis" + }, + "archive_server": { + "$ref": "#/definitions/archive-server" + }, + "filehaus": { + "$ref": "#/definitions/filehaus" + } + }, + "definitions": { + "webserver": { + "description": "Configuration for the frontend server.", + "type": "object", + "additionalProperties": false, + "required": ["secret", "ui"], + "properties": { + "secret": { + "description": "Secret key used to encrypt sessions.", + "type": "string" + }, + "workers": { + "description": "Amount of workers to run at once.", + "type": "integer" + }, + "harakiri": { + "$comment": "This one isn't used by server code.", + "type": "integer" + }, + "threads": { + "description": "Amount of thread to run at once.", + "type": "integer" + }, + "ip_security": { + "description": "If you've dealt with how the trust of forwarding IPs works upstream, flip this off.", + "type": "boolean" + }, + "country_header_key": { + "description": "Header for user country iso, generater by DDOS-GUARD.", + "anyOf": [{ "type": "string" }, { "const": "DDG-Connecting-Country" }] + }, + "uwsgi_options": { + "$ref": "#/definitions/uwsgi-options" + }, + "logging": { + "description": "Logging mode.", + "enum": ["DEBUG", "ERROR"] + }, + "site": { + "description": "The URL at which the site is publicly accessible.", + "type": "string" + }, + "static_folder": { + "description": "The location of the resources that will be served.", + "type": "string" + }, + "template_folder": { + "type": "string" + }, + "jinja_bytecode_cache_path": { + "type": "null" + }, + "max_full_text_search_input_len": { + "type": "integer" + }, + "table_sample_bernoulli_sample_size": { + "type": "number" + }, + "extra_pages_to_load_on_posts": { + "type": "integer" + }, + "pages_in_popular": { + "type": "integer" + }, + "earliest_date_for_popular": { + "type": "string" + }, + "use_redis_by_lock_default_on_queries": { + "type": "boolean" + }, + "api": { + "type": "object", + "additionalProperties": false, + "properties": { + "creators_location": { + "type": "string" + } + } + }, + "base_url": { + "type": "string" + }, + "port": { + "description": "The port the site will be served on.", + "type": "integer" + }, + "ui": { + "$ref": "#/definitions/ui" + } + } + }, + "ui": { + "description": "Interface preferences and customization options.", + "type": "object", + "additionalProperties": false, + "required": ["home", "config"], + "properties": { + "home": { + "$ref": "#/definitions/ui-home" + }, + "config": { + "$ref": "#/definitions/ui-config" + }, + "fileservers": { + "type": "array", + "items": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": [ + { "type": "string" }, + { "anyOf": [{ "type": "integer" }, { "type": "string" }] } + ] + } + }, + "sidebar": { + "type": "object", + "additionalProperties": false, + "properties": { + "disable_filehaus": { + "type": "boolean" + }, + "disable_faq": { + "type": "boolean" + }, + "disable_dms": { + "type": "boolean" + } + } + }, + "sidebar_items": { + "description": "Add custom links to the bottom of the sidebar.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["text"], + "properties": { + "header": { "type": "boolean" }, + "text": { "type": "string" }, + "class_name": { "type": "string" }, + "link": { "type": "string" }, + "is_external": { "type": "boolean" }, + "color": { "type": "string" } + } + } + }, + "footer_items": { + "description": "Add custom HTML elements to the footer.", + "type": "array", + "items": { + "type": "string" + } + }, + "banner": { + "description": "Banner HTML. Each entry should be Base64-encoded.", + "type": "object", + "additionalProperties": false, + "properties": { + "global": { + "description": "B64-encoded html fragment.", + "type": "string" + }, + "announcement_global": { + "description": "B64-encoded html fragment.", + "type": "string" + }, + "welcome": { + "description": "B64-encoded html fragment.", + "type": "string" + } + } + }, + "ads": { + "$ref": "#/definitions/ui-ads" + }, + "matomo": { + "$ref": "#/definitions/matomo" + }, + "video_extensions": { + "description": "File extensions recognized as (browser-friendly) video. Will automatically be embedded in post pages.", + "type": "array", + "uniqueItems": true, + "items": { + "enum": [".mp4", ".webm", ".m4v", ".3gp", ".mov"] + } + }, + "files_url_prepend": { + "type": "object", + "additionalProperties": false, + "properties": { + "icons_base_url": { + "type": "string" + }, + "banners_base_url": { + "type": "string" + }, + "thumbnails_base_url": { + "type": "string" + } + } + } + } + }, + "ui-home": { + "type": "object", + "additionalProperties": false, + "properties": { + "site_name": { "type": "string" }, + "welcome_credits": { + "description": "B64-encoded html fragment.", + "type": "string" + }, + "home_background_image": { + "description": "A path to background image on server.", + "type": "string" + }, + "logo_path": { + "type": "string" + }, + "mascot_path": { + "type": "string" + }, + "announcements": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "title": { "type": "string" }, + "date": { "type": "string" }, + "content": { "type": "string" } + } + } + } + } + }, + "ui-config": { + "type": "object", + "additionalProperties": false, + "required": ["paysite_list"], + "properties": { + "paysite_list": { + "type": "array", + "uniqueItems": true, + "items": { + "enum": [ + "patreon", + "fanbox", + "afdian", + "discord", + "fantia", + "boosty", + "gumroad", + "subscribestar", + "dlsite", + "candfans", + "fansly", + "onlyfans" + ] + } + }, + "artists_or_creators": { + "type": "string" + } + } + }, + "ui-ads": { + "description": "Ads preferences. Each spot should be Base64-encoded.", + "type": "object", + "additionalProperties": false, + "properties": { + "header": { + "description": "Base64-encoded html fragment.", + "type": "string" + }, + "middle": { + "description": "Base64-encoded html fragment.", + "type": "string" + }, + "footer": { + "description": "Base64-encoded html fragment.", + "type": "string" + }, + "slider": { + "description": "Base64-encoded html fragment.", + "type": "string" + }, + "video": { + "description": "Base64-encoded JSON list of objects.\nSee https://docs.fluidplayer.com/docs/configuration/ads/#adlist .", + "type": "string" + } + } + }, + "matomo": { + "description": "Matomo preferences.", + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { "type": "boolean" }, + "tracking_domain": { + "type": "string" + }, + "tracking_code": { + "type": "string" + }, + "site_id": { + "type": "integer" + }, + "plain_code": { + "description": "Base64-encoded html fragment.", + "type": "string" + } + } + }, + "database": { + "description": "Database configuration.", + "type": "object", + "additionalProperties": false, + "required": ["host", "user", "password", "database"], + "properties": { + "host": { "type": "string" }, + "port": { "type": "integer" }, + "user": { "type": "string" }, + "password": { "type": "string" }, + "database": { "type": "string" }, + "application_name": { "type": "string" } + } + }, + "redis": { + "type": "object", + "additionalProperties": false, + "required": ["defaults"], + "properties": { + "defaults": { "$ref": "#/definitions/redis-defaults" }, + "compression": { "type": "string" }, + "default_ttl": { "type": "string" }, + "node_options": { + "type": "object", + "additionalProperties": false, + "properties": { + "host": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "db": { + "type": "integer" + }, + "password": { + "type": "string" + } + } + }, + "nodes": { + "anyOf": [ + { + "type": "object", + "additionalProperties": { "type": "string" } + }, + { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "port": { + "type": "integer" + }, + "db": { + "type": "integer" + } + } + } + } + ] + }, + "keyspaces": { + "type": "object", + "propertyNames": { + "$ref": "#/definitions/redis-keyspaces" + }, + "additionalProperties": { + "type": "integer" + } + } + } + }, + "redis-defaults": { + "type": "object", + "additionalProperties": false, + "required": ["host"], + "properties": { + "host": { + "type": "string" + }, + "password": { + "type": "string" + }, + "port": { + "type": "integer" + }, + "db": { + "type": "integer" + } + } + }, + "redis-keyspaces": { + "enum": [ + "account", + "saved_key_import_ids", + "saved_keys", + "random_artist_keys", + "top_artists", + "artists_by_update_time", + "artists_faved", + "artists_faved_count", + "artists_recently_faved_count", + "top_artists_recently", + "non_discord_artist_keys", + "non_discord_artists", + "artists_by_service", + "artist", + "artist_post_count", + "artist_post_offset", + "artist_last_updated", + "artist_favorited", + "dms", + "all_dms", + "all_dms_count", + "all_dms_by_query", + "all_dms_by_query_count", + "dms_count", + "unapproved_dms", + "favorite_artists", + "favorite_posts", + "notifications_for_account", + "random_post_keys", + "post", + "next_post", + "previous_post", + "posts_incomplete_rewards", + "post_favorited", + "posts_by_artist", + "posts_by_artists", + "posts_by_favorited_artists", + "comments", + "artist_posts_offset", + "is_post_flagged", + "importer_logs", + "ratelimit", + "all_posts", + "all_post_keys", + "all_shares", + "all_shares_count", + "all_posts_for_query", + "global_post_count", + "global_post_count_for_query", + "lock", + "lock-signal", + "imports", + "share_files", + "account_notifications", + "new_notifications", + "share", + "artist_shares", + "post_revisions", + "post_revision", + "files", + "post_by_id", + "fancards", + "announcements", + "announcement_count", + "artist_share_count", + "discord_channels_for_server", + "discord_posts", + "popular_posts", + "tagged_posts", + "tags", + "file", + "archive_files", + "linked_accounts", + "running_imports", + "importer_configuration" + ] + }, + "archive-server": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "api_url": { + "type": "string" + }, + "serve_files": { + "type": "boolean" + }, + "file_serving_enabled": { + "type": "boolean" + } + } + }, + "filehaus": { + "description": "Filehaus configuration.", + "type": "object", + "additionalProperties": false, + "properties": { + "requires_account": { + "description": "If true, an account will be required for uploading.", + "type": "boolean" + }, + "required_roles": { + "description": "Required account roles for uploading. If set to an empty list, no permissions will be required.", + "type": "array", + "uniqueItems": true, + "items": { + "enum": ["administrator", "moderator", "uploader"] + } + }, + "tus": { + "description": "`tusd` configuration.", + "type": "object", + "additionalProperties": false, + "properties": { + "manage": { + "description": "Automatically manage `tusd` on port 1080. If you intend to store uploads on a different server from Kemono3, set a custom URL instead...", + "type": "boolean" + }, + "url": { + "description": "...right here. Note that if you do not allow automatic management and did not set a custom URL, uploads will be blackholed to a demo instance and Filehaus sharing will not function correctly.\nDo note that using `tusd` instances to enable Filehaus functionality requires the `post-create` hook to be pointed at Kemono's `/shares/tus` endpoint.\n`tusd --hooks-enabled-events post-create -hooks-http \"http://127.0.0.1:6942/shares/tus\" -upload-dir=./data`", + "type": "string" + } + } + } + } + }, + "uwsgi-options": { + "description": "Set additional uWSGI options if you want. Overrides any of the other options.", + "type": "object", + "additionalProperties": false, + "properties": { + "cheaper-algo": { + "enum": ["busyness"] + }, + "cheaper": { + "type": "integer" + }, + "cheaper-initial": { + "type": "integer" + }, + "cheaper-overload": { + "type": "integer" + }, + "cheaper-step": { + "type": "integer" + }, + "cheaper-busyness-multiplier": { + "type": "integer" + }, + "cheaper-busyness-min": { + "type": "integer" + }, + "cheaper-busyness-max": { + "type": "integer" + }, + "cheaper-busyness-backlog-alert": { + "type": "integer" + }, + "cheaper-busyness-backlog-step": { + "type": "integer" + }, + "disable-logging": { + "type": "boolean" + } + } + } + } +} diff --git a/schema/config.ts b/schema/config.ts new file mode 100644 index 0000000..f53a04c --- /dev/null +++ b/schema/config.ts @@ -0,0 +1,103 @@ +export interface IConfiguration { + site: string; + sentry_dsn_js?: string; + development_mode: boolean; + automatic_migrations: boolean; + webserver: IServerConfig; + archive_server?: IArchiveServerConfig; +} + +interface IServerConfig { + ui: IUIConfig; + port?: number; + base_url?: string; +} + +interface IUIConfig { + home: IHomeConfig; + favicon?: string; + config: { paysite_list: string[]; artists_or_creators: string }; + matomo?: IMatomoConfig; + sidebar?: ISidebarConfig; + sidebar_items: unknown[]; + footer_items?: unknown[]; + banner?: IBannerConfig; + ads?: IAdsConfig; + files_url_prepend?: { + icons_base_url?: string; + banners_base_url?: string; + thumbnails_base_url?: string; + }; +} + +interface IMatomoConfig { + enabled: boolean; + /** + * b64-encoded string + */ + plain_code: string; + tracking_domain: string; + tracking_code: string; + site_id: string; +} + +interface ISidebarConfig { + disable_dms?: boolean; + disable_faq?: boolean; + disable_filehaus?: boolean; +} + +interface IBannerConfig { + /** + * b64-encoded string + */ + global?: string; + /** + * b64-encoded string + */ + announcement_global?: string; + /** + * b64-encoded string + */ + welcome?: string; +} + +interface IHomeConfig { + site_name?: string; + mascot_path?: string; + logo_path?: string; + /** + * b64-encoded string + */ + welcome_credits?: string; + home_background_image?: string; + announcements?: { title: string; date: string; content: string }[]; +} + +interface IAdsConfig { + /** + * b64-encoded string + */ + header: string; + /** + * b64-encoded string + */ + middle: string; + /** + * b64-encoded string + */ + footer: string; + /** + * b64-encoded string + */ + slider: string; + /** + * Base64-encoded JSON list of objects. + */ + video: string; +} + +interface IArchiveServerConfig { + enabled?: boolean; + file_serving_enabled?: boolean +} diff --git a/schema/public/api.yaml b/schema/public/api.yaml new file mode 100644 index 0000000..87fd959 --- /dev/null +++ b/schema/public/api.yaml @@ -0,0 +1,3329 @@ +openapi: 3.1.0 +info: + title: Kemono API + version: 1.3.0 + contact: + email: contact@kemono.party +servers: + - url: https://kemono.su/api + - url: https://coomer.su/api +tags: + - name: Posts + description: Version one + - name: Creators + - name: Comments + - name: Post Flagging + description: Flag post for re-import + - name: Discord + - name: Favorites + - name: File Search + - name: Misc +paths: + /v2/file/{file_hash}: + get: + description: Overview of the file. + parameters: + - name: file_hash + in: path + description: Hash of the file. + required: true + schema: + $ref: "#/components/schemas/hash-sha256" + responses: + '200': + description: Successfully retrieved file details. + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response-body-success" + - type: object + properties: + data: + $ref: "#/components/schemas/archive-info" + '400': + description: There are errors in parameters. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '404': + description: File does not exist. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + patch: + description: Add password to a file if needed + parameters: + - name: file_hash + in: path + description: Hash of the file. + required: true + schema: + $ref: "#/components/schemas/hash-sha256" + requestBody: + required: true + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/request-body-with-data" + - type: object + properties: + data: + type: object + required: + - password + additionalPropeties: false + properties: + password: + type: string + minLength: 1 + responses: + '200': + description: Successfully added a correct password. + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response-body-success" + - type: object + properties: + data: + description: Hash of the file which got updated. + $ref: "#/components/schemas/hash-sha256" + '400': + description: There are errors in parameters or the body. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + /v2/account/flags/post: + put: + description: Flag the post for reimport. + security: + - cookieAuth: [ ] + requestBody: + required: true + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/request-body-with-data" + - type: object + properties: + data: + type: object + required: + - service + - profile_id + - post_id + additionalPropeties: false + properties: + service: + type: string + profile_id: + type: string + post_id: + type: string + responses: + '201': + description: Successfully flagged the post. + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response-body-success" + - type: object + properties: + data: + type: object + description: Data of flagged post. + required: + - service + - profile_id + - post_id + properties: + service: + type: string + profile_id: + type: string + post_id: + type: string + '400': + description: Request body has errors. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '404': + description: Post doesn't exist. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '409': + description: Post is already flagged. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + /v2/account/administrator/accounts: + get: + description: Get account count. + security: + - cookieAuth: [ ] + parameters: + - name: name + in: query + description: Filter by name + schema: + type: string + - name: role + in: query + description: Filter by role + schema: + type: string + responses: + '200': + description: Successfully counted accounts. + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response-body-success" + - type: object + properties: + data: + $ref: "#/components/schemas/non-negative-integer" + '401': + description: User not logged in. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '404': + description: User is not administrator. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + /v2/account/administrator/accounts/{page}: + get: + description: Get accounts at page. + security: + - cookieAuth: [ ] + parameters: + - $ref: "#/components/parameters/path-page" + - name: name + in: query + description: Filter by name + schema: + type: string + - name: role + in: query + description: Filter by role + schema: + type: string + responses: + '200': + description: Successfully gotten accounts at page. + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response-body-success" + - type: object + properties: + data: + type: array + items: + $ref: "#/components/schemas/account" + '400': + description: There are errors in parameters. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '401': + description: User not logged in. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '404': + description: User is not administrator. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + /v2/account/administrator/account/{account_id}: + get: + description: Overview of target account. + security: + - cookieAuth: [ ] + parameters: + - name: account_id + in: path + description: ID of the account. + required: true + schema: + $ref: "#/components/schemas/positive-integer" + responses: + '200': + description: Successfully retrieved target account details. + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response-body-success" + - type: object + properties: + data: + $ref: "#/components/schemas/account" + '400': + description: There are errors in parameters. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '401': + description: User not logged in. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '404': + description: User is not administrator or account doesn't exist. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + patch: + description: Change target account details. + security: + - cookieAuth: [ ] + parameters: + - name: account_id + in: path + description: ID of the account. + required: true + schema: + $ref: "#/components/schemas/positive-integer" + requestBody: + required: true + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/request-body-with-data" + - type: object + properties: + data: + type: object + required: + - role + additionalPropeties: false + properties: + role: + type: string + responses: + '200': + description: Successfully changed target account details. + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/response-body-success" + - type: object + properties: + data: + description: ID of account which got updated. + $ref: "#/components/schemas/positive-integer" + '400': + description: There are errors in parameters or in the body. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '401': + description: Admin account is not logged in. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '404': + description: Admin account is not administrator or target account doesn't exist. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + '409': + description: Failed to update target account due to a conflict. + content: + application/json: + schema: + $ref: "#/components/schemas/response-body-error" + /v1/creators.txt: + get: + tags: + - Posts + summary: List All Creators + description: List all creators with details. I blame DDG for .txt. + responses: + '200': + description: List of all creators + content: + application/json: + schema: + type: array + items: + type: object + properties: + favorited: + type: integer + description: The number of times this creator has been favorited + id: + type: string + description: The ID of the creator + indexed: + type: number + description: Timestamp when the creator was indexed, Unix time as integer + name: + type: string + description: The name of the creator + service: + type: string + description: The service for the creator + updated: + type: number + description: Timestamp when the creator was last updated, Unix time as integer + example: + - favorited: 1 + id: '21101760' + indexed: 1672534800 + name: RAIGYO + service: fanbox + updated: 1672534800 + /v1/posts: + get: + tags: + - Posts + summary: List recent posts + description: List of recently imported posts + parameters: + - name: q + in: query + description: Search query + schema: + type: string + minLength: 3 + - name: o + in: query + description: Result offset, stepping of 50 is enforced + schema: + type: integer + - name: tag + in: query + description: A list of tags to filter by + schema: + type: array + items: + type: string + responses: + '200': + description: List of recently added posts + content: + application/json: + schema: + type: object + properties: + count: + type: integer + true_count: + type: integer + posts: + type: array + items: + type: object + properties: + id: + type: string + user: + type: string + service: + type: string + title: + type: string + content: + type: string + embed: + type: object + shared_file: + type: boolean + added: + type: string + format: date-time + published: + type: string + format: date-time + edited: + type: string + format: date-time + file: + type: object + properties: + name: + type: string + path: + type: string + attachments: + type: array + items: + type: object + properties: + name: + type: string + path: + type: string + example: + - id: '1836570' + user: '6570768' + service: fanbox + title: 今日はFANBOXを始まりました! + content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    + embed: { } + shared_file: false + added: '2021-03-30T18:00:05.973913' + published: '2021-01-24T17:54:38' + edited: '2021-01-24T18:46:15' + file: + name: a99d9674-5490-400e-acca-4bed99590699.jpg + path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg + attachments: [ ] + - id: '1836649' + user: '6570768' + service: fanbox + title: 忍ちゃん 脇コキ差分 + content: '' + embed: { } + shared_file: false + added: '2021-03-30T17:59:57.815397' + published: '2021-01-24T18:23:12' + edited: '2023-01-04T14:45:19' + file: + name: 4c5615f9-be74-4fa7-b88d-168fd37a2824.jpg + path: /d0/3c/d03c893927521536646619f5fb33426aa4b82dc12869865d6d666932755d9acd.jpg + attachments: + - name: 9cc982e4-1d94-4a1a-ac62-3dddd29f881c.png + path: /d7/4d/d74d1727f2c3fcf7a7cc2d244d677d93b4cc562a56904765e4e708523b34fb4c.png + - name: ab0e17d7-52e5-42c2-925b-5cfdb451df0c.png + path: /1b/67/1b677a8c0525e386bf2b2f013e36e29e4033feb2308798e4e5e3780da6c0e815.png + /v1/posts/random: + get: + description: Get a random post + responses: + '200': + description: A random post. + content: + application/json: + schema: + type: object + properties: + service: + type: string + artist_id: + type: string + post_id: + type: string + '404': + description: Not random psot found. + content: + application/json: + schema: + $ref: "#/components/schemas/error" + /v1/posts/popular: + get: + description: Get popular posts + parameters: + - name: date + in: query + description: Base date of the list + required: true + schema: + type: string + - name: period + in: query + description: Period scale of the list + required: true + schema: + enum: + - recent + - day + - week + - month + - $ref: "#/components/parameters/query-o" + + responses: + '200': + description: A list of popular posts. + content: + application/json: + schema: + type: object + properties: + info: + type: object + properties: + date: + type: string + min_date: + type: string + max_date: + type: string + navigation_dates: + type: object + propertyNames: + enum: + - recent + - day + - week + - month + additionalProperties: + type: array + prefixItems: + - type: string + - type: string + - type: string + range_desc: + type: string + scale: + enum: + - recent + - day + - week + - month + props: + type: object + properties: + currentPage: + const: popular_posts + today: + type: string + earliest_date_for_popular: + type: string + limit: + type: integer + count: + type: integer + results: + type: array + items: + $ref: "#/components/schemas/post-with-fav-count" + base: + type: object + additionalProperties: + type: string + result_previews: + type: array + items: + anyOf: + - type: object + properties: + type: + const: thumbnail + server: + type: string + name: + type: string + path: + type: string + - type: object + properties: + type: + const: embed + url: + type: string + subject: + type: string + description: + type: string + result_attachments: + type: array + items: + type: object + properties: + server: + type: string + name: + type: string + path: + type: string + result_is_image: + type: array + items: + type: boolean + /v1/posts/tags: + get: + description: Get tags + responses: + '200': + description: A list of post tags. + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + currentpage: + const: "tags" + tags: + type: array + items: + $ref: "#/components/schemas/tag" + /v1/{service}/post/{post_id}: + get: + description: Get a post by ID + parameters: + - $ref: "#/components/parameters/path-service" + - $ref: "#/components/parameters/path-post-id" + responses: + '200': + description: Post data. + content: + application/json: + schema: + type: object + properties: + service: + type: string + artist_id: + type: string + post_id: + type: string + '404': + description: No post found + content: + application/json: + schema: + $ref: "#/components/schemas/error" + /v1/{service}/user/{creator_id}/profile: + get: + summary: Get a creator + tags: + - Creators + parameters: + - name: service + in: path + description: The service where the creator is located + required: true + schema: + type: string + - name: creator_id + in: path + description: The ID of the creator + required: true + schema: + type: string + responses: + '200': + description: Creator details retrieved successfully + content: + application/json: + schema: + type: object + properties: + id: + type: string + description: The ID of the creator + public_id: + type: + - string + - null + description: The public ID of the creator + service: + type: string + description: The service where the creator is located + name: + type: string + description: The creator's display name + indexed: + type: string + format: date-time + description: The time the creator was last indexed + updated: + type: string + format: date-time + description: The time the creator was last updated + '404': + description: The creator could not be found + content: + application/json: + schema: + type: object + properties: + error: + type: string + description: The error message + enum: ["Creator not found."] + /v1/{service}/user/{creator_id}: + get: + summary: Get a list of creator posts + tags: + - Posts + parameters: + - name: service + in: path + description: The service where the post is located + required: true + schema: + type: string + - name: creator_id + in: path + description: The ID of the creator + required: true + schema: + type: string + - name: q + in: query + description: Search query + schema: + type: string + minLength: 3 + - name: o + in: query + description: Result offset, stepping of 50 is enforced + schema: + type: integer + responses: + '200': + description: Post details retrieved successfully + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + user: + type: string + service: + type: string + title: + type: string + content: + type: string + embed: + type: object + shared_file: + type: boolean + added: + type: string + format: date-time + published: + type: string + format: date-time + edited: + type: string + format: date-time + file: + type: object + properties: + name: + type: string + path: + type: string + attachments: + type: array + items: + type: object + properties: + name: + type: string + path: + type: string + example: + - id: '1836570' + user: '6570768' + service: fanbox + title: 今日はFANBOXを始まりました! + content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    + embed: { } + shared_file: false + added: '2021-03-30T18:00:05.973913' + published: '2021-01-24T17:54:38' + edited: '2021-01-24T18:46:15' + file: + name: a99d9674-5490-400e-acca-4bed99590699.jpg + path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg + attachments: [ ] + - id: '1836649' + user: '6570768' + service: fanbox + title: 忍ちゃん 脇コキ差分 + content: '' + embed: { } + shared_file: false + added: '2021-03-30T17:59:57.815397' + published: '2021-01-24T18:23:12' + edited: '2023-01-04T14:45:19' + file: + name: 4c5615f9-be74-4fa7-b88d-168fd37a2824.jpg + path: /d0/3c/d03c893927521536646619f5fb33426aa4b82dc12869865d6d666932755d9acd.jpg + attachments: + - name: 9cc982e4-1d94-4a1a-ac62-3dddd29f881c.png + path: /d7/4d/d74d1727f2c3fcf7a7cc2d244d677d93b4cc562a56904765e4e708523b34fb4c.png + - name: ab0e17d7-52e5-42c2-925b-5cfdb451df0c.png + path: /1b/67/1b677a8c0525e386bf2b2f013e36e29e4033feb2308798e4e5e3780da6c0e815.png + '400': + description: Offset provided which is not a multiple of 50 + '404': + description: The creator could not be found + content: + application/json: + schema: + type: object + properties: + error: + type: string + description: The error message + enum: ["Creator not found."] + /v1/{service}/user/{creator_id}/announcements: + get: + summary: Get creator announcements + tags: + - Posts + parameters: + - name: service + in: path + required: true + description: The service name + schema: + type: string + - name: creator_id + in: path + required: true + description: The creator's ID + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: array + items: + type: object + properties: + service: + type: string + user_id: + type: string + hash: + type: string + description: sha256 + content: + type: string + added: + type: string + format: date-time + description: isoformat UTC + example: + - service: patreon + user_id: '8693043' + hash: 820b7397c7f75efb13c4a8aa5d4aacfbb200749f3e1cec16e9f2951d158be8c2 + content: Hey guys, thank you so much for your support, that means a lot to me! + added: '2023-01-31T05:16:15.462035' + '404': + description: Artist not found + /v1/{service}/user/{creator_id}/fancards: + get: + summary: Get fancards by creator, fanbox only + tags: + - Posts + parameters: + - name: service + in: path + required: true + description: The service name, has to be "fanbox" + schema: + type: string + - name: creator_id + in: path + required: true + description: The creator's ID + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: integer + user_id: + type: string + file_id: + type: integer + hash: + type: string + mtime: + type: string + format: date-time + ctime: + type: string + format: date-time + mime: + type: string + ext: + type: string + added: + type: string + format: date-time + size: + type: integer + ihash: + type: string + path: + type: string + server: + type: string + example: + - id: 108058645 + user_id: '3316400' + file_id: 108058645 + hash: 727bf3f0d774a98c80cf6c76c3fb0e049522b88eb7f02c8d3fc59bae20439fcf + mtime: '2023-05-23T15:09:43.941195' + ctime: '2023-05-23T15:09:43.941195' + mime: image/jpeg + ext: .jpg + added: '2023-05-23T15:09:43.960578' + size: 339710 + ihash: null + - id: 103286760 + user_id: '3316400' + file_id: 103286760 + hash: 8b0d0f1be38efab9306b32c7b14b74ddd92a2513026c859a280fe737980a467d + mtime: '2023-04-26T14:16:53.205183' + ctime: '2023-04-26T14:16:53.205183' + mime: image/jpeg + ext: .jpg + added: '2023-04-26T14:16:53.289143' + size: 339764 + ihash: null + '404': + description: Artist not found + /v1/{service}/user/{creator_id}/links: + get: + summary: Get a creator's linked accounts + tags: + - Creators + parameters: + - name: service + in: path + description: The service where the creator is located + required: true + schema: + type: string + - name: creator_id + in: path + description: The ID of the creator + required: true + schema: + type: string + responses: + '200': + description: Linked accounts retrieved successfully + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + description: The ID of the creator + public_id: + type: + - string + - null + description: The public ID of the creator + service: + type: string + description: The service where the creator is located + name: + type: string + description: The creator's display name + indexed: + type: string + format: date-time + description: The time the creator was last indexed + updated: + type: string + format: date-time + description: The time the creator was last updated + '404': + description: The creator could not be found + content: + application/json: + schema: + type: object + properties: + error: + type: string + description: The error message + enum: ["Creator not found."] + delete: + description: Remove artist from linked accounts. Requires admin privilegies. + parameters: + - $ref: "#/components/parameters/path-service" + - $ref: "#/components/parameters/path-creator-id" + responses: + '204': + description: Artist's link was successfuly removed. + content: + plain/text: + schema: + const: "" + '404': + description: Insufficient privilegies. + content: + plain/text: + schema: + const: "" + /v1/{service}/user/{creator_id}/links/new: + get: + description: Add links to the artist + parameters: + - $ref: "#/components/parameters/path-service" + - $ref: "#/components/parameters/path-creator-id" + responses: + '200': + description: The data for the new link. + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + id: + type: string + service: + type: string + artist: + $ref: "#/components/schemas/artist" + share_count: + $ref: "#/components/schemas/non-negative-integer" + dm_count: + $ref: "#/components/schemas/non-negative-integer" + has_links: + enum: + - ✔️ + - "0" + display_data: + type: object + properties: + service: + type: string + href: + type: string + base: + type: object + properties: + service: + type: string + artist_id: + type: string + post: + description: Add links to the artist + parameters: + - $ref: "#/components/parameters/path-service" + - $ref: "#/components/parameters/path-creator-id" + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - service + - artist_id + properties: + service: + type: string + artist_id: + type: string + reason: + type: string + maxLength: 140 + responses: + '200': + description: The link request added to moderation queue. + content: + application/json: + schema: + type: object + properties: + message: + type: string + props: + type: object + properties: + id: + type: string + service: + type: string + artist: + $ref: "#/components/schemas/artist" + share_count: + $ref: "#/components/schemas/non-negative-integer" + has_links: + enum: + - ✔️ + - "0" + display_data: + type: object + properties: + service: + type: string + href: + type: string + '400': + description: Failed to added the new link due to input errors. + content: + application/json: + schema: + type: object + properties: + error: + type: text + /v1/{service}/user/{creator_id}/tags: + get: + description: Tags of profile + tags: + - Creators + parameters: + - $ref: "#/components/parameters/path-service" + - $ref: "#/components/parameters/path-creator-id" + responses: + '200': + description: Found the tags for the profile + content: + application/json: + schema: + type: object + properties: + props: + display_data: + type: object + properties: + service: string + href: string + artist: + $ref: "#/components/schemas/artist" + service: + type: string + id: + type: string + share_count: + type: integer + dm_count: + type: integer + has_links: + # gr8 API design + enum: + - ✔️ + - "0" + tags: + type: array + items: + $ref: "#/components/schemas/tag" + service: + type: string + artist: + $ref: "#/components/schemas/artist" + /v1/{service}/user/{creator_id}/shares: + get: + description: Shares of the artist + parameters: + - $ref: "#/components/parameters/path-service" + - $ref: "#/components/parameters/path-creator-id" + - $ref: "#/components/parameters/query-o" + responses: + '200': + description: Found the shares for the artist + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: "#/components/schemas/share" + props: + display_data: + type: object + properties: + service: + type: string + href: + type: string + service: + type: string + artist: + $ref: "#/components/schemas/artist" + id: + type: string + dm_count: + type: integer + share_count: + type: integer + has_links: + enum: + - ✔️ + - "0" + base: + type: object + properties: + service: + type: string + artist_id: + type: string + /v1/{service}/user/{creator_id}/dms: + get: + description: Direct messages of profile + parameters: + - $ref: "#/components/parameters/path-service" + - $ref: "#/components/parameters/path-creator-id" + responses: + '200': + description: Found direct messages for the profile + content: + application/json: + schema: + type: object + properties: + props: + id: + type: string + service: + type: string + artist: + $ref: "#/components/schemas/artist" + display_data: + type: object + properties: + service: + type: string + href: + type: string + share_count: + type: integer + dm_count: + type: integer + dms: + type: array + items: + $ref: "#/components/schemas/approved-dm" + has_links: + enum: + - ✔️ + - "0" + /v1/{service}/user/{creator_id}/posts-legacy: + get: + description: A duct-tape endpoint which also returns count for pagination component. + parameters: + - name: service + in: path + required: true + description: The service name + schema: + type: string + - name: creator_id + in: path + required: true + description: The profiles's ID + schema: + type: string + - name: tag + in: query + description: A list of post tags + schema: + type: array + responses: + '200': + description: Found posts of the profile + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + currentPage: + const: posts + id: + type: string + service: + type: string + name: + type: string + count: + type: integer + limit: + type: integer + artist: + $ref: "#/components/schemas/artist" + display_data: + type: object + properties: + service: + type: string + href: + type: string + dm_count: + type: integer + share_count: + type: integer + has_links: + type: string + base: + type: object + results: + type: array + items: + $ref: "#/components/schemas/post" + result_previews: + type: array + items: + type: object + result_attachments: + type: array + items: + type: object + result_is_image: + type: array + items: + type: boolean + disable_service_icons: + const: true + /v1/{service}/user/{creator_id}/post/{post_id}: + get: + summary: Get a specific post + tags: + - Posts + parameters: + - name: service + in: path + required: true + description: The service name + schema: + type: string + - name: creator_id + in: path + required: true + description: The creator's ID + schema: + type: string + - name: post_id + in: path + required: true + description: The post ID + schema: + type: string + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + properties: + post: + type: object + properties: + id: + type: string + user: + type: string + service: + type: string + title: + type: string + content: + type: string + embed: + type: object + shared_file: + type: boolean + added: + type: string + format: date-time + published: + type: string + format: date-time + edited: + type: string + format: date-time + file: + type: object + properties: + name: + type: string + path: + type: string + attachments: + type: array + items: + type: object + properties: + name: + type: string + path: + type: string + next: + type: string + prev: + type: string + attachments: + type: array + previews: + type: array + videos: + type: array + props: + type: object + properties: + service: + type: string + flagged: + type: integer + revisions: + type: array + items: + $ref: "#/components/schemas/post-revision" + example: + post: + id: '1836570' + user: '6570768' + service: fanbox + title: 今日はFANBOXを始まりました! + content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    + embed: { } + shared_file: false + added: '2021-03-30T18:00:05.973913' + published: '2021-01-24T17:54:38' + edited: '2021-01-24T18:46:15' + file: + name: a99d9674-5490-400e-acca-4bed99590699.jpg + path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg + attachments: [ ] + next: null + prev: '1836649' + '404': + description: Post not found + /v1/{service}/user/{creator_id}/post/{post_id}/revision/{revision_id}: + get: + description: Get revision of a post + parameters: + - $ref: "#/components/parameters/path-service" + - $ref: "#/components/parameters/path-creator-id" + - $ref: "#/components/parameters/path-post-id" + - name: revision_id + in: path + description: ID of the revision + required: true + schema: + type: string + responses: + '200': + description: A revision of the post. + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + currentPage: + const: revisions + service: + type: string + artist: + $ref: "#/components/schemas/artist" + flagged: + $ref: "#/components/schemas/non-negative-integer" + revisions: + type: array + items: + $ref: "#/components/schemas/post-revision" + post: + $ref: "#/components/schemas/post-revision" + comments: + type: array + items: + $ref: "#/components/schemas/comment" + result_previews: + type: array + result_attachments: + type: array + videos: + type: array + archives_enabled: + type: boolean + '404': + description: Failed to find the revision of the post. + content: + application/json: + schema: + $ref: "#/components/schemas/error" + /v1/discord/channel/{channel_id}: + get: + tags: + - Discord + summary: Get Discord channel posts by offset + parameters: + - name: channel_id + in: path + description: ID of the Discord channel + required: true + schema: + type: string + - name: o + in: query + description: Result offset, stepping of 150 is enforced + schema: + type: integer + responses: + '200': + description: Discord channel found + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + author: + type: object + properties: + id: + type: string + avatar: + type: string + username: + type: string + public_flags: + type: integer + discriminator: + type: string + server: + type: string + channel: + type: string + content: + type: string + added: + type: string + format: date-time + published: + type: string + format: date-time + edited: + type: string + format: date-time + embeds: + type: array + items: { } + mentions: + type: array + items: { } + attachments: + type: array + items: + type: object + properties: + name: + type: string + path: + type: string + example: + - id: '942909658610413578' + author: + id: '421590382300889088' + avatar: 0956f3dc18eba7da9daedc4e50fb96d0 + username: Merry + public_flags: 0 + discriminator: '7849' + server: '455285536341491714' + channel: '455287420959850496' + content: '@everyone Happy Valentine’s Day! 💜✨' + added: '2022-02-15T01:26:12.708959' + published: '2022-02-14T22:26:21.027000' + edited: null + embeds: [ ] + mentions: [ ] + attachments: [ ] + - id: '942909571947712594' + author: + id: '421590382300889088' + avatar: 0956f3dc18eba7da9daedc4e50fb96d0 + username: Merry + public_flags: 0 + discriminator: '7849' + server: '455285536341491714' + channel: '455287420959850496' + content: '' + added: '2022-02-15T01:26:13.006228' + published: '2022-02-14T22:26:00.365000' + edited: null + embeds: [ ] + mentions: [ ] + attachments: + - name: sofa_03.png + path: /3b/4e/3b4ed5aabdd85b26fbbc3ee9b0e5649df69167efe26b5abc24cc2a1159f446d4.png + '404': + description: Discord channel not found + /v1/discord/channel/lookup/{discord_server}: + get: + tags: + - Discord + summary: Lookup Discord channels + parameters: + - name: discord_server + in: path + description: Discord Server ID + required: true + schema: + type: string + responses: + '200': + description: Discord channels found + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + name: + type: string + example: + - id: '455285536341491716' + name: news + - id: '455287420959850496' + name: nyarla-lewds + '404': + description: Discord server not found + /v1/authentication/register: + post: + description: Register an account + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + username: + type: string + password: + type: string + confirm_password: + type: string + favorites_json: + type: string + responses: + '200': + description: Successfully registered. + content: + application/json: + schema: + const: true + '400': + description: Failed to register due to user errors. + content: + application/json: + schema: + $ref: "#/components/schemas/error" + /v1/authentication/login: + post: + description: Sign in to account + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + username: + type: string + password: + type: string + responses: + '200': + description: Succefully logged in. + content: + application/json: + schema: + $ref: "#/components/schemas/account" + '400': + description: Failed to log in due to user errors. + content: + application/json: + schema: + $ref: "#/components/schemas/error" + '409': + description: Already logged in. + content: + application/json: + schema: + $ref: "#/components/schemas/error" + /v1/authentication/logout: + post: + description: Logout from account + responses: + '200': + description: Succefuuly logged out from account. + content: + application/json: + schema: + const: true + /v1/account: + get: + description: Get account data + security: + - cookieAuth: [ ] + responses: + '200': + description: Account data. + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + currentPage: + const: account + title: + const: Your account page + account: + $ref: "#/components/schemas/account" + notifications_count: + $ref: "#/components/schemas/non-negative-integer" + /v1/account/change_password: + post: + description: Change account password + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - current-password + - new-password + - new-password-confirmation + properties: + current-password: + type: string + new-password: + type: string + new-password-confirmation: + type: string + responses: + '200': + description: Successfully changed account password. + content: + application/json: + schema: + const: true + /v1/account/notifications: + get: + description: Get account notifications + security: + - cookieAuth: [ ] + responses: + '200': + description: A list of account notifications. + content: + application/json: + schema: + type: object + properties: + currentPage: + const: account + notifications: + type: array + items: + $ref: "#/components/schemas/notification" + /v1/account/keys: + get: + description: Get account autoimport keys + security: + - cookieAuth: [ ] + responses: + '200': + description: A list of account keys. + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + currentPage: + const: account + title: + const: Your service keys + service_keys: + type: array + items: + $ref: "#/components/schemas/service-key" + import_ids: + type: array + items: + type: object + properties: + key_id: + type: string + import_id: + type: string + post: + security: + - cookieAuth: [ ] + description: Revoke account autoimport keys + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + revoke: + type: array + items: + $ref: "#/components/schemas/positive-integer" + responses: + '200': + description: Account import keys revoked. + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + currentPage: + const: account + redirect: + const: /account/keys + message: + const: "Success!" + /v1/account/favorites: + get: + tags: + - Favorites + security: + - cookieAuth: [ ] + summary: List Account Favorites + description: List account favorites (posts or creators) for the authenticated user (cookie session) + parameters: + - name: type + in: query + description: Type of favorites to list (post or creator (artist) ) + schema: + type: string + enum: + - post + - artist + responses: + '200': + description: List of account favorites + content: + application/json: + schema: + type: array + items: + type: object + properties: + faved_seq: + type: integer + description: The sequence number of the favorite + id: + type: string + description: The ID of the favorite (post or creator) + indexed: + type: string + description: Timestamp when the creator was indexed isoformat + last_imported: + type: string + description: Timestamp when the creator was last imported + name: + type: string + description: The name of the creator + service: + type: string + description: The service where the creator is located + updated: + type: string + description: Timestamp when the creator was last updated + '401': + $ref: '#/components/schemas/401' + /v1/account/posts/upload: + get: + description: Upload posts. + security: + - cookieAuth: [ ] + responses: + '200': + description: Upload posts maybe??? + content: + application/json: + schema: + type: object + properties: + currentPage: + const: posts + /v1/account/review_dms: + get: + description: Get DMs for review. + security: + - cookieAuth: [ ] + parameters: + - name: status + in: query + description: Status of the DM. + schema: + enum: + - ignored + - pending + responses: + '200': + description: A list of unapproved DMs. + content: + application/json: + schema: + type: object + properties: + currentPage: + const: import + account_id: + $ref: "#/components/schemas/positive-integer" + dms: + type: array + items: + $ref: "#/components/schemas/unapproved-dm" + status: + enum: + - ignored + - pending + post: + description: Approve DMs. + security: + - cookieAuth: [ ] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + approved_hashes: + type: array + items: + type: string + delete_ignored: + type: boolean + responses: + '200': + description: Approved DMs. + content: + application/json: + schema: + const: true + /v1/account/moderator/tasks/creator_links: + get: + security: + - cookieAuth: [ ] + description: Get a list of pending artist link requests + responses: + '200': + description: A list of pending artist link requests. + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/unapproved-link" + /v1/account/moderator/creator_link_requests/{request_id}/approve: + post: + security: + - cookieAuth: [ ] + description: Approve a new artist link. + responses: + '200': + description: Successfully approved a new artist link. + content: + application/json: + schema: + type: object + properties: + response: + const: approved + /v1/account/moderator/creator_link_requests/{request_id}/reject: + post: + security: + - cookieAuth: [ ] + description: Reject a new artist link. + responses: + '200': + description: Successfully rejected a new artist link. + content: + application/json: + schema: + type: object + properties: + response: + const: rejected + /v1/favorites/post/{service}/{creator_id}/{post_id}: + post: + tags: + - Favorites + security: + - cookieAuth: [ ] + summary: Add Favorite Post + description: Add a post to the user's favorite posts + parameters: + - name: service + in: path + description: Service of the post + required: true + schema: + type: string + - name: creator_id + in: path + description: The ID of the creator + required: true + schema: + type: string + - name: post_id + in: path + description: The ID of the post + required: true + schema: + type: string + responses: + '200': + description: Favorite post added successfully + content: { } + '302': + description: Redirect to login if not authenticated + content: { } + '401': + $ref: '#/components/schemas/401' + delete: + tags: + - Favorites + security: + - cookieAuth: [ ] + summary: Remove Favorite Post + description: Remove a post from the user's favorite posts + parameters: + - name: service + in: path + description: The service where the post is located + required: true + schema: + type: string + - name: creator_id + in: path + description: The ID of the creator + required: true + schema: + type: string + - name: post_id + in: path + description: The ID of the post + required: true + schema: + type: string + responses: + '200': + description: Unfavorite post removed successfully + content: { } + '302': + description: Redirect to login if not authenticated + content: { } + '401': + $ref: '#/components/schemas/401' + /v1/favorites/creator/{service}/{creator_id}: + post: + tags: + - Favorites + security: + - cookieAuth: [ ] + summary: Add Favorite creator + description: Add an creator to the user's favorite creators + parameters: + - name: service + in: path + description: The service where the creator is located + required: true + schema: + type: string + - name: creator_id + in: path + description: The ID of the creator + required: true + schema: + type: string + responses: + '200': + description: Favorite creator added successfully + content: { } + '302': + description: Redirect to login if not authenticated + content: { } + '401': + $ref: '#/components/schemas/401' + delete: + tags: + - Favorites + security: + - cookieAuth: [ ] + summary: Remove Favorite Creator + description: Remove an creator from the user's favorite creators + parameters: + - name: service + in: path + description: The service where the creator is located + required: true + schema: + type: string + - name: creator_id + in: path + description: The ID of the creator + required: true + schema: + type: string + responses: + '200': + description: Favorite creator removed successfully + content: { } + '302': + description: Redirect to login if not authenticated + content: { } + '401': + $ref: '#/components/schemas/401' + /v1/search_hash/{file_hash}: + get: + tags: + - File Search + summary: Lookup file by hash + parameters: + - name: file_hash + in: path + required: true + description: SHA-2 / SHA-256 + schema: + type: string + format: hex + minLength: 64 + maxLength: 64 + responses: + '200': + description: File found + content: + application/json: + schema: + type: object + properties: + id: + type: integer + hash: + type: string + mtime: + type: string + format: date-time + ctime: + type: string + format: date-time + mime: + type: string + ext: + type: string + added: + type: string + format: date-time + size: + type: integer + ihash: + type: string + posts: + type: array + items: + type: object + properties: + file_id: + type: integer + id: + type: string + user: + type: string + service: + type: string + title: + type: string + substring: + type: string + published: + type: string + format: date-time + file: + type: object + properties: + name: + type: string + path: + type: string + attachments: + type: array + items: + type: object + properties: + name: + type: string + path: + type: string + discord_posts: + type: array + items: + type: object + properties: + file_id: + type: integer + id: + type: string + server: + type: string + channel: + type: string + substring: + type: string + published: + type: string + format: date-time + embeds: + type: array + items: { } + mentions: + type: array + items: { } + attachments: + type: array + items: + type: object + properties: + name: + type: string + path: + type: string + example: + id: 40694581 + hash: b926020cf035af45a1351e0a7e2c983ebcc93b4c751998321a6593a98277cdeb + mtime: '2021-12-04T07:16:09.385539' + ctime: '2021-12-04T07:16:09.385539' + mime: image/png + ext: .png + added: '2021-12-04T07:16:09.443016' + size: 10869921 + ihash: null + posts: + - file_id: 108400151 + id: '5956097' + user: '21101760' + service: fanbox + title: Loli Bae + substring: |- + Thank you for your continued support! + いつも支援ありがとうご + published: '2023-05-14T00:00:00' + file: + name: 8f183dac-470d-4587-9657-23efe8890a7b.jpg + path: /e5/1f/e51fc831dfdac7a21cc650ad46af59340e35e2a051aed8c1e65633592f4dc11c.jpg + attachments: + - name: b644eb9c-cffa-400e-9bd6-40cccb2331ba.png + path: /5e/b3/5eb3197668ac23bd7c473d3c750334eb206b060c610e4ac5fa1a9370fd1314d9.png + - name: 17f295ba-a9f2-4034-aafc-bf74904ec144.png + path: /88/ad/88ad2ba77c89e4d7a9dbe1f9531ba3e3077a82aee2b61efa29fda122ebe1b516.png + discord_posts: + - file_id: 40694581 + id: '769704201495904286' + server: '455285536341491714' + channel: '769703874356445216' + substring: '' + published: '2020-10-24T23:29:42.049' + embeds: [ ] + mentions: [ ] + attachments: + - name: 3.png + path: /b9/26/b926020cf035af45a1351e0a7e2c983ebcc93b4c751998321a6593a98277cdeb.png + '404': + description: File not found + /v1/{service}/user/{creator_id}/post/{post}/flag: + post: + tags: + - Post Flagging + summary: Flag a post + parameters: + - name: service + in: path + required: true + schema: + type: string + - name: creator_id + in: path + required: true + schema: + type: string + - name: post + in: path + required: true + schema: + type: string + responses: + '201': + description: Flagged successfully + content: + application/json: + schema: + const: true + '409': + description: Already flagged + content: + application/json: + schema: + const: true + get: + tags: + - Post Flagging + summary: Check if a Post is flagged + description: Check if a Post is flagged + parameters: + - name: service + in: path + description: The service where the post is located + required: true + schema: + type: string + - name: creator_id + in: path + description: The creator of the post + required: true + schema: + type: string + - name: post + in: path + description: The ID of the post to flag + required: true + schema: + type: string + responses: + '200': + description: The post is flagged + content: { } + '404': + description: The post has no flag + content: { } + /v1/{service}/user/{creator_id}/post/{post_id}/revisions: + get: + tags: + - Posts + summary: List a Post's Revisions + description: List revisions of a specific post by service, creator_id, and post_id + parameters: + - name: service + in: path + description: The service where the post is located + required: true + schema: + type: string + - name: creator_id + in: path + description: The ID of the creator + required: true + schema: + type: string + - name: post_id + in: path + description: The ID of the post + required: true + schema: + type: string + responses: + '200': + description: List of post revisions + content: + application/json: + schema: + type: array + items: + type: object + properties: + revision_id: + type: integer + id: + type: string + user: + type: string + service: + type: string + title: + type: string + content: + type: string + embed: + type: object + shared_file: + type: boolean + added: + type: string + format: date-time + published: + type: string + format: date-time + edited: + type: string + format: date-time + file: + type: object + properties: + name: + type: string + path: + type: string + attachments: + type: array + items: + type: object + properties: + name: + type: string + path: + type: string + example: + - revision_id: 8059287 + id: '1836570' + user: '6570768' + service: fanbox + title: 今日はFANBOXを始まりました! + content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    + embed: { } + shared_file: false + added: '2023-09-19T13:19:57.416086' + published: '2021-01-24T17:54:38' + edited: '2021-01-24T18:46:15' + file: + name: 8c2be0fd-a130-4afb-9314-80f2501d94f7.jpg + path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg + attachments: + - name: attachment1.jpg + path: /attachments/attachment1.jpg + - name: attachment2.jpg + path: /attachments/attachment2.jpg + - revision_id: 6770513 + id: '1836570' + user: '6570768' + service: fanbox + title: 今日はFANBOXを始まりました! + content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    + embed: { } + shared_file: false + added: '2023-07-28T23:51:25.477291' + published: '2021-01-24T17:54:38' + edited: '2021-01-24T18:46:15' + file: + name: 0d133e49-a2d4-4733-9044-dd57e25b1fce.jpg + path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg + attachments: + - name: attachment3.jpg + path: /attachments/attachment3.jpg + - name: attachment4.jpg + path: /attachments/attachment4.jpg + '404': + description: Post not found + /v1/{service}/user/{creator_id}/post/{post_id}/comments: + get: + tags: + - Comments + summary: List a post's comments + description: List comments for a specific post by service, creator_id, and post_id. + parameters: + - name: service + in: path + description: The post's service. + required: true + schema: + type: string + - name: creator_id + in: path + description: The service ID of the post's creator. + required: true + schema: + type: string + - name: post_id + in: path + description: The service ID of the post. + required: true + schema: + type: string + responses: + '200': + description: List of post comments. + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + parent_id: + type: string + - string + - null + commenter: + type: string + content: + type: string + published: + type: string + format: date-time + revisions: + type: array + items: + type: object + properties: + id: + type: integer + content: + type: string + added: + type: string + format: date-time + example: + - id: "121508687" + parent_id: null + commenter: "84534108" + content: "YOU DREW MORE YAYYYY" + published: "2023-11-05T20:17:47.635000" + revisions: + - id: 1 + content: "YOU DREW MORE YAYYYY2222222" + added: "2023-11-14T03:09:12.275975" + '404': + description: No comments found. + /v1/artists/random: + get: + description: Get a random artist + responses: + '200': + description: A random artist. + content: + application/json: + schema: + type: object + properties: + service: + type: string + artist_id: + type: string + '404': + description: No random artst exists. + content: + application/json: + schema: + $ref: "#/components/schemas/error" + /v1/shares: + get: + description: Get a list of shares + parameters: + - name: o + in: query + description: List's offset + schema: + $ref: "#/components/schemas/non-negative-integer" + responses: + '200': + description: A list of shares. + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + currentPage: + const: shares + count: + $ref: "#/components/schemas/non-negative-integer" + shares: + type: array + items: + $ref: "#/components/schemas/share" + limit: + $ref: "#/components/schemas/non-negative-integer" + base: + type: object + /v1/share/{share_id}: + get: + description: Get details of the share. + parameters: + - name: share_id + in: path + description: ID of the share. + required: true + schema: + type: string + responses: + '200': + description: Details of the share. + content: + application/json: + schema: + type: object + properties: + share_files: + type: array + share: + $ref: "#/components/schemas/share" + base: + type: object + /v1/dms: + get: + description: Get a list of DMs. + parameters: + - name: o + in: query + description: List's offset + schema: + $ref: "#/components/schemas/non-negative-integer" + - name: q + in: query + description: Search query + schema: + type: string + responses: + '200': + description: A list of DMs. + content: + application/json: + schema: + type: object + properties: + props: + type: object + properties: + currentPage: + const: artists + count: + $ref: "#/components/schemas/non-negative-integer" + limit: + $ref: "#/components/schemas/non-negative-integer" + dms: + type: array + items: + $ref: "#/components/schemas/approved-dm" + base: + type: object + properties: + q: + type: string + /v1/has_pending_dms: + get: + description: Check if there are pending DMs. + responses: + '200': + description: There are pending DMs. + content: + application/json: + schema: + type: boolean + /v1/app_version: + get: + tags: + - Misc + summary: Git Commit Hash + description: Show current App commit hash + responses: + '200': + description: Commit Hash + content: + text/plain: + schema: + type: string + format: hex + minLength: 40 + maxLength: 40 + examples: + - 3b9cd5fab1d35316436968fe85c90ff2de0cdca0 + /v1/importer/submit: + post: + description: Create a site import + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + session_key: + type: string + auto_import: + type: string + save_session_key: + type: string + save_dms: + type: string + channel_ids: + type: string + x-bc: + type: string + auth_id: + type: string + user_agent: + type: string + responses: + '200': + description: Succesfully added new import + content: + application/json: + schema: + type: object + properties: + import_id: + type: string + /v1/importer/logs/{import_id}: + get: + responses: + '200': + description: Get import logs + content: + application/json: + schema: + type: array +components: + parameters: + path-service: + name: service + in: path + description: The service where the creator is located + required: true + schema: + type: string + path-creator-id: + name: creator_id + in: path + description: ID of the creator + required: true + schema: + type: string + path-post-id: + name: post_id + in: path + description: ID of the post + required: true + schema: + type: string + path-page: + name: page + in: path + description: Page of the collection. + required: true + schema: + $ref: "#/components/schemas/positive-integer" + query-q: + name: q + in: query + description: Search query + schema: + type: string + minLength: 3 + query-o: + name: o + in: query + description: Result offset, stepping of 50 is enforced + schema: + type: integer + securitySchemes: + cookieAuth: + description: Session key that can be found in cookies after a successful login + type: apiKey + in: cookie + name: session + schemas: + request-body: + title: RequestBody + description: Body of the request to V2 API. Must always be present on methods which allow a body. + type: object + additionalProperties: false + required: + - type + properties: + type: + const: Sneed's Feed & Seed (formerly Chuck's) + request-body-with-data: + title: RequestBodyWithData + description: Body of the request with extra data to V2 API. + type: object + additionalProperties: false + required: + - type + - data + properties: + type: + const: Sneed's Feed & Seed (formerly Chuck's) + data: true + response-body-success: + title: ResponseBodySuccess + description: Body of the successful response from V2 API. + type: object + additionalProperties: false + required: + - type + - data + properties: + type: + const: Chuck's Fuck & Suck (formerly Boyle's) + data: true + response-body-error: + title: ResponseBodyError + description: Body of the error response from V2 API. + type: object + additionalProperties: false + required: + - type + - data + properties: + type: + const: Boyle's Foil & Soil (formerly Sneed's) + error: + type: object + additionalProperties: false + required: + - type + properties: + type: + type: string + message: + type: string + error: + title: Error + description: Error message + type: object + properties: + error: + type: string + '401': + title: Unauthorized + description: Unauthorized Access + non-negative-integer: + title: NonNegativeInteger + description: Integer which cannot be below zero. + type: integer + minimum: 0 + positive-integer: + title: PositiveInteger + description: Integer which is always above zero. + type: integer + minimum: 1 + hash-sha256: + title: HashSHA256 + type: string + minLength: 64 + maxLength: 64 + artist: + title: Artist + type: object + properties: + id: + type: string + name: + type: string + service: + type: string + indexed: + type: string + updated: + type: string + public_id: + type: string + relation_id: + type: integer + tag: + title: Tag + type: object + properties: + tag: + type: string + post_count: + type: integer + share: + title: Share + type: object + properties: + id: + type: integer + name: + type: string + description: + type: string + uploader: + type: integer + added: + type: string + approved-dm: + title: ApprovedDM + description: The public visible DM. + type: object + required: + - hash + - user + - service + - content + - embed + - file + - added + - published + properties: + hash: + type: string + user: + type: string + service: + type: string + content: + type: string + embed: + type: object + file: + type: object + added: + type: string + published: + type: string + artist: + $ref: "#/components/schemas/artist" + unapproved-dm: + title: UnapprovedDM + description: The DM which is shown to the importing user. + type: object + properties: + hash: + type: string + user: + type: string + artist: + type: object + import_id: + type: string + contributor_id: + type: string + service: + type: string + content: + type: string + embed: + type: object + file: + type: object + added: + type: string + published: + type: string + post: + title: Post + type: object + properties: + id: + type: string + user: + type: string + service: + type: string + title: + type: string + content: + type: string + embed: + type: object + shared_file: + type: boolean + added: + type: string + published: + type: string + edited: + type: string + file: + type: object + attachments: + type: array + items: + type: object + post-with-fav-count: + title: Post + type: object + properties: + id: + type: string + user: + type: string + service: + type: string + title: + type: string + content: + type: string + embed: + type: object + shared_file: + type: boolean + added: + type: string + published: + type: string + edited: + type: string + file: + type: object + attachments: + type: array + items: + type: object + fav_count: + type: integer + post-revision: + title: PostRevision + type: object + properties: + revision_id: + $ref: "#/components/schemas/positive-integer" + id: + type: string + user: + type: string + service: + type: string + title: + type: string + content: + type: string + embed: + type: object + shared_file: + anyOf: + - type: boolean + - const: "0" + added: + type: string + published: + type: string + edited: + type: string + file: + type: object + attachments: + type: array + items: + type: object + size: + $ref: "#/components/schemas/non-negative-integer" + ihash: + type: string + poll: + type: object + tags: + type: array + items: + type: string + captions: + type: object + comment: + type: object + properties: + id: + type: string + post_id: + type: string + parent_id: + type: string + commenter: + type: string + service: + type: string + content: + type: string + added: + type: string + published: + type: string + deleted_at: + type: string + commenter_name: + type: string + file: + title: File + type: object + properties: + id: + type: integer + hash: + type: string + mtime: + type: string + ctime: + type: string + mime: + type: string + ext: + type: string + added: + type: string + size: + type: integer + ihash: + type: string + archive-info: + title: ArchiveInfo + type: object + required: + - file + - file_list + properties: + file: + $ref: "#/components/schemas/file" + file_list: + type: array + items: + type: string + password: + type: string + account: + type: object + properties: + id: + $ref: "#/components/schemas/positive-integer" + username: + type: string + created_at: + type: string + role: + enum: + - consumer + - moderator + - administrator + notification: + type: object + properties: + id: + $ref: "#/components/schemas/positive-integer" + created_at: + type: string + account_id: + $ref: "#/components/schemas/positive-integer" + is_seen: + type: boolean + type: + type: string + extra_info: + type: object + service-key: + type: object + properties: + id: + $ref: "#/components/schemas/positive-integer" + service: + type: string + added: + type: string + dead: + type: boolean + contributor_id: + $ref: "#/components/schemas/positive-integer" + encrypted_key: + type: string + discord_channel_ids: + type: string + pagination: + title: Pagination + description: Pagination info of a collection. + type: object + properties: + current_page: + $ref: "#/components/schemas/positive-integer" + limit: + $ref: "#/components/schemas/positive-integer" + base: + type: object + offset: + $ref: "#/components/schemas/non-negative-integer" + count: + $ref: "#/components/schemas/non-negative-integer" + current_count: + $ref: "#/components/schemas/non-negative-integer" + total_pages: + $ref: "#/components/schemas/positive-integer" + unapproved-link: + type: object + properties: + id: + $ref: "#/components/schemas/positive-integer" + from_service: + type: string + from_id: + type: string + to_service: + type: string + to_id: + type: string + reason: + type: string + requester_id: + $ref: "#/components/schemas/positive-integer" + status: + const: pending + from_creator: + type: object + to_creator: + type: object + requester: + type: object diff --git a/src/__main__.py b/src/__main__.py index 5746012..dea9e29 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -3,4 +3,4 @@ import sys from src import cmd if __name__ == "__main__": - cmd.main(sys.argv[1:]) \ No newline at end of file + cmd.main(sys.argv[1:]) diff --git a/src/cmd/__init__.py b/src/cmd/__init__.py index 871fc1c..a025ec0 100644 --- a/src/cmd/__init__.py +++ b/src/cmd/__init__.py @@ -2,7 +2,7 @@ from src.cmd.daemon import run_daemon from src.cmd.web import run_web from src.cmd.webpack import run_webpack -from src.config import Configuration +from src.config import Configuration, parse_config from src.internals.tracing.custom_psycopg_instrumentor import instrument_psycopg @@ -37,5 +37,8 @@ def main(args: list[str]): instrument_psycopg() __try(run_daemon()) + case ["validate"]: + __try(Configuration) + case _: - print(f"usage: python -m kemono [web|webpack|daemon]") + print(f"usage: python -m src [run|web|webpack|daemon]") diff --git a/src/cmd/daemon.py b/src/cmd/daemon.py index 5404eb9..9c1991e 100644 --- a/src/cmd/daemon.py +++ b/src/cmd/daemon.py @@ -9,21 +9,10 @@ from src.internals.database import database def run_daemon(): - """Bugs to fix at a later time:""" - """ - Pages can get stuck with an older version of their """ - """ HTML, even after disabling anything and everything """ - """ related to cache. The only resolution as of now is """ - """ a restart of the entire webserver. """ - environment_vars = { **os.environ.copy(), "FLASK_DEBUG": "development" if Configuration().development_mode else "false", "NODE_ENV": "development" if Configuration().development_mode else "production", - "KEMONO_SITE": Configuration().webserver["site"], - "ICONS_PREPEND": Configuration().webserver["ui"]["files_url_prepend"]["icons_base_url"], - "BANNERS_PREPEND": Configuration().webserver["ui"]["files_url_prepend"]["banners_base_url"], - "THUMBNAILS_PREPEND": Configuration().webserver["ui"]["files_url_prepend"]["thumbnails_base_url"], - "CREATORS_LOCATION": Configuration().webserver["api"]["creators_location"], } if Configuration().sentry_dsn: @@ -46,44 +35,6 @@ def run_daemon(): send_default_pii = True, ) - """ Install client dependencies. """ - if not os.path.isdir("./client/node_modules"): - subprocess.run( - ["npm", "ci", "--also=dev", "--legacy-peer-deps"], - check=True, - cwd="client", - env=environment_vars, - ) - - """ Build or run client development server depending on config. """ - if Configuration().development_mode: - subprocess.Popen( - ["npm", "run", "dev"], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - cwd="client", - env=environment_vars, - ) - else: - subprocess.run(["npm", "run", "build"], check=True, cwd="client", env=environment_vars) - - """ Run `tusd`. """ - if Configuration().filehaus["tus"]["manage"]: - subprocess.Popen( - [ - "tusd", - "-upload-dir=./storage/uploads", - "--hooks-enabled-events", - "post-create", - "-hooks-http", - "http://127.0.0.1:3343" - # 'http://127.0.0.1:6942/shares/tus' - ], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - env=environment_vars, - ) - database.init() try: if Configuration().automatic_migrations: @@ -98,6 +49,8 @@ def run_daemon(): migrations = read_migrations("./db/migrations") with backend.lock(): backend.apply_migrations(backend.to_apply(migrations)) + backend.connection.close() + del backend """ Initialize Pgroonga if needed. """ with database.pool.getconn() as conn: try: diff --git a/src/cmd/web.py b/src/cmd/web.py index f36e6ef..3abd220 100644 --- a/src/cmd/web.py +++ b/src/cmd/web.py @@ -37,8 +37,11 @@ def run_web(): migrations = read_migrations("./db/migrations") with backend.lock(): backend.apply_migrations(backend.to_apply(migrations)) + backend.connection.close() + del backend """ Initialize Pgroonga if needed. """ with database.pool.getconn() as conn: + # TODO: make it an actual migration file try: with conn.cursor() as db: db.execute("CREATE EXTENSION IF NOT EXISTS pgroonga") @@ -47,8 +50,11 @@ def run_web(): ) db.execute("CREATE INDEX IF NOT EXISTS pgroonga_dms_idx ON dms USING pgroonga (content)") conn.commit() - except Exception: - pass + except Exception as error: + if (Configuration().development_mode): + raise Exception("Failed to install PGRoonga.") from error + else: + pass if Configuration().development_mode: with conn.cursor() as db: db.execute(open("db/seed.sql", "r").read()) @@ -58,4 +64,4 @@ def run_web(): database.close_pool() from src import server - server.app.run("0.0.0.0", port=80) + server.app.run("0.0.0.0", port=Configuration().webserver['port']) diff --git a/src/config.py b/src/config.py index 2ad457f..e97cfa1 100644 --- a/src/config.py +++ b/src/config.py @@ -5,42 +5,19 @@ import os import random import string from base64 import b64encode +from os import path import orjson - - -def merge_dict(dict_base, dict_that_overrides): - if isinstance(dict_base, dict) and isinstance(dict_that_overrides, dict): - return {**dict_base, **{k: merge_dict(dict_base.get(k, {}), v) for k, v in dict_that_overrides.items()}} - else: - return dict_that_overrides +from jsonschema import validate, Draft7Validator +from jsonschema.exceptions import ValidationError class BuildConfiguration: def __init__(self): - config_file = os.environ.get("KEMONO_CONFIG") or "config.json" - config_location = os.path.join("./", config_file) - config = {} - - if os.path.exists(config_location): - with open(config_location) as f: - config.update(orjson.loads(f.read())) - - override_config_file = os.environ.get("KEMONO_OVERRIDE_CONFIG") or "config.override.json" - override_config_location = os.path.join("./", override_config_file) - override_config = {} - - if os.path.exists(config_location): - with open(config_location) as f: - config.update(orjson.loads(f.read())) - - if os.path.exists(override_config_location): - with open(override_config_location) as f: - override_config.update(orjson.loads(f.read())) - - config = merge_dict(config, override_config) + config = parse_config() self.sentry_dsn = config.get("sentry_dsn", None) + self.sentry_dsn_js = config.get("sentry_dsn_js", None) self.open_telemetry_endpoint = config.get("open_telemetry_endpoint", None) self.development_mode = config.get("development_mode", True) self.automatic_migrations = config.get("automatic_migrations", True) @@ -326,3 +303,64 @@ def Configuration(): return global_config # todo use watcher to reload config object based on json changes + + +def parse_config() -> dict: + config_file_name = os.environ.get("KEMONO_CONFIG") or "config.json" + override_config_file_name = os.environ.get("KEMONO_OVERRIDE_CONFIG") or "config.override.json" + config_file_path = os.path.join("./", config_file_name) + override_config_path = os.path.join("./", override_config_file_name) + config_schema_file_path = path.join("./", "schema", "config.schema.json") + config_schema = {} + config = {} + override_config = {} + + if not path.exists(config_schema_file_path): + raise Exception(f'''Config schema file does not exist at path "{config_schema_file_path}".''') + else: + with open(config_schema_file_path) as f: + config_schema.update(orjson.loads(f.read())) + + if not path.exists(config_file_path): + raise Exception(f'''Config file does not exist at path \"{config_file_path}\".''') + else: + with open(config_file_path) as f: + config.update(orjson.loads(f.read())) + + if path.exists(override_config_path): + with open(override_config_path) as f: + override_config.update(orjson.loads(f.read())) + + config = merge_dict(config, override_config) + + try: + Draft7Validator.check_schema(config_schema) + validate(instance=config, schema=config_schema, cls=Draft7Validator) + except ValidationError as error: + schema_json_path_segments = '/'.join([ + str(segment) + for segment + in error.absolute_schema_path + ]) + schema_json_path = f"#/{schema_json_path_segments}" + error_message = f"Configuration validation failed as per schema in \"{schema_json_path}\"." + + raise Exception(error_message) + + return config + + +def merge_dict(dict_base, dict_that_overrides): + if isinstance(dict_base, dict) and isinstance(dict_that_overrides, dict): + value = { + **dict_base, + **{ + k: merge_dict(dict_base.get(k, {}), v) + for k, v + in dict_that_overrides.items() + } + } + + return value + else: + return dict_that_overrides diff --git a/src/internals/database/database.py b/src/internals/database/database.py index f9f308c..5842ea2 100644 --- a/src/internals/database/database.py +++ b/src/internals/database/database.py @@ -8,6 +8,7 @@ from flask import g from psycopg.abc import Query from psycopg.connection import Connection from psycopg.cursor import Cursor +from psycopg.client_cursor import ClientCursor from psycopg.errors import QueryCanceled from psycopg.rows import dict_row from psycopg.types.string import TextLoader @@ -78,7 +79,7 @@ def get_cursor() -> Cursor: return g.cursor -def get_client_binding_cursor() -> Cursor: +def get_client_binding_cursor() -> ClientCursor: if "client_binding_cursor" not in g: if "connection" not in g: g.connection = get_pool().getconn() @@ -124,7 +125,7 @@ def get_from_cache(redis: Any, cache_key: str, cache_store_method: str): def cached_query( query: str, cache_key: str, - params: tuple = (), + params: tuple | dict = (), serialize_fn=safe_dumper, deserialize_fn=safe_loader, reload: bool = False, @@ -268,7 +269,7 @@ def cached_count( return result -def query_db(query: Query, params: tuple = ()) -> list[dict]: +def query_db(query: Query, params: tuple | dict = ()) -> list[dict]: cursor = get_cursor() cursor.execute(query, params) result = cursor.fetchall() @@ -277,7 +278,7 @@ def query_db(query: Query, params: tuple = ()) -> list[dict]: def query_one_db( query: Query, - params: tuple = (), + params: tuple | dict = (), ) -> Optional[dict]: cursor = get_cursor() cursor.execute(query, params) diff --git a/src/internals/serializers/post.py b/src/internals/serializers/post.py index 9671443..5688dd3 100644 --- a/src/internals/serializers/post.py +++ b/src/internals/serializers/post.py @@ -36,7 +36,7 @@ def deserialize_posts_incomplete_rewards(posts_incomplete_rewards_str, loader=un def rebuild_post_fields(post): if post is None: return - if "added" in post: + if post.get("added"): post["added"] = datetime.datetime.fromisoformat(post["added"]) if post.get("published"): post["published"] = datetime.datetime.fromisoformat(post["published"]) diff --git a/src/lib/account.py b/src/lib/account.py index 3f5d784..a373a8f 100644 --- a/src/lib/account.py +++ b/src/lib/account.py @@ -1,9 +1,9 @@ import base64 import hashlib -from typing import Optional +from typing import Optional, TypedDict import bcrypt -from flask import current_app, flash, session +from flask import current_app, session from nh3 import nh3 from src.internals.cache.redis import get_conn @@ -23,23 +23,40 @@ def load_account(account_id: Optional[str] = None, reload: bool = False): return None key = f"account:{account_id}" + params = dict(account_id=account_id) query = """ - SELECT id, username, created_at, role - FROM account - WHERE id = %s + SELECT + id, + username, + created_at, + role + FROM + account + WHERE + id = %(account_id)s """ - account_dict = cached_query(query, key, (account_id,), serialize_account, deserialize_account, reload, True) + account_dict = cached_query(query, key, params, serialize_account, deserialize_account, reload, True) return Account.init_from_dict(account_dict) -def get_saved_key_import_ids(key_id, reload=False): +class TDSessionKeyImportID(TypedDict): + key_id: int + import_id: str + + +def get_saved_key_import_ids(key_id, reload=False) -> list[TDSessionKeyImportID]: key = f"saved_key_import_ids:{key_id}" + params = dict(key_id=key_id) query = """ - SELECT * - FROM saved_session_key_import_ids - WHERE key_id = %s + SELECT + key_id, + import_id + FROM + saved_session_key_import_ids + WHERE + key_id = %(key_id)s """ - return cached_query(query, key, (key_id,), reload=reload) + return cached_query(query, key, params, reload=reload) def get_saved_keys(account_id: int, reload: bool = False): @@ -82,8 +99,21 @@ def revoke_saved_keys(key_ids: list[int], account_id: int): redis.delete(key) -def get_login_info_for_username(username): - query = "SELECT id, password_hash FROM account WHERE username = %s" +class TDLoginInfo(TypedDict): + id: str + password_hash: str + + +def get_login_info_for_username(username) -> TDLoginInfo | None: + query = """ + SELECT + id, + password_hash + FROM + account + WHERE + username = %s + """ return query_one_db(query, (username,)) @@ -152,28 +182,27 @@ def change_password(user_id: int, current_password: str, new_password: str) -> b return True -def attempt_login(username: str, password: str) -> Optional[Account]: +def attempt_login(username: str, password: str) -> tuple[Account, None] | tuple[None, str]: if not username or not password: - return None + return (None, "Username and password must be provided.") account_info = get_login_info_for_username(username) + if account_info is None: - flash("Username or password is incorrect") - return None + return (None, "Username or password is incorrect.") if current_app.config.get("ENABLE_LOGIN_RATE_LIMITING") and is_login_rate_limited(str(account_info["id"])): - flash("You're doing that too much. Try again in a little bit.") - return None + return (None, "You're doing that too much. Try again in a little bit.") if bcrypt.checkpw(get_base_password_hash(password), account_info["password_hash"].encode("utf-8")): if account := load_account(account_info["id"], True): session["account_id"] = account.id - return account + + return (account, None) else: raise Exception("Error loading account") - flash("Username or password is incorrect") - return None + return (None, "Username or password is incorrect") def get_base_password_hash(password: str): diff --git a/src/lib/administrator.py b/src/lib/administrator.py index 1f7961f..f831790 100644 --- a/src/lib/administrator.py +++ b/src/lib/administrator.py @@ -1,9 +1,9 @@ -from typing import Dict, List +from typing import List from src.internals.database.database import query_db, query_one_db, query_rowcount_db -from src.lib.notification import send_notifications -from src.lib.pagination import Pagination -from src.types.account import Account, AccountRoleChange, NotificationTypes +from src.lib.notification import send_notifications, TDNotificationInit +from src.lib.pagination import TDPagination +from src.types.account import Account, AccountRoleChange, NotificationTypes, visible_roles def get_account(account_id: str) -> Account: @@ -16,61 +16,102 @@ def get_account(account_id: str) -> Account: (account_id,), ) account = Account.init_from_dict(account) + return account -def count_accounts(queries: Dict[str, str]) -> int: - role = queries["role"] - params: tuple[str, ...] - if queries.get("name"): - params = (role, queries["name"]) - else: - params = (role,) - result = query_one_db( - f""" - SELECT COUNT(*) AS total_number_of_accounts - FROM account +def count_accounts(role: str | None = None, name: str | None = None) -> int: + roles = [role] if role else visible_roles + params = dict( + roles=roles, + name=f"%%{name}%%" if name else None + ) + query = """ + SELECT + COUNT(*) + FROM + account WHERE - role = ANY(%s) - {"AND username LIKE %s" if len(params) > 1 else ""} - """, + role = ANY(%(roles)s::varchar[]) + AND + ( + %(name)s::varchar IS NULL + OR + username LIKE %(name)s::varchar + ) + """ + result = query_one_db( + query, params, ) - return result["total_number_of_accounts"] if result else 0 + count = result["count"] if result else 0 + + return count -def get_accounts(pagination: Pagination, queries: Dict[str, str]) -> List[Account]: - params = (queries["role"], pagination.offset, pagination.limit) - if queries.get("name"): - params = (queries["role"], f"%%{queries["name"]}%%", pagination.offset, pagination.limit) - - accounts = query_db( - f""" - SELECT id, username, created_at, role - FROM account +def get_accounts(pagination: TDPagination, role: str | None = None, name: str | None = None) -> List[Account]: + roles = [role] if role else visible_roles + params = dict( + roles=roles, + name=f"%%{name}%%" if name else None, + offset=pagination["offset"], + limit=pagination["limit"] + ) + query = """ + SELECT + id, + username, + created_at, + role + FROM + account WHERE - role = ANY(%s) - {"AND username LIKE %s" if len(params) > 3 else ""} + role = ANY(%(roles)s::varchar[]) + AND + ( + %(name)s::varchar IS NULL + OR + username LIKE %(name)s::varchar + ) ORDER BY - created_at DESC, - username - OFFSET %s - LIMIT %s - """, + id ASC + OFFSET %(offset)s + LIMIT %(limit)s + """ + accounts = query_db( + query, params, ) acc_list = [Account.init_from_dict(acc) for acc in accounts] - count = count_accounts(queries) - pagination.add_count(count) + return acc_list def change_account_role(account_ids: List[str], extra_info: AccountRoleChange): change_role_query = """ - UPDATE account - SET role = %s - WHERE id = ANY (%s) + UPDATE + account + SET + role = %s + WHERE + id = ANY (%s) """ query_rowcount_db(change_role_query, (extra_info["new_role"], account_ids)) - send_notifications(account_ids, NotificationTypes.ACCOUNT_ROLE_CHANGE, extra_info) + + notification_inits: list[TDNotificationInit] = [ + TDNotificationInit( + account_id=account_id, + type=NotificationTypes.ACCOUNT_ROLE_CHANGE, + # resort to this retardation because + # psycopg chokes json'ing typed dicts + extra_info=dict( + old_role=extra_info["old_role"], + new_role=extra_info["new_role"] + ) + ) + for account_id + in account_ids + ] + send_notifications(notification_inits) + return True diff --git a/src/lib/announcements.py b/src/lib/announcements.py index 756461a..8ee5b7c 100644 --- a/src/lib/announcements.py +++ b/src/lib/announcements.py @@ -1,11 +1,19 @@ -from typing import List +from typing import TypedDict, Optional from src.internals.database.database import cached_count, cached_query, get_cursor +class TDAnnouncement(TypedDict): + service: str + user_id: str + hash: str + content: str + added: str + published: Optional[str] + def get_artist_announcements( service: str, artist_id: str, query: str | None = None, reload: bool = False -) -> List[dict]: +) -> list[TDAnnouncement]: key = f"announcements:{service}:{artist_id}:{hash(query) if query else ""}" params: tuple[str, ...] @@ -17,18 +25,38 @@ def get_artist_announcements( if service == "fanbox": query = f""" - SELECT *, 'fanbox' AS service - FROM fanbox_newsletters - WHERE user_id = %s {ts_query} - ORDER BY published DESC + SELECT + user_id, + hash, + content, + added, + published, + 'fanbox' AS service + FROM + fanbox_newsletters + WHERE + user_id = %s {ts_query} + ORDER BY + published DESC """ params = (artist_id,) else: query = f""" - SELECT * - FROM introductory_messages - WHERE service = %s AND user_id = %s {ts_query} - ORDER BY added DESC + SELECT + user_id, + hash, + content, + added, + NULL as published, + service + FROM + introductory_messages + WHERE + service = %s + AND + user_id = %s {ts_query} + ORDER BY + added DESC """ params = (service, artist_id) diff --git a/src/lib/api/__init__.py b/src/lib/api/__init__.py new file mode 100644 index 0000000..114daef --- /dev/null +++ b/src/lib/api/__init__.py @@ -0,0 +1,14 @@ +from .v1 import create_client_error_response, create_not_found_error_response +from .v2 import ( + create_api_v2_response, + create_api_v2_error_response, + create_api_v2_client_error_response, + create_api_v2_invalid_body_error_response, + create_api_v2_not_found_error_response, + get_api_v2_request_data, + TDAPIError, + TDAPIRequestBody, + APIV2_REQUEST_BODY_TYPE, + APIV2_RESPONSE_SUCCESS_TYPE, + APIV2_RESPONSE_ERROR_TYPE, +) diff --git a/src/lib/api/v1.py b/src/lib/api/v1.py new file mode 100644 index 0000000..9011bca --- /dev/null +++ b/src/lib/api/v1.py @@ -0,0 +1,18 @@ +from flask import make_response, jsonify + + +def create_client_error_response(message: str, status_code=400): + + if status_code < 400 or status_code > 499: + message = 'The value of status code "{status_code}" is not within range of 400...499.' + raise ValueError(message) + + response = make_response(jsonify(error=message), status_code) + + return response + + +def create_not_found_error_response(message: str = "Not Found"): + response = create_client_error_response(message, 404) + + return response diff --git a/src/lib/api/v2.py b/src/lib/api/v2.py new file mode 100644 index 0000000..5b1b6b8 --- /dev/null +++ b/src/lib/api/v2.py @@ -0,0 +1,69 @@ +from flask import make_response, jsonify, Request +from typing import Any, Literal, NotRequired, TypedDict + +APIV2_REQUEST_BODY_TYPE = "Sneed's Feed & Seed (formerly Chuck's)" +APIV2_RESPONSE_SUCCESS_TYPE = "Chuck's Fuck & Suck (formerly Boyle's)" +APIV2_RESPONSE_ERROR_TYPE = "Boyle's Foil & Soil (formerly Sneed's)" + + +class TDAPIError(TypedDict): + type: str + message: NotRequired[str] + + +class TDAPIRequestBody(TypedDict): + """ + Only required for requests with body. + """ + + type: Literal["Sneed's Feed & Seed (formerly Chuck's)"] + data: NotRequired[Any] + + +class TDAPIResponseSuccess(TypedDict): + type: Literal["Chuck's Fuck & Suck (formerly Boyle's)"] + data: Any + + +class TDAPIResponseError(TypedDict): + type: Literal["Boyle's Foil & Soil (formerly Sneed's)"] + error: TDAPIError + + +def get_api_v2_request_data(request: Request) -> Any: + body: TDAPIRequestBody = request.get_json() + + return body.get("data", None) + + +def create_api_v2_response(data: Any, status_code=200): + response_body = TDAPIResponseSuccess(type="Chuck's Fuck & Suck (formerly Boyle's)", data=data) + + response = make_response(jsonify(response_body), status_code) + + return response + + +def create_api_v2_error_response(error: TDAPIError, status_code=500): + response_body = TDAPIResponseError(type="Boyle's Foil & Soil (formerly Sneed's)", error=error) + + response = make_response(jsonify(response_body), status_code) + + return response + + +def create_api_v2_client_error_response(error: TDAPIError, status_code=400): + return create_api_v2_error_response(error, status_code) + + +def create_api_v2_invalid_body_error_response(): + return create_api_v2_error_response(TDAPIError(type="api_invalid_body_data", message="Invalid body data."), 400) + + +def create_api_v2_not_found_error_response(cache_age: int | None = None): + response = create_api_v2_error_response(TDAPIError(type="api_not_found", message="Not Found."), 404) + + if cache_age: + response.headers["Cache-Control"] = f"s-maxage={str(cache_age)}" + + return response diff --git a/src/lib/artist.py b/src/lib/artist.py index 186e5c4..febdb75 100644 --- a/src/lib/artist.py +++ b/src/lib/artist.py @@ -1,5 +1,5 @@ import datetime -from typing import Optional +from typing import Optional, TypedDict, Literal, Dict from src.config import Configuration from src.internals.cache.redis import get_conn @@ -13,25 +13,59 @@ from src.internals.serializers.artist import ( ) from src.utils.utils import clear_web_cache_for_creator_links +class TDArtist(TypedDict): + id: str + name: str + service: str + indexed: str + updated: str + public_id: str + relation_id: int -def get_top_artists_by_faves(offset, count, reload=False): + +class TDArtistWithFavs(TDArtist): + count: int + + +def get_top_artists_by_faves(offset, count, reload=False) -> list[TDArtistWithFavs]: key = f"top_artists:{offset}:{count}" + params = dict(offset=offset, limit=count) query = """ - SELECT l.*, count(*) - FROM lookup l - INNER JOIN account_artist_favorite aaf - ON l.id = aaf.artist_id AND l.service = aaf.service + SELECT + artists.id, + artists.name, + artists.service, + artists.indexed, + artists.updated, + artists.public_id, + artists.relation_id, + fc.favorite_count AS count + FROM + lookup AS artists + INNER JOIN + favorite_counts AS fc + ON + artists.id = fc.artist_id + AND + artists.service = fc.service WHERE - (l.id, l.service) NOT IN (SELECT id, service from dnp) - GROUP BY (l.id, l.service) - ORDER BY count(*) DESC - OFFSET %s - LIMIT %s + (artists.id, artists.service) NOT IN ( + SELECT + id, + service + FROM + dnp + ) + ORDER BY + count DESC + OFFSET %(offset)s + LIMIT %(limit)s """ + return cached_query( query, key, - (offset, count), + params, serialize_artists, deserialize_artists, reload, @@ -46,21 +80,34 @@ def get_random_artist_keys(count, reload=False): return cached_query(query, key, (count,), unsafe_dumper, unsafe_loader, reload, lock_enabled=True) -def get_artist(service: str, artist_id: str, reload: bool = False) -> dict: +def get_artist(service: str, artist_id: str, reload: bool = False) -> TDArtist: key = f"artist:{service}:{artist_id}" - if service == "onlyfans": - id_filter = "(id = %s or public_id = %s)" - params = (artist_id, artist_id, service) - else: - id_filter = "id = %s" - params = (artist_id, service) + params = dict(artist_id=artist_id, service=service) + id_filter = ( + "(id = %(artist_id)s or public_id = %(artist_id)s)" + if service in ("onlyfans", "fansly", "candfans", "patreon", "fanbox", "boosty") + else "id = %(artist_id)s" + ) query = f""" - SELECT * - FROM lookup + SELECT + id, + name, + service, + indexed, + updated, + public_id, + relation_id + FROM + lookup WHERE {id_filter} - AND service = %s - AND (id, service) NOT IN (SELECT id, service from dnp); + AND service = %(service)s + AND (id, service) NOT IN ( + SELECT + id, + service + FROM dnp + ); """ return cached_query( query, @@ -75,18 +122,35 @@ def get_artist(service: str, artist_id: str, reload: bool = False) -> dict: ) -def get_artists_by_update_time(offset, limit, reload=False): +def get_artists_by_update_time(offset, limit, reload=False) -> list[TDArtist]: key = f"artists_by_update_time:{offset}:{limit}" + params = dict(offset=offset, limit=limit) query = """ - SELECT * - FROM lookup + SELECT + id, + name, + service, + indexed, + updated, + public_id, + relation_id + FROM + lookup WHERE - (id, service) NOT IN (SELECT id, service from dnp) - ORDER BY updated desc - OFFSET %s - LIMIT %s + (id, service) NOT IN ( + SELECT + id, + service + FROM + dnp + ) + ORDER BY + updated DESC + OFFSET %(offset)s + LIMIT %(limit)s """ - return cached_query(query, key, (offset, limit), serialize_artists, deserialize_artists, reload) + + return cached_query(query, key, params, serialize_artists, deserialize_artists, reload) def get_fancards_by_artist(artist_id, reload=False): @@ -102,22 +166,61 @@ def create_unapproved_link_request(from_artist, to_artist, user_id, reason: Opti ON CONFLICT DO NOTHING """ cur = get_cursor() - cur.execute(query, (from_artist["service"], from_artist["id"], to_artist["service"], to_artist["id"], user_id, reason or None)) + cur.execute( + query, + (from_artist["service"], from_artist["id"], to_artist["service"], to_artist["id"], user_id, reason or None), + ) -def get_unapproved_links_with_artists(): +class TDUnapprovedLink(TypedDict): + id: int + from_service: str + from_id: str + to_service: str + to_id: str + reason: str + requester_id: int + status: Literal["pending", "approved", "rejected"] + from_creator: Dict + to_creator: Dict + requester: Dict + + +def get_unapproved_links_with_artists() -> list[TDUnapprovedLink]: query = """ SELECT - unapproved_link_requests.* - , row_to_json(from_creator.*) as from_creator - , row_to_json(to_creator.*) as to_creator - , row_to_json(requester.*) as requester - FROM unapproved_link_requests - JOIN lookup from_creator ON from_service = from_creator.service AND from_id = from_creator.id - JOIN lookup to_creator ON to_service = to_creator.service AND to_id = to_creator.id - JOIN account requester ON requester_id = requester.id - WHERE status = 'pending' - ORDER BY unapproved_link_requests.id ASC + unapproved_link_requests.* , + row_to_json( + from_creator.* + ) AS from_creator, + row_to_json( + to_creator.* + ) AS to_creator, + row_to_json( + requester.* + ) AS requester + FROM + unapproved_link_requests + JOIN + lookup AS from_creator + ON + from_service = from_creator.service + AND + from_id = from_creator.id + JOIN + lookup AS to_creator + ON + to_service = to_creator.service + AND + to_id = to_creator.id + JOIN + account AS requester + ON + requester_id = requester.id + WHERE + status = 'pending' + ORDER BY + unapproved_link_requests.id ASC """ cur = get_cursor() cur.execute(query) @@ -176,8 +279,8 @@ def approve_unapproved_link_request(request_id: int): redis.delete(f"linked_accounts:{update_result['to_service']}:{update_result['to_id']}") redis.delete(f"artist:{update_result['from_service']}:{update_result['from_id']}") redis.delete(f"artist:{update_result['to_service']}:{update_result['to_id']}") - clear_web_cache_for_creator_links(update_result['from_service'], update_result['from_id']) - clear_web_cache_for_creator_links(update_result['to_service'], update_result['to_id']) + clear_web_cache_for_creator_links(update_result["from_service"], update_result["from_id"]) + clear_web_cache_for_creator_links(update_result["to_service"], update_result["to_id"]) def delete_creator_link(service: str, creator_id: str): diff --git a/src/lib/favorites.py b/src/lib/favorites.py index 09c344e..03134c8 100644 --- a/src/lib/favorites.py +++ b/src/lib/favorites.py @@ -1,4 +1,5 @@ import logging +from typing import TypedDict from src.internals.cache.redis import get_conn from src.internals.database.database import cached_query, query_rowcount_db @@ -10,10 +11,21 @@ from src.lib.post import get_post_multiple def get_favorite_artists(account_id, reload=False): key = f"favorite_artists:{account_id}" query = """ - SELECT aaf.id, aaf.service, aaf.artist_id, pam.added as updated - FROM account_artist_favorite aaf - LEFT JOIN posts_added_max pam on pam.service = aaf.service and pam."user" = aaf.artist_id - WHERE account_id = %s + SELECT + aaf.id, + aaf.service, + aaf.artist_id, + pam.added AS updated + FROM + account_artist_favorite AS aaf + LEFT JOIN + posts_added_max AS pam + ON + pam.service = aaf.service + AND + pam."user" = aaf.artist_id + WHERE + account_id = %s """ user_favorite_artists = { (fav["service"], fav["artist_id"]): fav @@ -29,49 +41,97 @@ def get_favorite_artists(account_id, reload=False): # mget artists to prevent n+1, todo better mget with query integrated like posts keys = [f"artist:{service}:{artist_id}" for service, artist_id in user_favorite_artists.keys()] redis = get_conn() + if keys: cache_result = ( - deserialize_artist(artist) for artist in (artist_str for artist_str in redis.mget(keys) if artist_str) + deserialize_artist(artist) + for artist + in (artist_str + for artist_str + in redis.mget(keys) + if artist_str + ) ) else: cache_result = [] + in_cache = {(artist["service"], artist["id"]): artist for artist in cache_result if artist} artists = [] + for favorite_artist in user_favorite_artists.values(): artist = in_cache.get((favorite_artist["service"], favorite_artist["artist_id"])) + if not artist: artist = get_artist(favorite_artist["service"], favorite_artist["artist_id"]) + if artist: artist["faved_seq"] = favorite_artist["id"] artist["last_imported"] = artist["updated"] artist["updated"] = favorite_artist["updated"] artists.append(artist) + return artists +class TDFavoritePostData(TypedDict): + id: str + service: str + artist_id: str + post_id: str + + def get_favorite_posts(account_id, reload=False): key = f"favorite_posts:{account_id}" - query = "select id, service, artist_id, post_id from account_post_favorite where account_id = %s" - favorites = cached_query(query, key, (account_id,), reload=reload) + query = """ + SELECT + id, + service, + artist_id, + post_id + FROM + account_post_favorite + WHERE + account_id = %s + """ + favorites: list[TDFavoritePostData]= cached_query(query, key, (account_id,), reload=reload) posts_to_loads = {(f["service"], f["artist_id"], f["post_id"]): f for f in favorites} return_value = get_post_multiple(posts_to_loads) log_flag = False + for post in return_value: if not post: log_flag = True continue + post["faved_seq"] = posts_to_loads[(post["service"], post["user"], post["id"])]["id"] + if log_flag: logging.exception("Fav post not found for account faves", extra={"account_id": account_id}) + return return_value def add_favorite_artist(account_id, service, artist_id): query_rowcount_db( - "insert into account_artist_favorite (account_id, service, artist_id) values (%s, %s, %s) ON CONFLICT (account_id, service, artist_id) DO NOTHING", + """ + INSERT INTO account_artist_favorite + ( + account_id, + service, + artist_id + ) + VALUES + ( + %s, + %s, + %s + ) + ON CONFLICT + (account_id, service, artist_id) DO NOTHING + """, (account_id, service, artist_id), ) # g.connection.commit() we needed this before because we were in a transaction diff --git a/src/lib/filehaus.py b/src/lib/filehaus.py index 22b474f..bad45ea 100644 --- a/src/lib/filehaus.py +++ b/src/lib/filehaus.py @@ -1,43 +1,80 @@ +from typing import TypedDict from src.internals.database.database import cached_count, cached_query -def get_share(share_id: int, reload=False): +class TDShare(TypedDict): + id: int + name: str + description: str + uploader: int + added: str + + +def get_share(share_id: int, reload=False) -> TDShare: key = f"share:{share_id}" + params = dict(share_id=share_id) query = """ - SELECT * - FROM shares - WHERE id = %s + SELECT + id, + name, + description, + uploader, + added + FROM + shares + WHERE + id = %(share_id)s """ - return cached_query(query, key, (share_id,), reload=reload, single=True) + return cached_query(query, key, params, reload=reload, single=True) -def get_shares(offset: int, limit: int = 50, reload=False): +def get_shares(offset: int, limit: int = 50, reload=False) -> list[TDShare]: key = f"all_shares:{limit}:{offset}:" + params = dict(offset=offset, limit=limit) query = """ - SELECT * - FROM shares - ORDER BY id DESC - OFFSET %s - LIMIT %s + SELECT + id, + name, + description, + uploader, + added + FROM + shares + ORDER BY + id DESC + OFFSET %(offset)s + LIMIT %(limit)s """ - return cached_query(query, key, (offset, limit), reload=reload, lock_enabled=True) + return cached_query(query, key, params, reload=reload, lock_enabled=True) def get_all_shares_count(reload: bool = False) -> int: return cached_count("SELECT COUNT(*) FROM shares", "all_shares_count", lock_enabled=True) -def get_artist_shares(artist_id, service, reload=False): +def get_artist_shares(artist_id, service, reload=False) -> list[TDShare]: key = f"artist_shares:{service}:{artist_id}" + params = dict(artist_id=artist_id, service=service) query = """ - SELECT * - FROM shares s - INNER JOIN lookup_share_relationships lsr on s.id = lsr.share_id - WHERE lsr.user_id = %s AND lsr.service = %s - ORDER BY s.id DESC + SELECT + shares.id, + shares.name, + shares.description, + shares.uploader, + shares.added + FROM + shares + INNER JOIN + lookup_share_relationships AS lsr + ON + shares.id = lsr.share_id + WHERE + lsr.user_id = %(artist_id)s AND lsr.service = %(service)s + ORDER BY + shares.id DESC """ # todo CONSTRAINT lookup_share_relationships_pkey PRIMARY KEY (share_id, service, user_id) should be user_id, service, share_id or we have other index - return cached_query(query, key, (artist_id, service), reload=reload) + return cached_query(query, key, params, reload=reload) def get_artist_share_count(service: str, artist_id: str, reload=False): @@ -51,14 +88,46 @@ def get_artist_share_count(service: str, artist_id: str, reload=False): return cached_count(query, key, (service, artist_id), reload) -def get_files_for_share(share_id: int, reload=False): +class TDShareFile(TypedDict): + share_id: int + upload_url: str + upload_id: str + file_id: int + filename: str + id: int + hash: str + mtime: str + ctime: str + mime: str + ext: str + added: str + + +def get_files_for_share(share_id: int, reload=False) -> list[TDShareFile]: key = f"share_files:{share_id}" query = """ - SELECT * - FROM file_share_relationships fsr - LEFT JOIN files f - ON fsr.file_id = f.id - WHERE share_id = %s - ORDER frs.file_id DESC + SELECT + fsr.share_id, + fsr.upload_url, + fsr.upload_id, + fsr.file_id, + fsr.filename, + files.id, + files.hash, + files.mtime, + files.ctime, + files.mime, + files.ext, + files.added + FROM + file_share_relationships AS fsr + LEFT JOIN + files + ON + fsr.file_id = files.id + WHERE + share_id = %s + ORDER + frs.file_id DESC """ return cached_query(query, key, (share_id,), reload=reload) diff --git a/src/lib/files.py b/src/lib/files.py index dc31db7..05ac1aa 100644 --- a/src/lib/files.py +++ b/src/lib/files.py @@ -3,7 +3,7 @@ import logging import re from dataclasses import dataclass from datetime import datetime -from typing import Optional +from typing import Optional, TypedDict import requests @@ -37,7 +37,36 @@ class File: ihash: Optional[str] -def get_file_relationships(file_hash: str, reload: bool = False): +class TDPost(TypedDict): + file_id: int + id: str + user: str + service: str + title: str + content: str + published: str + file: dict + attachments: list + + +class TDDiscordPost(TypedDict): + file_id: int + id: str + server: str + channel: str + content: str + published: str + embeds: list + mentions: list + attachments: list + + +class TDFileRelationships(TypedDict): + posts: list[TDPost] + discord_posts: list[TDDiscordPost] + + +def get_file_relationships(file_hash: str, reload: bool = False) -> TDFileRelationships: key = f"files:by_hash:{file_hash}" query = """ SELECT @@ -55,9 +84,18 @@ def get_file_relationships(file_hash: str, reload: bool = False): posts.published, posts.file, posts.attachments - FROM file_post_relationships post_files - LEFT JOIN posts ON post_files.post = posts.id AND post_files.service = posts.service - WHERE files.id = post_files.file_id AND posts.id is not NULL + FROM + file_post_relationships AS post_files + LEFT JOIN + posts + ON + post_files.post = posts.id + AND + post_files.service = posts.service + WHERE + files.id = post_files.file_id + AND + posts.id is not NULL LIMIT 1000 ) AS posts ) AS posts, @@ -74,9 +112,14 @@ def get_file_relationships(file_hash: str, reload: bool = False): discord_posts.embeds, discord_posts.mentions, discord_posts.attachments - FROM file_discord_message_relationships discord_files - LEFT JOIN discord_posts ON discord_files.id = discord_posts.id - WHERE files.id = discord_files.file_id + FROM + file_discord_message_relationships AS discord_files + LEFT JOIN + discord_posts + ON + discord_files.id = discord_posts.id + WHERE + files.id = discord_files.file_id LIMIT 1000 ) AS discord_posts ) AS discord_posts @@ -114,13 +157,30 @@ archive_server_session = requests.Session() def get_archive_files(file_hash: str) -> Optional[ArchiveInfo]: if not Configuration().archive_server["enabled"]: return None + arc_data = get_archive(file_hash) + if not arc_data: return None + file, ext = arc_data key = f"archive_files:{file.hash}" - query = "SELECT * FROM archive_files LEFT JOIN files ON archive_files.file_id = files.id WHERE files.hash = %s" + query = """ + SELECT + archive_files.file_id, + archive_files.files, + archive_files.password + FROM + archive_files + LEFT JOIN + files + ON + archive_files.file_id = files.id + WHERE + files.hash = %s + """ result = cached_query(query, key, (file.hash,), single=True) + if result: return ArchiveInfo( file, @@ -132,6 +192,7 @@ def get_archive_files(file_hash: str) -> Optional[ArchiveInfo]: files_api_call = archive_server_session.get( f"{Configuration().archive_server["api_url"]}/list/data/{file_hash[0:2]}/{file_hash[2:4]}/{file_hash}{ext}" ) + if files_api_call.status_code == 401: files: list[str] = [] else: @@ -141,13 +202,29 @@ def get_archive_files(file_hash: str) -> Optional[ArchiveInfo]: f"{Configuration().archive_server["api_url"]}/needs_password/data/{file_hash[0:2]}/{file_hash[2:4]}/{file_hash}{ext}" ) needs_pass_api_call.raise_for_status() + assert needs_pass_api_call.text in ("true", "false") + needs_pass = needs_pass_api_call.text == "true" + except Exception as e: logging.exception("Failed to call archive server", exc_info=True) + return None + password = "" if needs_pass else None - query_rowcount_db("INSERT INTO archive_files (file_id, files, password) VALUES (%s, %s, %s) ON CONFLICT (file_id) DO NOTHING", (file.id, files, password)) + query_rowcount_db( + """ + INSERT INTO archive_files + (file_id, files, password) + VALUES + (%s, %s, %s) + ON CONFLICT + (file_id) DO NOTHING + """, + (file.id, files, password) + ) + return ArchiveInfo(file, files, password) @@ -168,15 +245,23 @@ def try_set_password(file_hash: str, passwords: list[str]) -> bool: if password: update_result = query_one_db( """ - UPDATE archive_files af - SET password = %s - FROM files - WHERE files.hash = %s AND af.file_id = files.id - RETURNING af.files + UPDATE + archive_files AS af + SET + password = %s + FROM + files + WHERE + files.hash = %s + AND + af.file_id = files.id + RETURNING + af.files """, (password, file_hash), ) files: list[str] | None = update_result["files"] if update_result else None + if not files: try: files_api_call = archive_server_session.get( @@ -194,11 +279,15 @@ def try_set_password(file_hash: str, passwords: list[str]) -> bool: """, (files, file_hash), ) + except Exception: logging.exception("Failed to update empty list of archives") + get_conn().delete(f"archive_files:{file_hash}") clear_web_cache_for_archive(file_hash) + return True + return False diff --git a/src/lib/notification.py b/src/lib/notification.py index 07007a0..8a5cdfb 100644 --- a/src/lib/notification.py +++ b/src/lib/notification.py @@ -1,4 +1,5 @@ -from typing import List, Optional +from typing import List, TypedDict +from psycopg.types.json import Json import orjson @@ -97,25 +98,50 @@ def get_account_notifications(account_id: int, reload: bool = False) -> List[Not return notifications -def send_notifications(account_ids: List[str], notification_type: int, extra_info: Optional[dict]) -> bool: +class TDNotificationInit(TypedDict): + account_id: str + type: int + extra_info: dict + + +def send_notifications(notification_inits: list[TDNotificationInit]) -> bool: cursor = get_cursor() - if not account_ids: - return False - if extra_info is not None: - extra_info = orjson.dumps(extra_info) - notification_values = f"(%s, {notification_type}, '{extra_info}')" - else: - notification_values = f"(%s, {notification_type}, NULL)" - - insert_queries_values_template = ",".join([notification_values] * len(account_ids)) - insert_query = f""" - INSERT INTO notifications (account_id, type, extra_info) - VALUES {insert_queries_values_template} - ; + params = dict( + notification_inits=Json(notification_inits) + ) + insert_query = """ + WITH notification_inits AS ( + SELECT + notification_init.account_id, + notification_init.type, + notification_init.extra_info + FROM + json_to_recordset(%(notification_inits)s) AS notification_init( + account_id int, + type smallint, + extra_info jsonb + ) + ) + INSERT INTO notifications + ( + account_id, + type, + extra_info + ) + SELECT + account_id, + type, + extra_info + FROM + notification_inits """ - cursor.execute(insert_query, account_ids) - + cursor.execute(insert_query, params) + account_ids = [ + init["account_id"] + for init + in notification_inits + ] for account_id in account_ids: redis = get_conn() redis.delete(f"account_notifications:{account_id}") diff --git a/src/lib/pagination.py b/src/lib/pagination.py index 5a4b0cd..0a5b62e 100644 --- a/src/lib/pagination.py +++ b/src/lib/pagination.py @@ -1,35 +1,26 @@ import math -from flask import Request, url_for +from typing import TypedDict -from src.utils.utils import limit_int, parse_int +PAGINATION_LIMIT = 50 -class Pagination: - def __init__(self, request: Request) -> None: - self.current_page: int = parse_int(request.args.get("page"), 1) - self.limit: int = limit_int(int(request.args.get("limit") or 25), 25) - self.offset: int = self.calculate_offset(self.current_page, self.limit) - self.base: dict[str, str] = request.args.to_dict() +class TDPagination(TypedDict): + total_count: int + limit: int + total_pages: int + current_page: int + offset: int - self.base.pop("page", None) - self.count: int | None = None - self.current_count: int | None = None - self.total_pages: int | None = None +def create_pagination(total_count: int, current_page: int | None = None) -> TDPagination: + limit = PAGINATION_LIMIT + total_pages = math.ceil(total_count / limit) + current = current_page or total_pages + offset = (current - 1) * limit - def add_count(self, count: int): - self.count = count - self.current_count = self.offset + self.limit if self.offset + self.limit < self.count else self.count - self.total_pages = math.ceil(self.count / self.limit) or 1 + pagination = TDPagination( + total_count=total_count, limit=limit, total_pages=total_pages, current_page=current, offset=offset + ) - def calculate_offset(self, current_page: int, limit: int): - if current_page > 1: - offset = (current_page - 1) * limit - else: - offset = 0 - - return offset - - def create_paged_url(self, request: Request, page_number: int): - return url_for(request.endpoint, page=page_number, **self.base) + return pagination diff --git a/src/lib/post.py b/src/lib/post.py index 0a0e896..8bf0039 100644 --- a/src/lib/post.py +++ b/src/lib/post.py @@ -1,6 +1,10 @@ +import hashlib import itertools import logging import random +import re +import uuid +from typing import TypedDict, Union, Sequence, Any, Literal, Optional from murmurhash2 import murmurhash2 @@ -17,6 +21,7 @@ from src.internals.serializers.post import ( serialize_post_list, serialize_posts_incomplete_rewards, ) +from src.lib.posts import Post, POST_FLAG_CUT_OFF, POST_FLAG_REASON_NUMBER_TO_SLUG from src.utils.utils import fixed_size_batches, images_pattern @@ -46,14 +51,57 @@ def get_random_post_key(table_fraction_percentage: float): def get_post(service, artist_id, post_id, reload=False): key = f"post:{service}:{artist_id}:{post_id}" + params = ( + service, + artist_id, + post_id, + service, + artist_id, + post_id, + service, + artist_id, + post_id, + ) query = """ WITH main_post AS ( - SELECT * - FROM posts - WHERE service = %s - AND "user" = %s - AND id = %s - AND ("user", service) NOT IN (SELECT id, service FROM dnp) + SELECT + id, + "user", + service, + title, + content, + embed, + shared_file, + ( + CASE service + WHEN 'fanbox' + THEN NULL + ELSE added + END + ) AS added, + published, + edited, + file, + attachments, + poll, + captions, + tags + FROM + posts + WHERE + service = %s + AND + "user" = %s + AND + id = %s + AND + ("user", service) NOT IN ( + SELECT + id, + service + FROM + dnp + ) ) SELECT main_post.*, @@ -82,17 +130,7 @@ def get_post(service, artist_id, post_id, reload=False): return cached_query( query, key, - ( - service, - artist_id, - post_id, - service, - artist_id, - post_id, - service, - artist_id, - post_id, - ), + params, serialize_post, deserialize_post, reload, @@ -100,25 +138,43 @@ def get_post(service, artist_id, post_id, reload=False): ) -def get_post_multiple(input_, reload=False): +class TDPostData(TypedDict): + service: str + artist_id: str + post_id: str + + +def get_post_multiple(input_: dict[tuple[str, str, str], TDPostData], reload=False): if not input_: return [] key = "post:{service}:{artist_id}:{post_id}" redis = get_conn() keys = [ - key.format(service=service, artist_id=artist_id, post_id=post_id) for (service, artist_id, post_id) in input_ + key.format(service=service, artist_id=artist_id, post_id=post_id) + for (service, artist_id, post_id) + in input_ ] cache_results = redis.mget(keys) - missing_in_cache = [] + missing_in_cache: list[tuple[str, str, str]] = [] for input_el, cache_result in zip(input_, cache_results): if cache_result is None: missing_in_cache.append(input_el) if not missing_in_cache: - all_posts = [deserialize_post(el) for el in cache_results] - return [el for el in all_posts if el] + all_posts = [ + deserialize_post(el) + for el + in cache_results + ] + + return [ + el + for el + in all_posts + if el + ] query = """ WITH input_values (service, "user", id) AS ( @@ -129,12 +185,44 @@ def get_post_multiple(input_, reload=False): SELECT row_to_json(x) as post FROM ( WITH main_post AS ( - SELECT * - FROM posts - WHERE service = iv.service - AND "user" = iv."user" - AND id = iv.id - AND ("user", service) NOT IN (SELECT id, service FROM dnp) + SELECT + id, + "user", + service, + title, + content, + embed, + shared_file, + ( + CASE service + WHEN 'fanbox' + THEN NULL + ELSE added + END + ) AS added, + published, + edited, + file, + attachments, + poll, + captions, + tags + FROM + posts + WHERE + service = iv.service + AND + "user" = iv."user" + AND + id = iv.id + AND + ("user", service) NOT IN ( + SELECT + id, + service + FROM + dnp + ) ) SELECT main_post.*, @@ -212,19 +300,37 @@ def get_post_multiple(input_, reload=False): return full_result -def get_post_by_id(post_id, service, reload=True): +def get_post_by_id(post_id: str, service: str, reload=True): key = f"post_by_id:{service}:{post_id}" - query = 'select id, service, "user" from posts where id = %s and service = %s' - return cached_query(query, key, (post_id, service), reload=reload, single=True) + params = dict( + post_id=post_id, + service=service + ) + query = """ + SELECT + id, + service, + "user" + FROM + posts + WHERE + id = %(post_id)s + AND + service = %(service)s + """ + + return cached_query(query, key, params, reload=reload, single=True) -def get_posts_incomplete_rewards(post_id, artist_id, service, reload=False): - key = f"posts_incomplete_rewards:{service}:{post_id}" # todo add artist if other service needs +def get_posts_incomplete_rewards(post_id: str, artist_id: str, service: str, reload=False): + # todo add artist if other service needs + key = f"posts_incomplete_rewards:{service}:{post_id}" query = """ SELECT * FROM posts_incomplete_rewards WHERE id = %s AND service = %s """ + return cached_query( query, key, @@ -236,12 +342,26 @@ def get_posts_incomplete_rewards(post_id, artist_id, service, reload=False): ) -def get_post_comments(post_id, service, reload=False): - if service not in ("fanbox", "patreon"): +class TDComment(TypedDict): + id: str + post_id: str + parent_id: Optional[str] + commenter: str + service: str + content: str + added: str + published: str + deleted_at: str + commenter_name: str + + +def get_post_comments(post_id, service, reload=False) -> list[TDComment]: + if service not in ("fanbox", "patreon", "boosty"): return [] key = f"comments:{service}:{post_id}" + # we select only used fields to save memory and be faster - if service in ("fanbox", "patreon"): + if service in ("fanbox", "patreon", "boosty"): revisions_select = """COALESCE(json_agg( json_build_object( 'id', comments_revisions.revision_id @@ -269,19 +389,51 @@ def get_post_comments(post_id, service, reload=False): WHERE comments.post_id = %s AND comments.service = %s GROUP BY comments.id, comments.parent_id, comments.commenter, comments.commenter_name, comments."content", comments.published """ + return cached_query(query, key, (post_id, service), serialize_post_list, deserialize_post_list, reload) def get_all_posts_by_artist(artist_id, service, reload=False): key = f"posts_by_artist:{service}:{artist_id}" query = """ - SELECT * - FROM posts + SELECT + id, + "user", + service, + title, + content, + embed, + shared_file, + ( + CASE service + WHEN 'fanbox' + THEN NULL + ELSE added + END + ) AS added, + published, + edited, + file, + attachments, + poll, + captions, + tags + FROM + posts WHERE "user" = %s - AND service = %s - AND ("user", service) NOT IN (SELECT id, service from dnp); + AND + service = %s + AND + ("user", service) NOT IN ( + SELECT + id, + service + FROM + dnp + ); """ + return cached_query( query, key, (artist_id, service), serialize_post_list, deserialize_post_list, reload, lock_enabled=True ) @@ -290,15 +442,32 @@ def get_all_posts_by_artist(artist_id, service, reload=False): def get_artist_posts_summary(artist_id, service, offset, limit, sort="id", reload=False): """we need this to render html only so we reduce data size to half redis usage""" key = f"artist_posts_offset:{service}:{artist_id}:{offset}:{sort}:summary" - assert sort in ("id", "published DESC NULLS LAST") # extra careful building queries with strings + + # extra careful building queries with strings + assert sort in ("id", "published DESC NULLS LAST") + query = f""" - SELECT id, "user", service, title, substring("content", 1, 50), published, file, attachments - FROM posts - WHERE "user" = %s AND service = %s - ORDER BY {sort} + SELECT + id, + "user", + service, + title, + substring("content", 1, 50), + published, + file, + attachments + FROM + posts + WHERE + "user" = %s + AND + service = %s + ORDER BY + {sort} OFFSET %s LIMIT %s """ + return cached_query( query, key, @@ -312,15 +481,45 @@ def get_artist_posts_summary(artist_id, service, offset, limit, sort="id", reloa def get_artist_posts_full(artist_id, service, offset, limit, sort="id", reload=False): key = f"artist_posts_offset:{service}:{artist_id}:{offset}:{sort}:full" - assert sort in ("id", "published DESC NULLS LAST") # extra careful building queries with strings + + # extra careful building queries with strings + assert sort in ("id", "published DESC NULLS LAST") + query = f""" - SELECT* - FROM posts - WHERE "user" = %s AND service = %s - ORDER BY {sort} + SELECT + id, + "user", + service, + title, + content, + embed, + shared_file, + ( + CASE service + WHEN 'fanbox' + THEN NULL + ELSE added + END + ) AS added, + published, + edited, + file, + attachments, + poll, + captions, + tags + FROM + posts + WHERE + "user" = %s + AND + service = %s + ORDER BY + {sort} OFFSET %s LIMIT %s """ + return cached_query( query, key, @@ -335,22 +534,99 @@ def get_artist_posts_full(artist_id, service, offset, limit, sort="id", reload=F def get_artist_post_count(service, artist_id, reload=False): key = f"artist_post_count:{service}:{artist_id}" query = 'SELECT count(*) as count FROM posts WHERE "user" = %s AND service = %s' + return cached_count(query, key, (artist_id, service), reload, lock_enabled=True) -def is_post_flagged(service, artist_id, post_id, reload=False): - key = f"is_post_flagged:{service}:{artist_id}:{post_id}" - query = 'SELECT COUNT(*) FROM booru_flags WHERE id = %s AND "user" = %s AND service = %s' - return cached_count(query, key, (post_id, artist_id, service), reload) +def flag_post(service, creator_id, post_id, reason, flagger_id, flagger_ip) -> str | None: + query = """ + INSERT INTO "post_flags" ("service", "creator_id", "post_id", "reason", "contributor_id", "flagger_ip_hash") + VALUES (%s, %s, %s, %s, %s, %s) + ON CONFLICT ("service", "creator_id", "post_id", "contributor_id") + DO UPDATE SET "reason" = EXCLUDED."reason"; + """ + + flagger_ip_hash = uuid.UUID(hashlib.sha256(flagger_ip.encode()).hexdigest()[:32]) + params = (service, creator_id, post_id, reason, flagger_id, flagger_ip_hash) + + cur = get_cursor() + cur.execute(query, params) + + return is_post_flagged(service, creator_id, post_id, reload=True) + +def is_post_flagged(service, creator_id, post_id, reload=False) -> str | None: + key = f"is_post_flagged:{service}:{creator_id}:{post_id}" + query = 'SELECT MAX(reason) FROM post_flags WHERE post_id = %s AND creator_id = %s AND service = %s' + reason_int = cached_query(query, key, (post_id, creator_id, service,), unsafe_dumper, unsafe_loader, reload, lock_enabled=False, single=True) + return POST_FLAG_REASON_NUMBER_TO_SLUG.get((reason_int or {}).get("max")) + +class TDPostRevision(TypedDict): + revision_id: int + id: str + user: str + service: str + title: str + content: str + embed: dict + shared_file: bool | Literal["0"] + added: str + published: str + edited: str + file: Any + attachments: list[Any] + size: int + ihash: str + poll: Any + tags: list[str] + captions: Any -def get_post_revisions(service, artist_id, post_id, reload=False): +def get_post_revisions(service: str, artist_id: str, post_id: str, reload=False) -> list[TDPostRevision]: key = f"post_revisions:{service}:{artist_id}:{post_id}" - query = 'SELECT * FROM revisions WHERE service = %s AND "user" = %s AND id = %s order by revision_id desc' + params = dict( + service=service, + artist_id=artist_id, + post_id=post_id + ) + query = """ + SELECT + revision_id, + id, + "user", + service, + title, + content, + embed, + shared_file, + ( + CASE service + WHEN 'fanbox' + THEN NULL + ELSE added + END + ) AS added, + published, + edited, + file, + attachments, + poll, + tags, + captions + FROM + revisions + WHERE + service = %(service)s + AND + "user" = %(artist_id)s + AND + id = %(post_id)s + ORDER BY + revision_id DESC + """ return cached_query( query, key, - (service, artist_id, post_id), + params, serialize_post_list, deserialize_post_list, reload, @@ -381,14 +657,37 @@ def get_fileserver_for_value(value: str) -> str: return "" -def get_render_data_for_posts(posts): +type TDPreview = Union[TDPreviewThumbnail, TDPreviewEmbed] + + +class TDPreviewThumbnail(TypedDict): + type: Literal["thumbnail"] + server: str + name: str + path: str + + +class TDPreviewEmbed(TypedDict): + type: Literal["embed"] + url: str + subject: str + description: str + + +class TDAttachament(TypedDict): + server: str + name: str + path: str + + +def get_render_data_for_posts(posts: Sequence[Post]) -> tuple[list[TDPreview], list[TDAttachament], list[bool]]: result_previews = [] result_attachments = [] result_is_image = [] for post in posts: - previews = [] - attachments = [] + previews: list[TDPreview] = [] + attachments: list[TDAttachament] = [] if "path" in post["file"]: if images_pattern.search(post["file"]["path"]): result_is_image.append(True) @@ -444,3 +743,22 @@ def get_render_data_for_posts(posts): result_attachments.append(attachments) return result_previews, result_attachments, result_is_image + + +img_replace_patterns = re.compile(pattern=r']*?src="([^"]+)"[^>]*>') + + +def patch_inline_img(content): + return img_replace_patterns.sub(replace_img_tags, content) + + +def replace_img_tags(match): + src = match.group(1) + if not src.startswith("/data"): + src = "/data" + src + from src.config import Configuration + new_src = Configuration().webserver["ui"]["files_url_prepend"]["thumbnails_base_url"] + "/thumbnail" + src + server = get_fileserver_for_value(src.split("?")[0]) + # return match.group(0).replace(src, new_src) + + return f'' diff --git a/src/lib/posts.py b/src/lib/posts.py index 9358ed5..c1fb006 100644 --- a/src/lib/posts.py +++ b/src/lib/posts.py @@ -2,7 +2,7 @@ import base64 import itertools from dataclasses import dataclass from datetime import datetime, timedelta -from typing import Optional, TypedDict +from typing import Optional, TypedDict, Any from src.config import Configuration from src.internals.cache.redis import get_conn @@ -26,25 +26,49 @@ class Post(TypedDict): edited: datetime file: dict attachments: list[dict] + poll: dict + captions: Any + tags: list[str] + incomplete_rewards: Optional[str] class PostWithFavCount(Post): fav_count: int +POST_FLAG_REASON_NUMBER_TO_SLUG = { + -2: "delete-copyright", + -1: "delete-abuse", + 1: "missing-password", + 2: "offsite-expired", + 10: "post-changed", + 20: "corrupted-files", + 21: "missing-files", + 11: "stale-comments", + 12: "formatting-error", + 8: "reason-other", +} + +POST_FLAG_REASON_SLUG_TO_NUMBER = {v:k for k,v in POST_FLAG_REASON_NUMBER_TO_SLUG.items()} + +POST_FLAG_CUT_OFF = 0 def count_all_posts(reload=False) -> int: key = "global_post_count" query = 'SELECT COUNT(*) FROM posts WHERE ("user", service) NOT IN (SELECT id, service from dnp)' + return cached_count(query, key, reload=reload, ex=6000, lock_enabled=True) def count_all_posts_for_query(q: str, reload=False) -> int: q = " OR ".join(x.lower() for x in q.strip().split(" OR ")) + if q == "": return count_all_posts(reload=reload) + key = f"global_post_count_for_query:{base64.b64encode(q.encode()).decode()}" query = """ - SET random_page_cost = 0.0001; + BEGIN; + SET LOCAL random_page_cost = 0.0001; SET LOCAL statement_timeout = 10000; SELECT COUNT(*) FROM posts @@ -53,17 +77,22 @@ def count_all_posts_for_query(q: str, reload=False) -> int: SELECT id, service FROM dnp ); + COMMIT; """ - return cached_count(query, key, (q,), reload, prepare=False, client_bind=True, sets_to_fetch=[2], lock_enabled=True) + + return cached_count(query, key, (q,), reload, prepare=False, client_bind=True, sets_to_fetch=[3], lock_enabled=True) def count_all_posts_for_tag(tags: list[str], service: Optional[str] = None, artist_id: Optional[str] = None) -> int: b = base64.b64encode(f"==TAG==\0{tags}".encode()).decode() key = f"global_post_count_for_query:{b}" query = """ - SELECT COUNT(*) - FROM POSTS - WHERE "tags" @> %s::citext[] + SELECT + COUNT(*) + FROM + POSTS + WHERE + "tags" @> %s::citext[] """ params = (tags,) @@ -80,16 +109,31 @@ def get_all_posts_summary(offset: int, limit=50, reload=False, cache_ttl=None): # we need this version to reduce redis size and bandwidth in half key = f"all_posts:summary:{limit}:{offset}" query = """ - SELECT id, "user", service, title, substring("content", 1, 50), published, file, attachments - FROM posts - WHERE ("user", service) NOT IN (SELECT id, service from dnp) - ORDER BY added DESC + SELECT + id, + "user", + service, + title, + substring("content", 1, 50), + published, + file, + attachments + FROM + posts + WHERE + ("user", service) NOT IN ( + SELECT id, service from dnp + ) + ORDER BY + added DESC OFFSET %s LIMIT %s """ extra = {} + if cache_ttl: extra["ex"] = cache_ttl + return cached_query( query, key, (offset, limit), serialize_dict_list, deserialize_dict_list, reload, lock_enabled=True, **extra ) @@ -98,13 +142,44 @@ def get_all_posts_summary(offset: int, limit=50, reload=False, cache_ttl=None): def get_all_posts_full(offset: int, limit=50, reload=False): key = f"all_posts:full:{limit}:{offset}" query = """ - SELECT * - FROM posts - WHERE ("user", service) NOT IN (SELECT id, service from dnp) - ORDER BY added DESC + SELECT + id, + "user", + service, + title, + content, + embed, + shared_file, + ( + CASE service + WHEN 'fanbox' + THEN NULL + ELSE added + END + ) AS added, + published, + edited, + file, + attachments, + poll, + captions, + tags + FROM + posts + WHERE + ("user", service) NOT IN ( + SELECT + id, + service + FROM + dnp + ) + ORDER BY + added DESC OFFSET %s LIMIT %s """ + return cached_query( query, key, (offset, limit), serialize_dict_list, deserialize_dict_list, reload, lock_enabled=True ) @@ -112,23 +187,40 @@ def get_all_posts_full(offset: int, limit=50, reload=False): def get_all_posts_for_query(q: str, offset: int, limit=50, reload=False): q = " OR ".join(x.lower() for x in q.strip().split(" OR ")) + if q == "": return get_all_posts_summary(0, limit, reload, cache_ttl=Configuration().cache_ttl_for_recent_posts) + key = f"all_posts_for_query:{base64.b64encode(q.encode()).decode()}:{limit}:{offset}" query = """ - SET random_page_cost = 0.0001; + BEGIN; + SET LOCAL random_page_cost = 0.0001; SET LOCAL statement_timeout = 10000; - SELECT id, "user", service, title, substring("content", 1, 50), published, file, attachments - FROM posts - WHERE (title || ' ' || content) &@~ %s - AND ("user", service) NOT IN ( - SELECT id, service - FROM dnp - ) - ORDER BY added DESC + SELECT + id, + "user", + service, + title, + substring("content", 1, 50), + published, + file, + attachments + FROM + posts + WHERE + (title || ' ' || content) &@~ %s + AND + ("user", service) NOT IN ( + SELECT id, service + FROM dnp + ) + ORDER BY + added DESC LIMIT %s OFFSET %s; + COMMIT; """ + return cached_query( query, key, @@ -138,7 +230,7 @@ def get_all_posts_for_query(q: str, offset: int, limit=50, reload=False): reload, prepare=False, client_bind=True, - sets_to_fetch=[2], + sets_to_fetch=[3], lock_enabled=True, ) @@ -146,6 +238,7 @@ def get_all_posts_for_query(q: str, offset: int, limit=50, reload=False): def get_all_channels_for_server(discord_server, reload=False): key = f"discord_channels_for_server:{discord_server}" query = "SELECT channel_id as id, name FROM discord_channels WHERE server_id = %s" + return cached_query(query, key, (discord_server,), reload=reload, ex_on_null=60, lock_enabled=True) @@ -163,6 +256,7 @@ def get_popular_posts_for_date_range( redis = get_conn() result = redis.lindex(key, page) + if result: parsed_result = deserialize_post_list(result) if parsed_result: @@ -177,6 +271,7 @@ def get_popular_posts_for_date_range( params = (start_date, end_date, pages_to_query * per_page) order_factor = "COUNT(*)" + if scale == "recent": order_factor = 'SUM((EXTRACT(EPOCH FROM ("created_at" - %s )) / EXTRACT(EPOCH FROM ( %s - %s )) ))::float' params = (start_date, end_date, start_date, *params) @@ -192,9 +287,24 @@ def get_popular_posts_for_date_range( ORDER BY fav_count DESC LIMIT %s ) - SELECT p.id, p."user", p.service, p.title, substring( p."content", 1, 50), p.published, p.file, p.attachments, tf."fav_count" - FROM "top_faves" tf - INNER JOIN "posts" p ON p."id" = tf."post_id" and p."service" = tf."service"; + SELECT + p.id, + p."user", + p.service, + p.title, + substring( p."content", 1, 50), + p.published, + p.file, + p.attachments, + tf."fav_count" + FROM + "top_faves" AS tf + INNER JOIN + "posts" AS p + ON + p."id" = tf."post_id" + AND + p."service" = tf."service"; """ result = cached_query( @@ -208,6 +318,7 @@ def get_popular_posts_for_date_range( cache_store_method="rpush", lock_enabled=True, ) + return (result or [])[(page * per_page) : ((page + 1) * per_page)] @@ -216,11 +327,35 @@ def get_tagged_posts( ) -> list[Post]: key = f"tagged_posts:{tags}:{service}:{artist_id}:{offset}" query = """ - SELECT * - FROM "posts" - WHERE "tags" @> %s::citext[] + SELECT + id, + "user", + service, + title, + content, + embed, + shared_file, + ( + CASE service + WHEN 'fanbox' + THEN NULL + ELSE added + END + ) AS added, + published, + edited, + file, + attachments, + poll, + captions, + tags + FROM + "posts" + WHERE + "tags" @> %s::citext[] """ params: tuple[...] = (tags,) + if service and artist_id: query += """ AND "service" = %s AND "user" = %s ORDER BY published DESC @@ -244,6 +379,7 @@ class Tag: def get_all_tags(service: Optional[str] = None, creator_id: Optional[str] = None) -> list[Tag]: if creator_id and not service: raise Exception("Must be used with both creator_id and service") + key = f"tags:{service or ""}:{creator_id or ""}" query = f""" SELECT {"tag" if creator_id else "lower(tag)"} as tag, COUNT(1) AS post_count @@ -262,4 +398,5 @@ def get_all_tags(service: Optional[str] = None, creator_id: Optional[str] = None LIMIT 2000 """ ex = int(timedelta(hours=(6 if creator_id else 24)).total_seconds()) + return cached_query(query, key, params, ex=ex) diff --git a/src/pages/account/__init__.py b/src/pages/account/__init__.py deleted file mode 100644 index 681decc..0000000 --- a/src/pages/account/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .blueprint import account_bp diff --git a/src/pages/account/administrator/__init__.py b/src/pages/account/administrator/__init__.py deleted file mode 100644 index 1ab7734..0000000 --- a/src/pages/account/administrator/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .blueprint import administrator diff --git a/src/pages/account/administrator/blueprint.py b/src/pages/account/administrator/blueprint.py deleted file mode 100644 index cb6aa3f..0000000 --- a/src/pages/account/administrator/blueprint.py +++ /dev/null @@ -1,157 +0,0 @@ -from flask import Blueprint, abort, g, make_response, render_template, request - -from src.lib.administrator import change_account_role, get_accounts -from src.lib.pagination import Pagination -from src.types.account import Account, AccountRoleChange, visible_roles - -from .types import Accounts, Dashboard, Role_Change - -# from datetime import datetime - -administrator = Blueprint( - "admin", - __name__, -) - - -@administrator.before_request -def check_credentials(): - account: Account = g.get("account") - if account.role != "administrator": - return abort(404) - - -@administrator.get("/administrator") -def get_admin(): - props = Dashboard() - - response = make_response( - render_template( - "account/administrator/dashboard.html", - props=props, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@administrator.get("/administrator/accounts") -def get_accounts_list(): - queries = request.args.to_dict() - queries["name"] = queries["name"] if queries.get("name") else None - - # transform `role` query into a list for db query - if queries.get("role") and queries["role"] != "all": - queries["role"] = [queries["role"]] - else: - queries["role"] = visible_roles - - pagination = Pagination(request) - accounts = get_accounts(pagination, queries) - props = Accounts( - accounts=accounts, - role_list=visible_roles, - pagination=pagination, - ) - - response = make_response( - render_template( - "account/administrator/accounts.html", - props=props, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@administrator.post("/administrator/accounts") -def change_account_roles(): - form_dict = request.form.to_dict(flat=False) - # convert ids to `int` - candidates = dict( - moderator=[int(id) for id in form_dict.get("moderator")] if form_dict.get("moderator") else [], - consumer=[int(id) for id in form_dict.get("consumer")] if form_dict.get("consumer") else [], - ) - - if candidates["moderator"]: - change_account_role( - candidates["moderator"], - AccountRoleChange( - old_role="consumer", - new_role="moderator", - ), - ) - if candidates["consumer"]: - change_account_role( - candidates["consumer"], - AccountRoleChange( - old_role="moderator", - new_role="consumer", - ), - ) - - props = Role_Change() - - response = make_response(render_template("success.html", props=props), 200) - response.headers["Cache-Control"] = "max-age=0, private, must-revalidate" - - return response - - -# @admin.route('/admin/accounts/', methods= ['GET']) -# def get_account_info(account_id: str): -# """ -# Detailed account page. -# """ -# account = get_account(account_id) -# props = admin_props.Account( -# account= account -# ) - -# response = make_response(render_template( -# 'admin/account_info.html', -# props = props, -# ), 200) -# response.headers['Cache-Control'] = 's-maxage=60' -# return response - -# @admin.route('/admin/accounts/', methods= ['POST']) -# def change_account(): -# pass - -# @admin.route('/admin/accounts//files') -# def get_account_files(account_id: str): -# """ -# The lists of approved/rejected/queued files for the given account. -# """ -# files = [] -# account = {} - -# props = admin_props.Account_Files( -# account= account, -# files= files -# ) -# response = make_response(render_template( -# 'admin/account_files.html', -# props = props, -# ), 200) -# response.headers['Cache-Control'] = 's-maxage=60' -# return response - -# @admin.route('/admin/mods/actions', methods= ['GET']) -# def get_moderators_audits(): -# """ -# The list of moderator actions. -# """ -# actions = [] -# props = admin_props.ModeratorActions( -# actions= actions -# ) -# response = make_response(render_template( -# 'admin/mods_actions.html', -# props = props, -# ), 200) -# response.headers['Cache-Control'] = 's-maxage=60' -# return response diff --git a/src/pages/account/administrator/types.py b/src/pages/account/administrator/types.py deleted file mode 100644 index 214d68f..0000000 --- a/src/pages/account/administrator/types.py +++ /dev/null @@ -1,42 +0,0 @@ -from dataclasses import dataclass -from typing import List - -from src.internals.internal_types import PageProps -from src.lib.pagination import Pagination -from src.types.account import Account - - -@dataclass -class Dashboard(PageProps): - currentPage: str = "admin" - - -@dataclass -class Accounts(PageProps): - accounts: List[Account] - role_list: List[str] - pagination: Pagination - currentPage: str = "admin" - - -@dataclass -class Role_Change(PageProps): - redirect: str = "/account/administrator/accounts" - currentPage: str = "admin" - - -# @dataclass -# class Account_Props(PageProps): -# account: Account -# currentPage: str = 'admin' - -# @dataclass -# class Account_Files: -# account: Account -# files: List[Dict] -# currentPage: str = 'admin' - -# @dataclass -# class ModeratorsActions(): -# actions: List[Dict] -# currentPage: str = 'admin' diff --git a/src/pages/account/blueprint.py b/src/pages/account/blueprint.py deleted file mode 100644 index 19b4a15..0000000 --- a/src/pages/account/blueprint.py +++ /dev/null @@ -1,270 +0,0 @@ -import re -from json import JSONDecodeError - -import orjson -from flask import Blueprint, current_app, flash, g, make_response, redirect, render_template, request, session, url_for - -from src.config import Configuration -from src.lib.account import ( - attempt_login, - create_account, - get_saved_key_import_ids, - get_saved_keys, - revoke_saved_keys, - change_password as db_change_password, -) -from src.lib.notification import count_account_notifications, get_account_notifications, set_notifications_as_seen -from src.lib.security import is_password_compromised -from src.types.account import Account -from src.types.props import SuccessProps -from src.utils.utils import set_query_parameter -from src.utils.decorators import require_login - -from .administrator import administrator -from .moderator import moderator -from .types import AccountPageProps, NotificationsProps, ServiceKeysProps - -USERNAME_REGEX = re.compile(r"^[a-z0-9_@+.\-]{3,15}$") -account_bp = Blueprint("account", __name__) - - -@account_bp.get("/account") -def get_account(): - account: Account = g.get("account") - if not account: - return redirect(url_for("account.get_login")) - - if Configuration().enable_notifications: - notifications_count = count_account_notifications(account.id) - else: - notifications_count = 0 - props = AccountPageProps(account=account, notifications_count=notifications_count) - - return make_response(render_template("account/home.html", props=props), 200) - - -@account_bp.get("/account/notifications") -def get_notifications(): - account: Account = g.get("account") - if not account: - return redirect(url_for("account.get_login")) - - if Configuration().enable_notifications: - notifications = get_account_notifications(account.id) - else: - notifications = [] - props = NotificationsProps(notifications=notifications) - - seen_notif_ids = [notification.id for notification in notifications if not notification.is_seen] - set_notifications_as_seen(seen_notif_ids) - - return make_response(render_template("account/notifications.html", props=props), 200) - - -@account_bp.get("/account/keys") -def get_account_keys(): - account: Account = g.get("account") - if not account: - return redirect(url_for("account.get_login")) - - saved_keys = get_saved_keys(account.id) - props = ServiceKeysProps(service_keys=saved_keys) - - saved_session_key_import_ids = [] - for key in saved_keys: - saved_session_key_import_ids.append(get_saved_key_import_ids(key.id)) - - response = make_response( - render_template("account/keys.html", props=props, import_ids=saved_session_key_import_ids), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@account_bp.post("/account/keys") -def revoke_service_keys(): - account: Account = g.get("account") - if not account: - return redirect(url_for("account.get_login")) - - keys_dict = request.form.to_dict(flat=False) - keys_for_revocation = [int(key) for key in keys_dict["revoke"]] if keys_dict.get("revoke") else [] - - revoke_saved_keys(keys_for_revocation, account.id) - - props = SuccessProps(currentPage="account", redirect="/account/keys") - - response = make_response(render_template("success.html", props=props), 200) - return response - - -@account_bp.get("/account/login") -def get_login(): - props = {"currentPage": "login"} - location = request.form.get("location", request.args.get("location", url_for("artists.list"))) - - if account := g.get("account"): - return redirect(set_query_parameter(location, {"logged_in": "yes", "role": account.role})) - - response = make_response( - render_template( - "account/login.html", - location=location, - props=props, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@account_bp.post("/account/login") -def post_login(): - location = request.form.get("location", request.args.get("location", url_for("artists.list"))) - - if account := g.get("account"): - return redirect(set_query_parameter(location, {"logged_in": "yes", "role": account.role})) - - username = request.form.get("username", "").replace("\x00", "") - password = request.form.get("password", "") - - if account := attempt_login(username, password): - return redirect(set_query_parameter(location, {"logged_in": "yes", "role": account.role})) - - return redirect(url_for("account.get_login", location=location)) - - - -@account_bp.route("/account/logout") -def logout(): - if "account_id" in session: - session.pop("account_id") - return redirect(url_for("artists.list")) - - -@account_bp.get("/account/register") -def get_register(): - props = { - "currentPage": "login", - "username_regex": USERNAME_REGEX.pattern, - } - location = request.form.get("location", request.args.get("location", url_for("artists.list"))) - - if g.get("account"): - return redirect(location) - - return make_response(render_template("account/register.html", props=props, location=location), 200) - - -@account_bp.post("/account/register") -def post_register(): - location = request.form.get("location", request.args.get("location", url_for("artists.list"))) - - username = request.form.get("username", "").replace("\x00", "").strip() - password = request.form.get("password", "").strip() - favorites_json = request.form.get("favorites", "[]") - confirm_password = request.form.get("confirm_password", "").strip() - - favorites = [] - if favorites_json != "": - try: - favorites = orjson.loads(favorites_json) - except JSONDecodeError: - pass - - errors = False - if username == "": - flash("Username cannot be empty") - errors = True - - if not USERNAME_REGEX.match(username): - flash("Invalid username") - errors = True - - if password == "": - flash("Password cannot be empty") - errors = True - - if password != confirm_password: - flash("Passwords do not match") - errors = True - - if current_app.config.get("ENABLE_PASSWORD_VALIDATOR") and is_password_compromised(password): - flash( - "We've detected that password was compromised in a data breach on another site. Please choose a different password." - ) - errors = True - - if not errors: - success = create_account(username, password, favorites) - if not success: - flash("Username already taken") - errors = True - - if not errors: - account = attempt_login(username, password) - if account is None: - current_app.logger.warning("Error logging into account immediately after creation") - flash("Account created successfully.") - return redirect(set_query_parameter(location, {"logged_in": "yes"})) - else: - flash("Account created successfully.") - return redirect(set_query_parameter(location, {"logged_in": "yes", "role": account.role})) - - return redirect(url_for("account.get_register", location=location)) - - -@account_bp.get("/account/change_password") -@require_login -def change_password(user: Account): - props = {"currentPage": "changepassword"} - - tmpl = render_template("account/change_password.html", props=props) - response = make_response(tmpl, 200) - response.headers["Cache-Control"] = "s-maxage=3600" - return response - - -@account_bp.post("/account/change_password") -@require_login -def post_change_password(user: Account): - current_password = request.form.get("current-password", "").strip() - new_password = request.form.get("new-password", "").strip() - new_password_conf = request.form.get("new-password-confirmation", "").strip() - - errors = False - - if not new_password: - flash("Password cannot be empty") - errors = True - - if new_password != new_password_conf: - flash("Passwords do not match") - errors = True - - if current_app.config.get("ENABLE_PASSWORD_VALIDATOR") and is_password_compromised(new_password): - flash( - "We've detected that password was compromised in a data breach on another site. Please choose a different password." - ) - errors = True - - if not errors: - if db_change_password(user.id, current_password, new_password): - flash("Password changed") - return redirect(url_for("account.get_account")) - else: - flash("Current password is invalid") - - return redirect(url_for("account.change_password")) - - -@account_bp.get("/.well-known/change-password") -def well_known_change_password(): - response = redirect(url_for("account.change_password")) - response.headers["Cache-Control"] = "s-maxage=604800" - return response - - -account_bp.register_blueprint(administrator, url_prefix="/account") -account_bp.register_blueprint(moderator, url_prefix="/account") diff --git a/src/pages/account/moderator/__init__.py b/src/pages/account/moderator/__init__.py deleted file mode 100644 index 1fe7f06..0000000 --- a/src/pages/account/moderator/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .blueprint import moderator diff --git a/src/pages/account/moderator/blueprint.py b/src/pages/account/moderator/blueprint.py deleted file mode 100644 index f037c65..0000000 --- a/src/pages/account/moderator/blueprint.py +++ /dev/null @@ -1,59 +0,0 @@ -from flask import Blueprint, abort, make_response, render_template, g - -from src.lib.artist import get_unapproved_links_with_artists - -from .types import mod_props - -moderator = Blueprint("mod", __name__) - - -@moderator.before_request -def check_credentials(): - account = g.get("account") - if not account or (account.role != "moderator" and account.role != "administrator"): - return abort(code=404) - - -@moderator.get("/moderator") -def get_dashboard(): - props = mod_props.Dashboard() - - response = make_response( - render_template( - "account/moderator/dashboard.html", - props=props, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@moderator.route("/moderator/tasks/creator_links") -def get_creator_links(): - links = get_unapproved_links_with_artists() - props = {"currentPage": "mod"} - - response = make_response( - render_template( - "account/moderator/creator_links.html", - links=links, - props=props, - ), - 200 - ) - return response - - -# @moderator.route("/mod/tasks/files") -# def get_files(): -# files = [] -# props = mod_props.Files( -# files= files -# ) -# response = make_response(render_template( -# 'moderator_files.html', -# props = props, -# ), 200) -# response.headers['Cache-Control'] = 's-maxage=60' -# return response diff --git a/src/pages/account/moderator/types.py b/src/pages/account/moderator/types.py deleted file mode 100644 index fd2c47f..0000000 --- a/src/pages/account/moderator/types.py +++ /dev/null @@ -1,21 +0,0 @@ -from typing import Dict, List - - -class Dashboard: - def __init__(self) -> None: - self.current_page = "mod" - - -class Files: - def __init__(self, files: List[Dict]) -> None: - self.current_page = "mod" - self.files = files - - -class Moderator: - def __init__(self) -> None: - self.Dashboard = Dashboard - self.Files = Files - - -mod_props = Moderator() diff --git a/src/pages/api/__init__.py b/src/pages/api/__init__.py index 46e9682..49f2888 100644 --- a/src/pages/api/__init__.py +++ b/src/pages/api/__init__.py @@ -1,47 +1,21 @@ -import pathlib +from flask import Blueprint, Response -import orjson -import yaml -from flask import Blueprint, make_response, render_template, send_from_directory -from yaml import CLoader as Loader +from src.config import Configuration from src.pages.api.v1 import v1api_bp +from src.pages.api.v2 import v2api_bp api_bp = Blueprint("api", __name__, url_prefix="/api") api_bp.register_blueprint(v1api_bp) +api_bp.register_blueprint(v2api_bp) +# set up cors handler for development +if (Configuration().development_mode): + @api_bp.after_request + def aug_api_response(response: Response): + response.headers["Access-Control-Allow-Origin"] = Configuration().webserver["site"] + response.headers["Access-Control-Allow-Headers"] = "Content-Type" + response.headers["Access-Control-Allow-Credentials"] = "true" -@api_bp.get("/swagger_schema") -def swagger_schema(): - response = make_response( - render_template( - "swagger_schema.html", - props=dict( - json_spec=orjson.dumps( - yaml.load(open(pathlib.Path(__file__).parent / "schema.yaml", "r"), Loader=Loader) - ).decode() - ), - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@api_bp.get("/swagger_schema.yaml") -def swagger_schema_yaml(): - return send_from_directory(pathlib.Path(__file__).parent, "schema.yaml") - - -@api_bp.get("/schema") -def api_schema(): - response = make_response( - render_template( - "schema.html", - props=dict(), - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response + return response diff --git a/src/pages/api/schema.yaml b/src/pages/api/schema.yaml deleted file mode 100644 index a2692ab..0000000 --- a/src/pages/api/schema.yaml +++ /dev/null @@ -1,1378 +0,0 @@ -openapi: 3.0.1 -info: - title: Kemono API - version: 1.0.0 -contact: - email: contact@kemono.party -servers: - - url: https://kemono.su/api/v1 - - url: https://coomer.su/api/v1 -tags: - - name: Posts - description: Version one - - name: Creators - - name: Comments - - name: Post Flagging - description: Flag post for re-import - - name: Discord - - name: Favorites - - name: File Search - - name: Misc -paths: - /creators.txt: - get: - tags: - - Posts - summary: List All Creators - description: List all creators with details. I blame DDG for .txt. - responses: - '200': - description: List of all creators - content: - application/json: - schema: - type: array - items: - type: object - properties: - favorited: - type: integer - description: The number of times this creator has been favorited - id: - type: string - description: The ID of the creator - indexed: - type: number - description: Timestamp when the creator was indexed, Unix time as integer - name: - type: string - description: The name of the creator - service: - type: string - description: The service for the creator - updated: - type: number - description: Timestamp when the creator was last updated, Unix time as integer - example: - - favorited: 1 - id: '21101760' - indexed: 1672534800 - name: RAIGYO - service: fanbox - updated: 1672534800 - /posts: - get: - tags: - - Posts - summary: List recent posts - description: List of recently imported posts - parameters: - - name: q - in: query - description: Search query - schema: - type: string - minLength: 3 - - name: o - in: query - description: Result offset, stepping of 50 is enforced - schema: - type: integer - responses: - '200': - description: List of recently added posts - content: - application/json: - schema: - type: array - items: - type: object - properties: - id: - type: string - user: - type: string - service: - type: string - title: - type: string - content: - type: string - embed: - type: object - shared_file: - type: boolean - added: - type: string - format: date-time - published: - type: string - format: date-time - edited: - type: string - format: date-time - file: - type: object - properties: - name: - type: string - path: - type: string - attachments: - type: array - items: - type: object - properties: - name: - type: string - path: - type: string - example: - - id: '1836570' - user: '6570768' - service: fanbox - title: 今日はFANBOXを始まりました! - content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    - embed: { } - shared_file: false - added: '2021-03-30T18:00:05.973913' - published: '2021-01-24T17:54:38' - edited: '2021-01-24T18:46:15' - file: - name: a99d9674-5490-400e-acca-4bed99590699.jpg - path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg - attachments: [ ] - - id: '1836649' - user: '6570768' - service: fanbox - title: 忍ちゃん 脇コキ差分 - content: '' - embed: { } - shared_file: false - added: '2021-03-30T17:59:57.815397' - published: '2021-01-24T18:23:12' - edited: '2023-01-04T14:45:19' - file: - name: 4c5615f9-be74-4fa7-b88d-168fd37a2824.jpg - path: /d0/3c/d03c893927521536646619f5fb33426aa4b82dc12869865d6d666932755d9acd.jpg - attachments: - - name: 9cc982e4-1d94-4a1a-ac62-3dddd29f881c.png - path: /d7/4d/d74d1727f2c3fcf7a7cc2d244d677d93b4cc562a56904765e4e708523b34fb4c.png - - name: ab0e17d7-52e5-42c2-925b-5cfdb451df0c.png - path: /1b/67/1b677a8c0525e386bf2b2f013e36e29e4033feb2308798e4e5e3780da6c0e815.png - /{service}/user/{creator_id}/profile: - get: - summary: Get a creator - tags: - - Creators - parameters: - - name: service - in: path - description: The service where the creator is located - required: true - schema: - type: string - - name: creator_id - in: path - description: The ID of the creator - required: true - schema: - type: string - responses: - '200': - description: Creator details retrieved successfully - content: - application/json: - schema: - type: object - properties: - id: - type: string - description: The ID of the creator - public_id: - type: string - nullable: true - description: The public ID of the creator - service: - type: string - description: The service where the creator is located - name: - type: string - description: The creator's display name - indexed: - type: string - format: date-time - description: The time the creator was last indexed - updated: - type: string - format: date-time - description: The time the creator was last updated - '404': - description: The creator could not be found - content: - application/json: - schema: - type: object - properties: - error: - type: string - description: The error message - enum: ["Creator not found."] - /{service}/user/{creator_id}: - get: - summary: Get a list of creator posts - tags: - - Posts - parameters: - - name: service - in: path - description: The service where the post is located - required: true - schema: - type: string - - name: creator_id - in: path - description: The ID of the creator - required: true - schema: - type: string - - name: q - in: query - description: Search query - schema: - type: string - minLength: 3 - - name: o - in: query - description: Result offset, stepping of 50 is enforced - schema: - type: integer - responses: - '200': - description: Post details retrieved successfully - content: - application/json: - schema: - type: array - items: - type: object - properties: - id: - type: string - user: - type: string - service: - type: string - title: - type: string - content: - type: string - embed: - type: object - shared_file: - type: boolean - added: - type: string - format: date-time - published: - type: string - format: date-time - edited: - type: string - format: date-time - file: - type: object - properties: - name: - type: string - path: - type: string - attachments: - type: array - items: - type: object - properties: - name: - type: string - path: - type: string - example: - - id: '1836570' - user: '6570768' - service: fanbox - title: 今日はFANBOXを始まりました! - content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    - embed: { } - shared_file: false - added: '2021-03-30T18:00:05.973913' - published: '2021-01-24T17:54:38' - edited: '2021-01-24T18:46:15' - file: - name: a99d9674-5490-400e-acca-4bed99590699.jpg - path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg - attachments: [ ] - - id: '1836649' - user: '6570768' - service: fanbox - title: 忍ちゃん 脇コキ差分 - content: '' - embed: { } - shared_file: false - added: '2021-03-30T17:59:57.815397' - published: '2021-01-24T18:23:12' - edited: '2023-01-04T14:45:19' - file: - name: 4c5615f9-be74-4fa7-b88d-168fd37a2824.jpg - path: /d0/3c/d03c893927521536646619f5fb33426aa4b82dc12869865d6d666932755d9acd.jpg - attachments: - - name: 9cc982e4-1d94-4a1a-ac62-3dddd29f881c.png - path: /d7/4d/d74d1727f2c3fcf7a7cc2d244d677d93b4cc562a56904765e4e708523b34fb4c.png - - name: ab0e17d7-52e5-42c2-925b-5cfdb451df0c.png - path: /1b/67/1b677a8c0525e386bf2b2f013e36e29e4033feb2308798e4e5e3780da6c0e815.png - '400': - description: Offset provided which is not a multiple of 50 - '404': - description: The creator could not be found - content: - application/json: - schema: - type: object - properties: - error: - type: string - description: The error message - enum: ["Creator not found."] - /{service}/user/{creator_id}/announcements: - get: - summary: Get creator announcements - tags: - - Posts - parameters: - - name: service - in: path - required: true - description: The service name - schema: - type: string - - name: creator_id - in: path - required: true - description: The creator's ID - schema: - type: string - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: array - items: - type: object - properties: - service: - type: string - user_id: - type: string - hash: - type: string - description: sha256 - content: - type: string - added: - type: string - format: date-time - description: isoformat UTC - example: - - service: patreon - user_id: '8693043' - hash: 820b7397c7f75efb13c4a8aa5d4aacfbb200749f3e1cec16e9f2951d158be8c2 - content: Hey guys, thank you so much for your support, that means a lot to me! - added: '2023-01-31T05:16:15.462035' - '404': - description: Artist not found - /{service}/user/{creator_id}/fancards: - get: - summary: Get fancards by creator, fanbox only - tags: - - Posts - parameters: - - name: service - in: path - required: true - description: The service name, has to be "fanbox" - schema: - type: string - - name: creator_id - in: path - required: true - description: The creator's ID - schema: - type: string - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: array - items: - type: object - properties: - id: - type: integer - user_id: - type: string - file_id: - type: integer - hash: - type: string - mtime: - type: string - format: date-time - ctime: - type: string - format: date-time - mime: - type: string - ext: - type: string - added: - type: string - format: date-time - size: - type: integer - ihash: - type: string - example: - - id: 108058645 - user_id: '3316400' - file_id: 108058645 - hash: 727bf3f0d774a98c80cf6c76c3fb0e049522b88eb7f02c8d3fc59bae20439fcf - mtime: '2023-05-23T15:09:43.941195' - ctime: '2023-05-23T15:09:43.941195' - mime: image/jpeg - ext: .jpg - added: '2023-05-23T15:09:43.960578' - size: 339710 - ihash: null - - id: 103286760 - user_id: '3316400' - file_id: 103286760 - hash: 8b0d0f1be38efab9306b32c7b14b74ddd92a2513026c859a280fe737980a467d - mtime: '2023-04-26T14:16:53.205183' - ctime: '2023-04-26T14:16:53.205183' - mime: image/jpeg - ext: .jpg - added: '2023-04-26T14:16:53.289143' - size: 339764 - ihash: null - '404': - description: Artist not found - /{service}/user/{creator_id}/links: - get: - summary: Get a creator's linked accounts - tags: - - Creators - parameters: - - name: service - in: path - description: The service where the creator is located - required: true - schema: - type: string - - name: creator_id - in: path - description: The ID of the creator - required: true - schema: - type: string - responses: - '200': - description: Linked accounts retrieved successfully - content: - application/json: - schema: - type: array - items: - type: object - properties: - id: - type: string - description: The ID of the creator - public_id: - type: string - nullable: true - description: The public ID of the creator - service: - type: string - description: The service where the creator is located - name: - type: string - description: The creator's display name - indexed: - type: string - format: date-time - description: The time the creator was last indexed - updated: - type: string - format: date-time - description: The time the creator was last updated - '404': - description: The creator could not be found - content: - application/json: - schema: - type: object - properties: - error: - type: string - description: The error message - enum: ["Creator not found."] - /{service}/user/{creator_id}/post/{post_id}: - get: - summary: Get a specific post - tags: - - Posts - parameters: - - name: service - in: path - required: true - description: The service name - schema: - type: string - - name: creator_id - in: path - required: true - description: The creator's ID - schema: - type: string - - name: post_id - in: path - required: true - description: The post ID - schema: - type: string - responses: - '200': - description: Successful response - content: - application/json: - schema: - type: object - properties: - id: - type: string - user: - type: string - service: - type: string - title: - type: string - content: - type: string - embed: - type: object - shared_file: - type: boolean - added: - type: string - format: date-time - published: - type: string - format: date-time - edited: - type: string - format: date-time - file: - type: object - properties: - name: - type: string - path: - type: string - attachments: - type: array - items: - type: object - properties: - name: - type: string - path: - type: string - next: - type: string - prev: - type: string - example: - id: '1836570' - user: '6570768' - service: fanbox - title: 今日はFANBOXを始まりました! - content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    - embed: { } - shared_file: false - added: '2021-03-30T18:00:05.973913' - published: '2021-01-24T17:54:38' - edited: '2021-01-24T18:46:15' - file: - name: a99d9674-5490-400e-acca-4bed99590699.jpg - path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg - attachments: [ ] - next: null - prev: '1836649' - '404': - description: Post not found - /discord/channel/{channel_id}: - get: - tags: - - Discord - summary: Get Discord channel posts by offset - parameters: - - name: channel_id - in: path - description: ID of the Discord channel - required: true - schema: - type: string - - name: o - in: query - description: Result offset, stepping of 150 is enforced - schema: - type: integer - responses: - '200': - description: Discord channel found - content: - application/json: - schema: - type: array - items: - type: object - properties: - id: - type: string - author: - type: object - properties: - id: - type: string - avatar: - type: string - username: - type: string - public_flags: - type: integer - discriminator: - type: string - server: - type: string - channel: - type: string - content: - type: string - added: - type: string - format: date-time - published: - type: string - format: date-time - edited: - type: string - format: date-time - embeds: - type: array - items: { } - mentions: - type: array - items: { } - attachments: - type: array - items: - type: object - properties: - name: - type: string - path: - type: string - example: - - id: '942909658610413578' - author: - id: '421590382300889088' - avatar: 0956f3dc18eba7da9daedc4e50fb96d0 - username: Merry - public_flags: 0 - discriminator: '7849' - server: '455285536341491714' - channel: '455287420959850496' - content: '@everyone Happy Valentine’s Day! 💜✨' - added: '2022-02-15T01:26:12.708959' - published: '2022-02-14T22:26:21.027000' - edited: null - embeds: [ ] - mentions: [ ] - attachments: [ ] - - id: '942909571947712594' - author: - id: '421590382300889088' - avatar: 0956f3dc18eba7da9daedc4e50fb96d0 - username: Merry - public_flags: 0 - discriminator: '7849' - server: '455285536341491714' - channel: '455287420959850496' - content: '' - added: '2022-02-15T01:26:13.006228' - published: '2022-02-14T22:26:00.365000' - edited: null - embeds: [ ] - mentions: [ ] - attachments: - - name: sofa_03.png - path: /3b/4e/3b4ed5aabdd85b26fbbc3ee9b0e5649df69167efe26b5abc24cc2a1159f446d4.png - '404': - description: Discord channel not found - /discord/channel/lookup/{discord_server}: - get: - tags: - - Discord - summary: Lookup Discord channels - parameters: - - name: discord_server - in: path - description: Discord Server ID - required: true - schema: - type: string - responses: - '200': - description: Discord channels found - content: - application/json: - schema: - type: array - items: - type: object - properties: - id: - type: string - name: - type: string - example: - - id: '455285536341491716' - name: news - - id: '455287420959850496' - name: nyarla-lewds - '404': - description: Discord server not found - /account/favorites: - get: - tags: - - Favorites - security: - - cookieAuth: [ ] - summary: List Account Favorites - description: List account favorites (posts or creators) for the authenticated user (cookie session) - parameters: - - name: type - in: query - description: Type of favorites to list (post or creator (artist) ) - schema: - type: string - enum: - - post - - artist - responses: - '200': - description: List of account favorites - content: - application/json: - schema: - type: array - items: - type: object - properties: - faved_seq: - type: integer - description: The sequence number of the favorite - id: - type: string - description: The ID of the favorite (post or creator) - indexed: - type: string - description: Timestamp when the creator was indexed isoformat - last_imported: - type: string - description: Timestamp when the creator was last imported - name: - type: string - description: The name of the creator - service: - type: string - description: The service where the creator is located - updated: - type: string - description: Timestamp when the creator was last updated - '401': - $ref: '#/components/schemas/401' - /favorites/post/{service}/{creator_id}/{post_id}: - post: - tags: - - Favorites - security: - - cookieAuth: [ ] - summary: Add Favorite Post - description: Add a post to the user's favorite posts - parameters: - - name: service - in: path - description: Service of the post - required: true - schema: - type: string - - name: creator_id - in: path - description: The ID of the creator - required: true - schema: - type: string - - name: post_id - in: path - description: The ID of the post - required: true - schema: - type: string - responses: - '200': - description: Favorite post added successfully - content: { } - '302': - description: Redirect to login if not authenticated - content: { } - '401': - $ref: '#/components/schemas/401' - delete: - tags: - - Favorites - security: - - cookieAuth: [ ] - summary: Remove Favorite Post - description: Remove a post from the user's favorite posts - parameters: - - name: service - in: path - description: The service where the post is located - required: true - schema: - type: string - - name: creator_id - in: path - description: The ID of the creator - required: true - schema: - type: string - - name: post_id - in: path - description: The ID of the post - required: true - schema: - type: string - responses: - '200': - description: Unfavorite post removed successfully - content: { } - '302': - description: Redirect to login if not authenticated - content: { } - '401': - $ref: '#/components/schemas/401' - /favorites/creator/{service}/{creator_id}: - post: - tags: - - Favorites - security: - - cookieAuth: [ ] - summary: Add Favorite creator - description: Add an creator to the user's favorite creators - parameters: - - name: service - in: path - description: The service where the creator is located - required: true - schema: - type: string - - name: creator_id - in: path - description: The ID of the creator - required: true - schema: - type: string - responses: - '200': - description: Favorite creator added successfully - content: { } - '302': - description: Redirect to login if not authenticated - content: { } - '401': - $ref: '#/components/schemas/401' - delete: - tags: - - Favorites - security: - - cookieAuth: [ ] - summary: Remove Favorite Creator - description: Remove an creator from the user's favorite creators - parameters: - - name: service - in: path - description: The service where the creator is located - required: true - schema: - type: string - - name: creator_id - in: path - description: The ID of the creator - required: true - schema: - type: string - responses: - '200': - description: Favorite creator removed successfully - content: { } - '302': - description: Redirect to login if not authenticated - content: { } - '401': - $ref: '#/components/schemas/401' - /search_hash/{file_hash}: - get: - tags: - - File Search - summary: Lookup file by hash - parameters: - - name: file_hash - in: path - required: true - description: SHA-2 / SHA-256 - schema: - type: string - format: hex - minLength: 64 - maxLength: 64 - responses: - '200': - description: File found - content: - application/json: - schema: - type: object - properties: - id: - type: integer - hash: - type: string - mtime: - type: string - format: date-time - ctime: - type: string - format: date-time - mime: - type: string - ext: - type: string - added: - type: string - format: date-time - size: - type: integer - ihash: - type: string - posts: - type: array - items: - type: object - properties: - file_id: - type: integer - id: - type: string - user: - type: string - service: - type: string - title: - type: string - substring: - type: string - published: - type: string - format: date-time - file: - type: object - properties: - name: - type: string - path: - type: string - attachments: - type: array - items: - type: object - properties: - name: - type: string - path: - type: string - discord_posts: - type: array - items: - type: object - properties: - file_id: - type: integer - id: - type: string - server: - type: string - channel: - type: string - substring: - type: string - published: - type: string - format: date-time - embeds: - type: array - items: { } - mentions: - type: array - items: { } - attachments: - type: array - items: - type: object - properties: - name: - type: string - path: - type: string - example: - id: 40694581 - hash: b926020cf035af45a1351e0a7e2c983ebcc93b4c751998321a6593a98277cdeb - mtime: '2021-12-04T07:16:09.385539' - ctime: '2021-12-04T07:16:09.385539' - mime: image/png - ext: .png - added: '2021-12-04T07:16:09.443016' - size: 10869921 - ihash: null - posts: - - file_id: 108400151 - id: '5956097' - user: '21101760' - service: fanbox - title: Loli Bae - substring: |- - Thank you for your continued support! - いつも支援ありがとうご - published: '2023-05-14T00:00:00' - file: - name: 8f183dac-470d-4587-9657-23efe8890a7b.jpg - path: /e5/1f/e51fc831dfdac7a21cc650ad46af59340e35e2a051aed8c1e65633592f4dc11c.jpg - attachments: - - name: b644eb9c-cffa-400e-9bd6-40cccb2331ba.png - path: /5e/b3/5eb3197668ac23bd7c473d3c750334eb206b060c610e4ac5fa1a9370fd1314d9.png - - name: 17f295ba-a9f2-4034-aafc-bf74904ec144.png - path: /88/ad/88ad2ba77c89e4d7a9dbe1f9531ba3e3077a82aee2b61efa29fda122ebe1b516.png - discord_posts: - - file_id: 40694581 - id: '769704201495904286' - server: '455285536341491714' - channel: '769703874356445216' - substring: '' - published: '2020-10-24T23:29:42.049' - embeds: [ ] - mentions: [ ] - attachments: - - name: 3.png - path: /b9/26/b926020cf035af45a1351e0a7e2c983ebcc93b4c751998321a6593a98277cdeb.png - '404': - description: File not found - /{service}/user/{creator_id}/post/{post}/flag: - post: - tags: - - Post Flagging - summary: Flag a post - parameters: - - name: service - in: path - required: true - schema: - type: string - - name: creator_id - in: path - required: true - schema: - type: string - - name: post - in: path - required: true - schema: - type: string - responses: - '201': - description: Flagged successfully - content: { } - '409': - description: Already flagged - content: { } - get: - tags: - - Post Flagging - summary: Check if a Post is flagged - description: Check if a Post is flagged - parameters: - - name: service - in: path - description: The service where the post is located - required: true - schema: - type: string - - name: creator_id - in: path - description: The creator of the post - required: true - schema: - type: string - - name: post - in: path - description: The ID of the post to flag - required: true - schema: - type: string - responses: - '200': - description: The post is flagged - content: { } - '404': - description: The post has no flag - content: { } - /{service}/user/{creator_id}/post/{post_id}/revisions: - get: - tags: - - Posts - summary: List a Post's Revisions - description: List revisions of a specific post by service, creator_id, and post_id - parameters: - - name: service - in: path - description: The service where the post is located - required: true - schema: - type: string - - name: creator_id - in: path - description: The ID of the creator - required: true - schema: - type: string - - name: post_id - in: path - description: The ID of the post - required: true - schema: - type: string - responses: - '200': - description: List of post revisions - content: - application/json: - schema: - type: array - items: - type: object - properties: - revision_id: - type: integer - id: - type: string - user: - type: string - service: - type: string - title: - type: string - content: - type: string - embed: - type: object - shared_file: - type: boolean - added: - type: string - format: date-time - published: - type: string - format: date-time - edited: - type: string - format: date-time - file: - type: object - properties: - name: - type: string - path: - type: string - attachments: - type: array - items: - type: object - properties: - name: - type: string - path: - type: string - example: - - revision_id: 8059287 - id: '1836570' - user: '6570768' - service: fanbox - title: 今日はFANBOXを始まりました! - content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    - embed: { } - shared_file: false - added: '2023-09-19T13:19:57.416086' - published: '2021-01-24T17:54:38' - edited: '2021-01-24T18:46:15' - file: - name: 8c2be0fd-a130-4afb-9314-80f2501d94f7.jpg - path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg - attachments: - - name: attachment1.jpg - path: /attachments/attachment1.jpg - - name: attachment2.jpg - path: /attachments/attachment2.jpg - - revision_id: 6770513 - id: '1836570' - user: '6570768' - service: fanbox - title: 今日はFANBOXを始まりました! - content:

    みなさんこんにちは、影おじです。

    先週のように、FANBOXを始まりに決定しました!

    そしてFANBOXの更新内容について、アンケートのみなさん

    ありがとうございました!


    では更新内容の詳しいことはこちらです↓

    毎回の絵、元も差分がありませんの場合、ボナスとして差分イラストを支援者の皆様にプレゼント。

    もとも差分があれば、ボナスとしてヌード差分イラストを支援者の皆様にプレゼント。


    これから、仕事以外の時間、できる限り勤勉な更新したいと思います!

    どうぞよろしくお願いいたします!

    - embed: { } - shared_file: false - added: '2023-07-28T23:51:25.477291' - published: '2021-01-24T17:54:38' - edited: '2021-01-24T18:46:15' - file: - name: 0d133e49-a2d4-4733-9044-dd57e25b1fce.jpg - path: /5c/98/5c984d1f62f0990a0891d8fa359aecdff6ac1e26ac165ba7bb7f31cc99e7a674.jpg - attachments: - - name: attachment3.jpg - path: /attachments/attachment3.jpg - - name: attachment4.jpg - path: /attachments/attachment4.jpg - '404': - description: Post not found - /{service}/user/{creator_id}/post/{post_id}/comments: - get: - tags: - - Comments - summary: List a post's comments - description: List comments for a specific post by service, creator_id, and post_id. - parameters: - - name: service - in: path - description: The post's service. - required: true - schema: - type: string - - name: creator_id - in: path - description: The service ID of the post's creator. - required: true - schema: - type: string - - name: post_id - in: path - description: The service ID of the post. - required: true - schema: - type: string - responses: - '200': - description: List of post comments. - content: - application/json: - schema: - type: array - items: - type: object - properties: - id: - type: string - parent_id: - type: string - nullable: true - commenter: - type: string - content: - type: string - published: - type: string - format: date-time - revisions: - type: array - items: - type: object - properties: - id: - type: integer - content: - type: string - added: - type: string - format: date-time - example: - - id: "121508687" - parent_id: null - commenter: "84534108" - content: "YOU DREW MORE YAYYYY" - published: "2023-11-05T20:17:47.635000" - revisions: - - id: 1 - content: "YOU DREW MORE YAYYYY2222222" - added: "2023-11-14T03:09:12.275975" - '404': - description: No comments found. - - /app_version: - get: - tags: - - Misc - summary: Git Commit Hash - description: Show current App commit hash - responses: - '200': - description: Commit Hash - content: - text/plain: - schema: - type: string - format: hex - minLength: 40 - maxLength: 40 - example: 3b9cd5fab1d35316436968fe85c90ff2de0cdca0 -components: - securitySchemes: - cookieAuth: - description: Session key that can be found in cookies after a successful login - type: apiKey - in: cookie - name: session - schemas: - '401': - title: Unauthorized - description: Unauthorized Access diff --git a/src/pages/api/v1/account.py b/src/pages/api/v1/account.py new file mode 100644 index 0000000..d1500dd --- /dev/null +++ b/src/pages/api/v1/account.py @@ -0,0 +1,222 @@ +from typing import TypedDict, List, Literal, Optional + +from flask import Blueprint, g, make_response, jsonify, abort, request, current_app + +from src.config import Configuration +from src.lib.account import ( + is_logged_in, + load_account, + get_saved_key_import_ids, + get_saved_keys, + revoke_saved_keys, + change_password as db_change_password, +) +from src.lib.notification import count_account_notifications, get_account_notifications, set_notifications_as_seen +from src.lib.security import is_password_compromised +from src.lib.api import create_client_error_response +from src.lib.dms import approve_dms, cleanup_unapproved_dms, get_unapproved_dms, clean_dms_already_approved +from src.pages.account.types import AccountPageProps, NotificationsProps, ServiceKeysProps +from src.types.props import SuccessProps +from src.types.account.account import Account +from src.types.kemono import Unapproved_DM + + +from . import v1api_bp +from .moderator import moderator_bp + +account_bp = Blueprint("account", __name__) + + +# check credentials for all requests for this blueprint +# so the subsequent handlers wouldn't need to check it again +@account_bp.before_request +def check_auth(): + if not is_logged_in(): + abort(401) + + account = load_account() + + if not account: + abort(401) + + +@account_bp.get("/account") +def get_account_info(): + account: Account = g.get("account") + + if Configuration().enable_notifications: + notifications_count = count_account_notifications(account.id) + else: + notifications_count = 0 + props = AccountPageProps(account=account, notifications_count=notifications_count) + + return make_response(jsonify(props=props), 200) + + +TDChangePasswordBody = TypedDict( + "TDChangePasswordBody", {"current-password": str, "new-password": str, "new-password-confirmation": str} +) + + +@account_bp.post("/account/change_password") +def post_change_password(): + body: TDChangePasswordBody = request.get_json() + current_password = body.get("current-password", "") + new_password = body.get("new-password", "").strip() + new_password_conf = body.get("new-password-confirmation", "").strip() + account: Account = load_account() + + if not new_password: + return create_client_error_response("New password cannot be empty.") + + if len(new_password) < 5: + return create_client_error_response("New password must have at least 5 characters.") + + if new_password != new_password_conf: + return create_client_error_response("New password and confirmation do not match.") + + if current_app.config.get("ENABLE_PASSWORD_VALIDATOR") and is_password_compromised(new_password): + response = create_client_error_response( + "We've detected that password was compromised in a data breach on another site. Please choose a different password." + ) + + return response + + if not db_change_password(account.id, current_password, new_password): + return create_client_error_response("Current password is invalid.") + + response = make_response(jsonify(True), 200) + + return response + + +@account_bp.get("/account/notifications") +def get_notifications(): + account: Account = g.get("account") + + if Configuration().enable_notifications: + notifications = get_account_notifications(account.id) + else: + notifications = [] + props = NotificationsProps(notifications=notifications) + + seen_notif_ids = [notification.id for notification in notifications if not notification.is_seen] + set_notifications_as_seen(seen_notif_ids) + + return make_response(jsonify(props=props), 200) + + +@account_bp.get("/account/keys") +def get_account_keys(): + account: Account = g.get("account") + + saved_keys = get_saved_keys(account.id) + props = ServiceKeysProps(service_keys=saved_keys) + + saved_session_key_import_ids = [] + for key in saved_keys: + saved_session_key_import_ids.append(get_saved_key_import_ids(key.id)) + + response = make_response( + jsonify(props=props, import_ids=saved_session_key_import_ids), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=60" + + return response + + +class TDKeyRevokeBody(TypedDict): + revoke: list[int] + + +@account_bp.post("/account/keys") +def revoke_service_keys(): + account: Account = g.get("account") + body: TDKeyRevokeBody = request.get_json() + keys_for_revocation = body["revoke"] + + revoke_saved_keys(keys_for_revocation, account.id) + + props = SuccessProps(currentPage="account", redirect="/account/keys") + response = make_response(jsonify(props=props), 200) + + return response + + +@account_bp.get("/account/posts/upload") +def upload_post(): + account: Account = g.get("account") + + required_roles = Configuration().filehaus["required_roles"] + if len(required_roles) and account.role not in required_roles: + return create_client_error_response( + "Filehaus uploading requires elevated permissions. Please contact the administrator to change your role." + ) + + props = {"currentPage": "posts"} + response = make_response(jsonify(props), 200) + response.headers["Cache-Control"] = "s-maxage=60" + + return response + + +class TDDMPageProps(TypedDict): + account_id: int + dms: List[Unapproved_DM] + status: str + currentPage: Literal["import"] + + +@account_bp.get("/account/review_dms") +def importer_dms(): + account: Account = g.get("account") + + status = "ignored" if request.args.get("status") == "ignored" else "pending" + dms = get_unapproved_dms(account.id, request.args.get("status") == "ignored") + + props = TDDMPageProps(currentPage="import", account_id=account.id, dms=dms, status=status) + + response = make_response( + jsonify( + props, + ), + 200, + ) + response.headers["Cache-Control"] = "max-age=0, private, must-revalidate" + + return response + + +class TDApproveDMsBody(TypedDict): + approved_hashes: list[str] + delete_ignored: Optional[bool] + + +@account_bp.post("/account/review_dms") +def approve_importer_dms(): + account: Account = g.get("account") + body: TDApproveDMsBody = request.get_json() + approved_hashes = body.get("approved_hashes", []) + delete_ignored = bool(body.get("delete_ignored", False)) + approve_dms(int(account.id), approved_hashes) + clean_dms_already_approved(int(account.id)) + cleanup_unapproved_dms(int(account.id)) + + if delete_ignored: + cleanup_unapproved_dms(int(account.id), delete=True) + + response = make_response(jsonify(True), 200) + response.headers["Cache-Control"] = "max-age=0, private, must-revalidate" + + return response + + +@account_bp.errorhandler(401) +def not_authorized_error(error): + return (jsonify(error="Not Authorized"), 401) + +account_bp.register_blueprint(moderator_bp, url_prefix="/account") +# not sure about resolution order +# so load it in the end +v1api_bp.register_blueprint(account_bp) diff --git a/src/pages/api/v1/authentication.py b/src/pages/api/v1/authentication.py new file mode 100644 index 0000000..e0c375b --- /dev/null +++ b/src/pages/api/v1/authentication.py @@ -0,0 +1,122 @@ +import re +from json import JSONDecodeError +from typing import TypedDict + +import orjson +from flask import Blueprint, request, current_app, make_response, jsonify, g, session + +from src.lib.account import attempt_login, create_account +from src.lib.api import create_client_error_response +from src.lib.security import is_password_compromised +from src.types.account import Account + +from . import v1api_bp + +# it is in a separate file because +# all account routes require auth + +authentication_bp = Blueprint("authentication", __name__) + + +class TDRegistrationBody(TypedDict): + location: str + username: str + password: str + confirm_password: str + favorites_json: str + + +USERNAME_REGEX = re.compile(r"^[a-z0-9_@+.\-]{3,15}$") + + +@authentication_bp.post("/authentication/register") +def post_register(): + body: TDRegistrationBody = request.get_json() + username = body.get("username", "").replace("\x00", "").strip() + password = body.get("password", "").strip() + confirm_password = body.get("confirm_password", "").strip() + favorites_json = body.get("favorites", "[]") + + favorites = [] + if favorites_json != "": + try: + favorites = orjson.loads(favorites_json) + except JSONDecodeError: + pass + + if username == "": + return create_client_error_response("Username cannot be empty") + + if not USERNAME_REGEX.match(username): + return create_client_error_response("Invalid username") + + if password == "": + return create_client_error_response("Password cannot be empty") + + if len(password) < 5: + return create_client_error_response("Password must have at least 5 characters.") + + if password != confirm_password: + return create_client_error_response("Passwords do not match") + + if current_app.config.get("ENABLE_PASSWORD_VALIDATOR") and is_password_compromised(password): + return create_client_error_response( + "We've detected that password was compromised in a data breach on another site. Please choose a different password." + ) + + success = create_account(username, password, favorites) + + if not success: + return create_client_error_response("Username already taken") + + response = make_response(jsonify(True), 200) + + return response + + +class TDLoginBody(TypedDict): + username: str + password: str + + +@authentication_bp.post("/authentication/login") +def post_login(): + body: TDLoginBody = request.get_json() + + account: Account | None = g.get("account") + + if account: + return create_client_error_response("Already logged in", 409) + + username = body.get("username", "").replace("\x00", "") + password = body.get("password", "") + + if not username: + return create_client_error_response("Username is required.") + + if not password: + return create_client_error_response("Password is required.") + + (account, error_message) = attempt_login(username, password) + + if error_message: + return create_client_error_response(error_message) + + if not account: + return create_client_error_response("Account doesn't exist") + + response = make_response(jsonify(account), 200) + + return response + + +@authentication_bp.post("/authentication/logout") +def logout(): + if "account_id" in session: + session.pop("account_id") + response = make_response(jsonify(True), 200) + + return response + + +v1api_bp.register_blueprint(authentication_bp) diff --git a/src/pages/api/v1/comments.py b/src/pages/api/v1/comments.py index 3577308..7d19cf8 100644 --- a/src/pages/api/v1/comments.py +++ b/src/pages/api/v1/comments.py @@ -1,18 +1,70 @@ +import re + from flask import jsonify, make_response from src.lib.post import get_post_comments +from src.lib.api import create_not_found_error_response from src.pages.api.v1 import v1api_bp +boosty_emote_uuid_to_file = { + "05df7389-a9e9-4a51-aefc-96c9c374175c": "Heart.webp", + "7b3fda0d-5ea9-4e66-a8bd-a19c590c8cef": "ClappingHands.webp", + "bb6e8aaf-4ac6-4f71-b8a5-b9307f86071b": "HighVoltage.webp", + "3f26b442-06b1-4b94-b9bd-3a1af887057e": "BeamingFace.webp", + "2f73c11d-ed75-4638-bb2c-4d6911d95e63": "PartyPopper.webp", + "67198e42-128a-4a41-bf7a-94d7c98bb44f": "Star.webp", + "5781617f-106b-4c05-bec0-f55d3904307a": "Gemstone.webp", + "1ad0dde5-846e-4c54-a20f-2d54a8ab1b85": "Gaspar.webp", + "84149636-8701-4d5b-a92d-445ebc49d39c": "Hurt.webp", + "3a7d0922-8dc1-4175-90bc-561d3d2bda7d": "MoneyFace.webp", + "da0661bb-aae6-4e54-87fa-0c4065ec435b": "Rocket.webp", + "9db7bb0d-1148-4686-9d0c-643d2c94837b": "ExplodingHead.webp", + "37a6e1ec-f63a-416f-88d4-63e48a68c71b": "ThinkingFace.webp", + "bc1334a6-af7e-4618-b37e-2be63bf8a112": "CheckMark.webp", + "663cbbdf-639e-4dac-8912-6a580d3ef3e6": "CallMe.webp", + "517b1805-13dd-43ed-ac65-bfa0fd0d16b8": "Burn.webp", + "4cd3b821-ec9c-4d35-827e-30be025c3ca0": "FaceScreaming.webp", + "6d674dd1-789c-408f-9ab4-912e9a8d2539": "LoudlyFace.webp", + "f3a31f3c-24b4-4760-a577-10fb0cce8605": "NauseatedFace.webp", + "eb55272b-0724-4854-ad44-899ad286a992": "Eggplant.webp", + "c00141f1-7f23-4841-b8c1-e3cd85f8f5bb": "Apple.webp", + "0b02f581-876f-4b38-823e-00d8c026dc39": "Peach.webp", + "deb46686-294c-49ae-b987-6df4d41e2b9d": "Hamburger.webp", + "5969bcfa-3dc5-4e1b-95dd-b7a1567220fb": "Pizza.webp", + "04541c27-5491-49f6-b70d-aefbdff0884c": "Banana.webp", + "90ccef34-14cf-4528-8763-0d993d892dfe": "Moon.webp", + "76119773-3a29-4548-b4c8-811f7fdc2936": "Sun.webp", + "58b34b35-4d64-45d1-852e-274206dd90b7": "ColdFace.webp", + "fd3780a9-05f7-46fe-92ec-c5f6f2ef5aa3": "Devil.webp", + "97cb65d2-15b7-42d2-9d44-6165f16f3e6e": "Shield.webp", + "fedfd339-daaf-4bff-857f-4d68ae9e5727": "SweatDroplets.webp", + "58852139-f95e-4238-9c1c-871fa6d0889a": "Beach.webp", + "10f3bc42-fc33-437b-a452-de97c748ca22": "Ball.webp", + "5388e3ce-e4d5-4b0c-ba4c-5b58d8d35db9": "Gift.webp", + "9c3d8ff6-bf13-4255-b8ff-30b9c9c98162": "MyPressF.webp", + "97101bae-9beb-47b0-bfe2-70ac24bce094": "MyIlluminati.webp" +} + +boosty_emote_regex = re.compile(r"https:\/\/images\.boosty\.to\/smile\/([a-f0-9\-]+)\/size\/large.*?") @v1api_bp.get("//user//post//comments") def get_comments(service: str, creator_id: str, post_id: str): comments = get_post_comments(post_id, service) + if service == "boosty": + for comment in comments: + comment["content"] = boosty_emote_regex.sub( + lambda match: f"/thumbnail/boosty_smile/{boosty_emote_uuid_to_file.get(match.group(1), match.group(1))}", + comment["content"], + ) + if not comments: - response = make_response(jsonify({"error": "Not found"}), 404) + response = create_not_found_error_response("No comments found.") response.headers["Cache-Control"] = "s-maxage=600" + return response response = make_response(jsonify(comments), 200) response.headers["Cache-Control"] = "s-maxage=600" + return response diff --git a/src/pages/api/v1/creators.py b/src/pages/api/v1/creators.py index e86f19a..8ddc752 100644 --- a/src/pages/api/v1/creators.py +++ b/src/pages/api/v1/creators.py @@ -1,11 +1,74 @@ -from flask import jsonify, make_response +import random +from typing import TypedDict, Optional, Literal +from flask import jsonify, make_response, redirect, url_for, request, session, abort from src.internals.database.database import query_db from src.lib.announcements import get_artist_announcements -from src.lib.artist import get_artist, get_fancards_by_artist, get_linked_creators +from src.lib.artist import ( + get_artist, + get_fancards_by_artist, + get_linked_creators, + get_artists_by_update_time, + delete_creator_link, + create_unapproved_link_request, + get_random_artist_keys, + TDArtist +) +from src.lib.filehaus import get_artist_share_count, get_artist_shares +from src.lib.post import get_artist_post_count, get_artist_posts_summary, get_all_posts_by_artist, get_render_data_for_posts, get_fileserver_for_value +from src.lib.posts import get_all_tags, count_all_posts_for_tag, get_tagged_posts +from src.lib.dms import count_user_dms, get_artist_dms +from src.lib.api import create_client_error_response, create_not_found_error_response +from src.utils.utils import parse_int, positive_or_none, step_int, take, sort_dict_list_by, offset_list +from src.utils.decorators import require_login +from src.pages.artists_types import ArtistShareProps, ArtistDisplayData, ArtistDMsProps, LinkedAccountsProps +from src.types.account.account import Account +from src.types.paysites import Paysite, Paysites + from src.pages.api.v1 import v1api_bp +@v1api_bp.get("/artists/updated") +def updated(): + base = dict(commit=True, sort_by="updated") + limit = 50 + + results = get_artists_by_update_time(offset=0, limit=limit) + props = dict( + currentPage="artists", + display="cached updated artists", + count=len(results), + limit=limit, + ) + + response = make_response(jsonify(props=props, results=results, base=base), 200) + response.headers["Cache-Control"] = "max-age=60, public, stale-while-revalidate=2592000" + + return response + + +@v1api_bp.get("/artists/random") +def random_artist(): + """todo decide after random posts with redis list if its worth""" + artist = get_random_artist() + + if artist is None: + response = make_response(jsonify(error="No artist found"), 404) + + return response + + response = make_response(jsonify(service=artist["service"], artist_id=artist["id"]), 200) + + return response + + +def get_random_artist(): + artists = get_random_artist_keys(1000) + if len(artists) == 0: + return None + return random.choice(artists) + + @v1api_bp.get("/creators") def all_creators(): """this view must be cached at nginx/cdn level""" @@ -16,15 +79,11 @@ def all_creators(): l.service, EXTRACT(epoch from l.indexed)::int AS indexed, EXTRACT(epoch from l.updated)::int AS updated, - COALESCE(aaf.favorited, 0) AS favorited + COALESCE(aaf.favorite_count, 0) AS favorited FROM lookup l LEFT JOIN ( - SELECT - artist_id, - service, - COUNT(*) AS favorited - FROM account_artist_favorite - GROUP BY artist_id, service + SELECT * + FROM favorite_counts ) aaf ON l.id = aaf.artist_id AND l.service = aaf.service @@ -49,6 +108,107 @@ def get_creator(service, creator_id): return response +class TDProfileDisplayData(TypedDict): + service: str + href: str + + +class TDProfilePostsProps(TypedDict): + currentPage: Literal["posts"] + id: str + service: str + name: str + count: int + limit: int + artist: TDArtist + display_data: TDProfileDisplayData + dm_count: int + share_count: int + has_links: str + + +@v1api_bp.get("//user//posts-legacy") +def get_profile_posts_legacy(service: str, creator_id: str): + if not service: + return create_client_error_response("Service name is required.") + + if not creator_id: + return create_client_error_response("Profile ID is required.") + + if service == "discord": + return create_client_error_response("Discord servers not allowed.") + + artist = get_artist(service, creator_id) + + if not artist: + return create_not_found_error_response() + + if artist["public_id"] == creator_id and artist["id"] != creator_id: + return create_client_error_response("Something something profile ID mismatch.") + + query = request.args.get("q", default="").strip() + tags = sorted(request.args.getlist("tag")) + limit = 50 + offset = positive_or_none(step_int(parse_int(request.args.get("o"), 0), limit)) + + if offset is None: + return create_client_error_response(f"Offset is not a multiple of {limit}.") + + if tags: + posts = get_tagged_posts(tags, offset, limit, service, creator_id) + total_count = count_all_posts_for_tag(tags, service, creator_id) + elif not query or len(query) < 2: + total_count = get_artist_post_count(service, creator_id) + + if offset > total_count: + return create_client_error_response(f"Offset {offset} is bigger than total count {total_count}.") + else: + posts = get_artist_posts_summary(creator_id, service, offset, limit, "published DESC NULLS LAST") + else: + (posts, total_count) = do_artist_post_search(creator_id, service, query, offset, limit) + + ( + result_previews, + result_attachments, + result_is_image, + ) = get_render_data_for_posts(posts) + + base = request.args.to_dict() + base.pop("o", None) + base["service"] = service + base["artist_id"] = creator_id + + props = TDProfilePostsProps( + currentPage="posts", + id=creator_id, + service=service, + name=artist["name"], + count=total_count, + limit=limit, + artist=artist, + display_data=make_artist_display_data(artist), + dm_count=count_user_dms(service, creator_id), + share_count=get_artist_share_count(service, creator_id), + has_links="✔️" if artist["relation_id"] else "0", + ) + + response = make_response( + jsonify( + props=props, + base=base, + results=posts, + result_previews=result_previews, + result_attachments=result_attachments, + result_is_image=result_is_image, + disable_service_icons=True, + ), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=60" + + return response + + @v1api_bp.get("//user//announcements") def get_announcements(service, creator_id): artist = get_artist(service, creator_id) @@ -65,13 +225,24 @@ def get_announcements(service, creator_id): @v1api_bp.get("//user//fancards") def get_fancards(service, creator_id): artist = get_artist(service, creator_id) + if not artist: response = make_response(jsonify({"error": "Artist not found."}), 404) response.headers["Cache-Control"] = "s-maxage=600" + return response + fancards = get_fancards_by_artist(creator_id, reload=True) + + for fancard in fancards: + fhash = fancard["hash"] + ext = fancard["ext"] + fancard["path"] = f"/data/{fhash[0:2]}/{fhash[2:4]}/{fhash}{ext}" + fancard["server"] = get_fileserver_for_value(fancard["path"]) + response = make_response(jsonify(fancards), 200) response.headers["Cache-Control"] = "s-maxage=600" + return response @@ -82,3 +253,261 @@ def get_linked_accounts(service, creator_id): response = make_response(jsonify(links), 200) response.headers["Cache-Control"] = "s-maxage=600" return response + + +@v1api_bp.delete("//user//links") +@require_login +def delete_linked_account(service: str, creator_id: str, user: Account): + if user.role != "administrator": + abort(404) + else: + delete_creator_link(service, creator_id) + return "", 204 + + +@v1api_bp.get("//user//links/new") +@require_login +def get_new_link_page(service: str, artist_id: str, user: Account): + artist = get_artist(service, artist_id) + if not artist: + response = make_response(jsonify({"error": "Artist not found."}), 404) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + elif artist["public_id"] == artist_id and artist["id"] != artist_id: + return redirect(url_for(".get_new_link_page", service=service, artist_id=artist["id"]), code=301) + + base = dict(service=service, artist_id=artist_id) + props = LinkedAccountsProps( + id=artist_id, + service=service, + artist=artist, + share_count=get_artist_share_count(service, artist_id), + dm_count=count_user_dms(service, artist_id), + has_links="✔️" if artist["relation_id"] else "0", + display_data=make_artist_display_data(artist), + ) + + response = make_response( + jsonify( + props=props, + base=base, + ), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + + +class TDArtistLinkRequest(TypedDict): + service: str + artist_id: str + reason: Optional[str] + + +@v1api_bp.post("//user//links/new") +@require_login +def post_new_link_page(service: str, artist_id: str, user: Account): + body: TDArtistLinkRequest = request.get_json() + + dest_service = body["service"] + dest_artist_id = body["artist_id"] + reason = body["reason"] or "" + + from_artist = get_artist(service, artist_id) + to_artist = get_artist(dest_service, dest_artist_id) + + if not from_artist: + response = make_response(jsonify({"error": "Artist not found."}), 404) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + elif from_artist["public_id"] == artist_id and from_artist["id"] != artist_id: + return redirect(url_for(".post_new_link_page", service=service, artist_id=from_artist["id"]), code=301) + + base = dict(service=service, artist_id=artist_id) + props = LinkedAccountsProps( + id=artist_id, + service=service, + artist=from_artist, + share_count=get_artist_share_count(service, artist_id), + dm_count=count_user_dms(service, artist_id), + has_links="✔️" if from_artist["relation_id"] else "0", + display_data=make_artist_display_data(from_artist), + ) + + if not to_artist: + message = f"Invalid creator (svc: {dest_service}, id: {dest_artist_id})" + response = make_response(jsonify(error=message), 400) + + return response + + if len(reason) > 140: + message = "Reason is too long" + response = make_response(jsonify(error=message), 400) + + return response + + if dest_service == service and dest_artist_id == artist_id: + message = "Can't link an artist to themself" + response = make_response(jsonify(error=message), 400) + + return response + + if from_artist["relation_id"] == to_artist["relation_id"] and from_artist["relation_id"] is not None: + message = "Already linked" + response = make_response(jsonify(error=message), 400) + + return response + + create_unapproved_link_request(from_artist, to_artist, user.id, reason) + + response = make_response( + jsonify( + message="Request created. It will be shown here when approved.", + props=props, + base=base, + ), + 200, + ) + + return response + + +@v1api_bp.get("//user//tags") +def get_tags(service: str, artist_id: str): + artist = get_artist(service, artist_id) + if not artist: + response = make_response(jsonify({"error": "Artist not found."}), 404) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + elif artist["public_id"] == artist_id and artist["id"] != artist_id: + return redirect(url_for(".get_tags", service=service, artist_id=artist["id"]), code=301) + + tags = get_all_tags(service, artist_id) + props = dict( + display_data=make_artist_display_data(artist), + artist=artist, + service=service, + id=artist["id"], + share_count=get_artist_share_count(service, artist_id), + dm_count=count_user_dms(service, artist_id), + has_links="✔️" if artist["relation_id"] else "0", + ) + response = make_response( + jsonify( + props=props, + tags=tags, + service=service, + artist=artist, + ), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + + +@v1api_bp.route("//user//shares") +def get_shares(service: str, artist_id: str): + base = request.args.to_dict() + base.pop("o", None) + base["service"] = service + base["artist_id"] = artist_id + + dm_count = count_user_dms(service, artist_id) + shares = get_artist_shares(artist_id, service) + + artist = get_artist(service, artist_id) + if artist is None: + response = make_response(jsonify({"error": "Artist not found."}), 404) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + elif artist["public_id"] == artist_id and artist["id"] != artist_id: + return redirect(url_for(".get_shares", service=service, artist_id=artist["id"]), code=301) + + props = ArtistShareProps( + display_data=make_artist_display_data(artist), + service=service, + artist=artist, + id=artist_id, + dm_count=dm_count, + share_count=len(shares), + has_links="✔️" if artist["relation_id"] else "0", + ) + + response = make_response( + jsonify(results=shares, props=props, base=base), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=60" + + return response + + +@v1api_bp.route("//user//dms") +def get_dms(service: str, artist_id: str): + + artist = get_artist(service, artist_id) + + if artist is None: + response = make_response(jsonify({"error": "Artist not found."}), 404) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + elif artist["public_id"] == artist_id and artist["id"] != artist_id: + return redirect(url_for(".get_dms", service=service, artist_id=artist["id"]), code=301) + + dms = get_artist_dms(service, artist_id) + + props = ArtistDMsProps( + id=artist_id, + service=service, + artist=artist, + display_data=make_artist_display_data(artist), + share_count=get_artist_share_count(service, artist_id), + dm_count=len(dms), + dms=dms, + has_links="✔️" if artist["relation_id"] else "0", + ) + + response = make_response( + jsonify( + props=props, + ), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=60" + + return response + + +def make_artist_display_data(artist: dict) -> ArtistDisplayData: + service_name: str = artist["service"] + pay_site: Paysite | None = getattr(Paysites, service_name, None) + + if pay_site: + return ArtistDisplayData(service=pay_site.title, href=pay_site.user.profile(artist)) + + raise Exception("Service not found in Paysites") + + +def do_artist_post_search(artist_id: str, service: str, search: str, o: int, limit: int): + posts = get_all_posts_by_artist(artist_id, service) + search = search.lower() + + matches = [] + for post in posts: + if ( + search in post["content"].lower() + or search in post["title"].lower() + or search in " ".join(post["tags"] or []).lower() + ): + matches.append(post) + + matches = sort_dict_list_by(matches, "published", True) + + return take(limit, offset_list(o, matches)), len(matches) diff --git a/src/pages/api/v1/dms.py b/src/pages/api/v1/dms.py index cf3c876..c7ff59d 100644 --- a/src/pages/api/v1/dms.py +++ b/src/pages/api/v1/dms.py @@ -1,9 +1,72 @@ -from flask import jsonify, make_response, session +from typing import TypedDict, Literal, List + +from flask import request, jsonify, make_response, session + +from src.config import Configuration +from src.lib.dms import ( + has_unapproved_dms, + get_all_dms, + get_all_dms_by_query, + get_all_dms_by_query_count, + get_all_dms_count, +) +from src.lib.api import create_client_error_response +from src.utils.utils import get_query_parameters_dict, parse_int, positive_or_none, step_int +from src.types.kemono import Approved_DM -from src.lib.dms import has_unapproved_dms from src.pages.api.v1 import v1api_bp +class TDDMsProps(TypedDict): + currentPage: Literal["artists"] + count: int + limit: int + dms: List[Approved_DM] + + +@v1api_bp.get("/dms") +def get_api_dms(): + base = get_query_parameters_dict(request, on_errors="ignore", clean_query_string=True) + + limit = 50 + max_offset = limit * 1000 # only load 1000 pages of any result + offset = positive_or_none(step_int(parse_int(base.pop("o", 0), 0), limit)) + + if offset is None or offset > max_offset: + return create_client_error_response("Offset is bigger than maximum offset.") + + query = base.get("q", "").strip()[: Configuration().webserver["max_full_text_search_input_len"]] + + if not query or len(query) < 3: + total_count = get_all_dms_count() + + if offset > total_count: + return create_client_error_response("Offset is bigger than the total count.") + + dms = get_all_dms(offset, limit) + + else: + total_count = get_all_dms_by_query_count(query) + + if offset > total_count: + return create_client_error_response("Offset is bigger than the total count.") + + dms = get_all_dms_by_query(query, offset, limit) + + props = TDDMsProps(currentPage="artists", count=total_count, limit=limit, dms=dms) + + response = make_response( + jsonify( + props=props, + base=base, + ), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=60" + + return response + + @v1api_bp.get("/has_pending_dms") def get_has_pending_dms(): has_pending_dms = False diff --git a/src/pages/api/v1/favorites.py b/src/pages/api/v1/favorites.py index 9631860..4dec1c2 100644 --- a/src/pages/api/v1/favorites.py +++ b/src/pages/api/v1/favorites.py @@ -31,25 +31,33 @@ def list_account_favorites(user: Account): @require_login def post_favorite_post(service, creator_id, post_id, user: Account): add_favorite_post(user.id, service, creator_id, post_id) - return "", 204 + response = make_response(jsonify(True), 200) + + return response @v1api_bp.route("/favorites/creator//", methods=["POST"]) @require_login def post_favorite_artist(service, creator_id, user: Account): add_favorite_artist(user.id, service, creator_id) - return "", 204 + response = make_response(jsonify(True), 200) + + return response @v1api_bp.route("/favorites/post///", methods=["DELETE"]) @require_login def delete_favorite_post(service, creator_id, post_id, user: Account): remove_favorite_post(user.id, service, creator_id, post_id) - return "", 204 + response = make_response(jsonify(True), 200) + + return response @v1api_bp.route("/favorites/creator//", methods=["DELETE"]) @require_login def delete_favorite_artist(service, creator_id, user: Account): remove_favorite_artist(user.id, service, creator_id) - return "", 204 + response = make_response(jsonify(True), 200) + + return response diff --git a/src/pages/api/v1/files.py b/src/pages/api/v1/files.py index 620d6aa..d78f1b5 100644 --- a/src/pages/api/v1/files.py +++ b/src/pages/api/v1/files.py @@ -1,33 +1,118 @@ +import re from flask import jsonify, make_response, request from src.config import Configuration -from src.lib.files import get_file_relationships, try_set_password +from src.lib.files import get_archive_files, get_file_relationships, try_set_password +from src.utils.utils import get_query_parameters_dict, parse_int, positive_or_none, step_int +from src.lib.filehaus import get_all_shares_count, get_files_for_share, get_share, get_shares +from src.lib.api import create_not_found_error_response, create_client_error_response from src.pages.api.v1 import v1api_bp -from src.utils.utils import get_query_parameters_dict + + +HASH_REGEX = re.compile(r"[a-f0-9]{64}") @v1api_bp.get("/search_hash/") -def lookup_file(file_hash): - if not (len(file_hash) == 64 and all(c in "0123456789abcdefABCDEF" for c in file_hash)): - response = make_response(jsonify({"error": "Invalid SHA256 hash"}), 400) - return response - if not (file := get_file_relationships(file_hash)): - response = make_response("{}", 404) - response.headers["Cache-Control"] = "s-maxage=600" - return response +def lookup_file(file_hash: str): + file_hash = file_hash.lower() + if not HASH_REGEX.match(file_hash): + return create_client_error_response("Invalid SHA256 hash") + + file = get_file_relationships(file_hash) response = make_response(jsonify(file), 200) response.headers["Cache-Control"] = "s-maxage=600" + return response -@v1api_bp.get("/set_password") -def set_password(): +@v1api_bp.get("/file/") +def get_archive_data(file_hash: str): + print("get_archive_data for", file_hash) + file_hash = file_hash.lower() + if not HASH_REGEX.match(file_hash): + return create_client_error_response("Invalid SHA256 hash") + + archive = get_archive_files(file_hash) + + if not archive: + return create_client_error_response("File not found", 404) + + response = make_response(jsonify(archive), 200) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + + +@v1api_bp.patch("/file/") +def set_archive_password(file_hash: str): if not Configuration().archive_server["enabled"]: - return "false" - q = get_query_parameters_dict(request) - file_hash = q.get("file_hash") - passwords = [password for password in request.args.getlist("password") if password] - if not file_hash or not passwords or not try_set_password(file_hash, passwords): - return "false" - return "true" + return create_not_found_error_response() + + file_hash = file_hash.lower() + if not HASH_REGEX.match(file_hash): + return create_client_error_response("Invalid SHA256 hash") + + passwords: list[str] = request.get_json() + + if try_set_password(file_hash, passwords): + return make_response(jsonify("ok"), 200) + return create_client_error_response("Invalid password") + + +@v1api_bp.route("/shares") +def get_shares_data(): + base = request.args.to_dict() + base.pop("o", None) + + limit = 50 + offset = positive_or_none(step_int(parse_int(request.args.get("o"), 0), limit)) + # query = request.args.get('q') + + shares = None + total_count = None + (shares, total_count) = get_share_page(offset, limit) + + props = dict(currentPage="shares", count=total_count, shares=shares, limit=limit) + + response = make_response( + jsonify( + props=props, + base=base, + ), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=60" + + return response + + +def get_share_page(offset: int, limit: int): + posts = get_shares(offset, limit) + total_count = get_all_shares_count() + + return posts, total_count + + +@v1api_bp.get("/share/") +def get_share_handler(share_id: str): + base = request.args.to_dict() + base.pop("o", None) + + if (not share_id.isdigit()): + return create_client_error_response("Invalid share ID.") + + share = get_share(int(share_id)) + + if share is None: + return create_not_found_error_response("Share not found.") + + share_files = get_files_for_share(share["id"]) + + response = make_response( + jsonify(share_files=share_files, share=share, base=base), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=60" + + return response diff --git a/src/pages/api/v1/flags.py b/src/pages/api/v1/flags.py deleted file mode 100644 index df045f2..0000000 --- a/src/pages/api/v1/flags.py +++ /dev/null @@ -1,30 +0,0 @@ -from src.config import Configuration -from src.internals.cache.redis import get_conn -from src.internals.database.database import query_db -from src.lib.post import is_post_flagged -from src.pages.api.v1 import v1api_bp - - -@v1api_bp.route("//user//post//flag", methods=["POST"]) -def flag_post_api(service, creator_id, post): - query = """ - INSERT INTO booru_flags (id, "user", service) - SELECT %s, %s, %s - WHERE NOT EXISTS ( - SELECT 1 - FROM booru_flags - WHERE id = %s AND "user" = %s AND service = %s - ) - RETURNING id, service - """ - rows_returned = query_db(query, (post, creator_id, service, post, creator_id, service)) - get_conn().set( - f"is_post_flagged:{service}:{creator_id}:{post}", len(rows_returned), ex=Configuration().redis["default_ttl"] - ) - - return "", (201 if len(rows_returned) else 409) - - -@v1api_bp.route("/user//post//flag", methods=["GET"]) -def flag_api(service, creator_id, post): - return "", 200 if is_post_flagged(service, creator_id, post) else 404 diff --git a/src/pages/api/v1/importer.py b/src/pages/api/v1/importer.py index 8cce42a..f875f52 100644 --- a/src/pages/api/v1/importer.py +++ b/src/pages/api/v1/importer.py @@ -1,63 +1,128 @@ import base64 import logging import re +from typing import TypedDict, Union, Literal, NotRequired import orjson -from flask import current_app, make_response, render_template, request, session +from flask import make_response, request, session, jsonify from src.config import Configuration from src.internals.cache.redis import get_conn -from src.internals.database.database import query_db, query_one_db +from src.internals.database.database import query_db, query_one_db, query_rowcount_db from src.lib.imports import validate_import_key +from src.lib.api import create_client_error_response from src.pages.api.v1 import v1api_bp -from src.types.props import SuccessProps + +TDOnlyFansImportCreateBody = TypedDict( + "TDOnlyFansImportCreateBody", + { + "service": Literal["onlyfans"], + "session_key": str, + "auto_import": str | int | None, + "save_session_key": str | int | None, + "x-bc": str, + "auth_id": str, + "user_agent": str, + }, +) + + +class TDPatreonImportCreateBody(TypedDict): + service: Literal["patreon"] + session_key: str + auto_import: str | int | None + save_session_key: str | int | None + save_dms: NotRequired[bool] + + +class TDDiscordImportCreateBody(TypedDict): + service: Literal["discord"] + session_key: str + auto_import: str | int | None + save_session_key: str | int | None + channel_ids: str @v1api_bp.post("/importer/submit") def importer_submit(): - if not session.get("account_id") and request.form.get("save_dms") and request.form.get("service") == "patreon": - return "You must be logged in to import direct messages.", 401 - - if not request.form.get("session_key"): - return "Session key missing.", 401 - - key = request.form.get("session_key").strip().strip("\" \t'") - if request.form.get("service") == "onlyfans": - key = base64.b64encode( - orjson.dumps( - { - "sess": key, - "x-bc": request.form.get("x-bc").strip().strip("\" \t'"), - "auth_id": request.form.get("auth_id").strip().strip("\" \t'"), - "auth_uid_": "None", - "user_agent": request.form.get("user_agent").strip().strip("\" \t'"), - } - ) - ).decode() - result = validate_import_key(key, request.form.get("service")) + """ + TODO: split into per-service endpoints + """ + body: Union[TDOnlyFansImportCreateBody, TDPatreonImportCreateBody, TDDiscordImportCreateBody] = request.get_json() + account_id = session.get("account_id") + session_key = body.get("session_key") + auto_import = body.get("auto_import") + save_session_key = body.get("save_session_key") + country = request.headers.get(Configuration().webserver["country_header_key"]) + user_agent = request.headers.get("User-Agent") + save_dms = None + key = session_key.strip().strip("\" \t'") discord_channels = None - if (input_channels := request.form.get("channel_ids")) and request.form.get("service") == "discord": + result = None + + if not session_key: + return create_client_error_response("Session key missing.", 401) + + if not body.get("service"): + return create_client_error_response("Service is required.", 400) + + # per service validation + if body["service"] == "patreon": + save_dms = body.get("save_dms") + + if not account_id and save_dms: + return create_client_error_response("You must be logged in to import direct messages.", 401) + + elif body["service"] == "onlyfans": + xBC = body["x-bc"].strip().strip("\" \t'") + auth_id = body["auth_id"].strip().strip("\" \t'") + of_user_agent = body["user_agent"].strip().strip("\" \t'") + key_dict = { + "sess": key, + "x-bc": xBC, + "auth_id": auth_id, + "auth_uid_": "None", + "user_agent": of_user_agent, + } + key = base64.b64encode(orjson.dumps(key_dict)).decode() + + elif body["service"] == "discord": + channel_ids = body["channel_ids"] regex = r"https://discord\.com/channels/\d+/(?P\d+)" - input_channels = [ - re.match(regex, item).group("ch") if re.match(regex, item) else item for item in input_channels.split(",") + + if not channel_ids: + return create_client_error_response("Channel IDs is required.") + + temp_input_channels = [ + re.match(regex, item).group("ch") if re.match(regex, item) else item for item in channel_ids.split(",") ] - discord_channels = list(s.strip() for s in re.split(r"[\s,.、。/']", ",".join(input_channels)) if s.strip()) + + discord_channels = list( + s.strip() for s in re.split(r"[\s,.、。/']", ",".join(temp_input_channels)) if s.strip() + ) + if any(not s.isdigit() for s in discord_channels): msg = "Discord channel ids are numbers, the last number of the url (notice the / between the 2 numbers)" - logging.exception(msg, extra=dict(input_channels=input_channels, discord_channels=discord_channels)) - return msg, 422 + logging.exception(msg, extra=dict(input_channels=channel_ids, discord_channels=discord_channels)) + + return create_client_error_response(msg, 422) + if not discord_channels: msg = "Discord submit requires channels" - logging.exception(msg, extra=dict(input_channels=input_channels, discord_channels=discord_channels)) - return msg, 422 + logging.exception(msg, extra=dict(input_channels=channel_ids, discord_channels=discord_channels)) + + return create_client_error_response(msg, 422) + discord_channels = ",".join(discord_channels) + result = validate_import_key(key, body["service"]) + if not result.is_valid: return "\n".join(result.errors), 422 formatted_key = result.modified_result if result.modified_result else key - service = request.form.get("service") + service = body["service"] queue_name = f"import:{service}" existing_imports = query_db( @@ -68,44 +133,50 @@ def importer_submit(): AND queue_name = %s AND job_input ->> 'key' = %s """, - (queue_name, formatted_key) + (queue_name, formatted_key), ) if existing_imports: existing_import = existing_imports[0]["job_id"] - props = SuccessProps( - message="This key is already being used for an import. Redirecting to logs...", - currentPage="import", - redirect=f"/importer/status/{existing_import}{"?dms=1" if request.form.get("save_dms") else ""}", + + _update_count = query_rowcount_db( + f""" + UPDATE public.jobs + SET priority = LEAST(priority, 1) - 1 + WHERE job_id = %s; + """, + (str(existing_import),), ) - return make_response(render_template("success.html", props=props), 200) + response = make_response(jsonify(import_id=existing_import), 200) + + return response data = dict( key=formatted_key, service=service, channel_ids=discord_channels, - auto_import=request.form.get("auto_import"), - save_session_key=request.form.get("save_session_key"), - save_dms=request.form.get("save_dms"), - contributor_id=session.get("account_id"), + auto_import=auto_import, + save_session_key=save_session_key, + save_dms=save_dms, + contributor_id=account_id, priority=1, - country=request.headers.get(Configuration().webserver["country_header_key"]), - user_agent=request.headers.get("User-Agent"), + country=country, + user_agent=user_agent, ) query = b""" - INSERT INTO jobs (queue_name, priority, job_input) - VALUES (%s, %s, %s) - RETURNING job_id; + INSERT INTO jobs + (queue_name, priority, job_input) + VALUES + (%s, %s, %s) + RETURNING + job_id; """ import_id = query_one_db(query, (queue_name, 1, orjson.dumps(data).decode()))["job_id"] - props = SuccessProps( - currentPage="import", - redirect=f"/importer/status/{import_id}{"?dms=1" if request.form.get("save_dms") else ""}", - ) + response = make_response(jsonify(import_id=import_id), 200) - return make_response(render_template("success.html", props=props), 200) + return response @v1api_bp.route("/importer/logs/") diff --git a/src/pages/api/v1/moderator.py b/src/pages/api/v1/moderator.py new file mode 100644 index 0000000..7f67e3e --- /dev/null +++ b/src/pages/api/v1/moderator.py @@ -0,0 +1,40 @@ +from flask import Blueprint, g, make_response, jsonify, abort, request + +from src.lib.artist import get_unapproved_links_with_artists +from src.lib.artist import approve_unapproved_link_request, reject_unapproved_link_request +from src.types.account import Account + +moderator_bp = Blueprint("administrator", __name__) + + +@moderator_bp.before_request +def check_credentials(): + account: Account = g.get("account") + + if account.role != "moderator" and account.role != "administrator": + return abort(code=404) + + +@moderator_bp.get("/moderator/tasks/creator_links") +def get_creator_links(): + links = get_unapproved_links_with_artists() + + response = make_response(jsonify(links), 200) + + return response + + +@moderator_bp.post("/moderator/creator_link_requests//approve") +def approve_request(request_id: int): + approve_unapproved_link_request(request_id) + response = make_response(jsonify({"response": "approved"}), 200) + + return response + + +@moderator_bp.post("/moderator/creator_link_requests//reject") +def reject_request(request_id: int): + reject_unapproved_link_request(request_id) + response = make_response(jsonify({"response": "rejected"}), 200) + + return response diff --git a/src/pages/api/v1/posts.py b/src/pages/api/v1/posts.py index 7af06cc..2cdab7e 100644 --- a/src/pages/api/v1/posts.py +++ b/src/pages/api/v1/posts.py @@ -1,11 +1,64 @@ -from flask import jsonify, make_response, request +import datetime +import json +import re +import logging +from typing import cast, get_args, TypedDict +from pathlib import PurePath + +import dateutil.parser +from datetime import date +from flask import jsonify, make_response, request, url_for, redirect, session from src.config import Configuration -from src.lib.post import get_artist_posts_full, get_post, get_post_revisions -from src.lib.posts import get_all_posts_for_query, get_all_posts_summary -from src.pages.api.v1 import v1api_bp +from src.lib.artist import get_artist +from src.lib.post import ( + flag_post, + get_artist_posts_full, + get_post, + get_post_revisions, + get_random_post_key, + get_post_by_id, + get_render_data_for_posts, + get_fileserver_for_value, + get_posts_incomplete_rewards, + is_post_flagged, + patch_inline_img, + TDPostRevision +) +from src.lib.posts import get_all_posts_for_query, get_all_posts_summary, get_popular_posts_for_date_range, \ + get_all_tags, count_all_posts, Post, count_all_posts_for_query, get_tagged_posts, count_all_posts_for_tag, \ + POST_FLAG_REASON_SLUG_TO_NUMBER +from src.lib.files import get_archive_files +from src.lib.api import create_not_found_error_response, create_client_error_response from src.pages.artists import do_artist_post_search -from src.utils.utils import get_query_parameters_dict, parse_int, positive_or_none, step_int +from src.pages.post import ready_post_props +from src.utils.datetime_ import PeriodScale, parse_scale_string +from src.utils.utils import get_query_parameters_dict, parse_int, positive_or_none, step_int, set_query_parameter, images_pattern, sanitize_html, limit_int + +from src.pages.api.v1 import v1api_bp + + +@v1api_bp.get("//post/") +def get_by_id(service, post_id): + post = get_post_by_id(post_id, service) + + if not post: + message = "No post found" + response = make_response(jsonify(error=message), 404) + + return response + + response = make_response( + jsonify( + service=post["service"], + artist_id=post["user"], + post_id=post["id"], + ), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=86400" + + return response @v1api_bp.get("//user//posts") @@ -18,21 +71,39 @@ def list_posts_api(service, creator_id): return response query = request.args.get("q", default="").strip() + if not query or len(query) < 2: posts = get_artist_posts_full(creator_id, service, offset, limit, "published DESC NULLS LAST") else: (posts, total_count) = do_artist_post_search(creator_id, service, query, offset, limit) response = make_response(jsonify(posts), 200) + return response +video_extensions = Configuration().webserver["ui"]["video_extensions"] + + @v1api_bp.get("//user//post/") def get_post_api(service, creator_id, post_id): post = get_post(service, creator_id, post_id) + if not post or post["user"] != creator_id: - response = make_response(jsonify({"error": "Not Found"}), 404) - return response - response = make_response(jsonify(post), 200) + return create_not_found_error_response() + + attachments, previews, videos, props = ready_post_props_light(post) + response = make_response( + jsonify( + post=post, + attachments=attachments, + previews=previews, + videos=videos, + props=props + ), + 200 + ) + response.headers["Cache-Control"] = "s-maxage=60" + return response @@ -41,10 +112,63 @@ def list_post_revision_api(service, creator_id, post_id): revisions = get_post_revisions(service, creator_id, post_id) response = make_response(jsonify(revisions), 200 if revisions else 404) response.headers["Cache-Control"] = "max-age=600" + return response -@v1api_bp.route("/posts") +@v1api_bp.route("//user//post//revision/") +def get_post_revision(service: str, artist_id: str, post_id: str, revision_id: str): + revisions = get_post_revisions(service, artist_id, post_id) if revision_id.isdigit() else [] + revision = next((rev for rev in revisions if rev["revision_id"] == int(revision_id)), None) + + if not revision or not ( + service == revision["service"] and artist_id == revision["user"] and post_id == revision["id"] + ): + message = "No post revision found" + response = make_response(jsonify(error=message), 404) + + return response + + attachments, comments, previews, videos, props = ready_post_props(revision) + props["currentPage"] = "revisions" + + response = make_response( + jsonify( + props=props, + post=revision, + comments=comments, + result_previews=previews, + result_attachments=attachments, + videos=videos, + archives_enabled=Configuration().archive_server["enabled"], + ), + 200, + ) + response.headers["Cache-Control"] = "s-maxage=600" + + return response + + +@v1api_bp.post("//user//post//flag") +def flag_post_api(service, user_id, post_id): + flagger_id = session.get("account_id") + if not flagger_id: + return make_response(jsonify(error="Not logged in"), 401) + + body = request.get_json() + reason = body.get("reason") + + if not reason: + return make_response(jsonify(error="No reason provided"), 400) + + if reason not in POST_FLAG_REASON_SLUG_TO_NUMBER: + return make_response(jsonify(error="Invalid reason provided"), 400) + + result = flag_post(service, user_id, post_id, POST_FLAG_REASON_SLUG_TO_NUMBER[reason], flagger_id, request.remote_addr) + return make_response(jsonify(result), 200) + + +@v1api_bp.get("/posts") def recent(): limit = 50 query_params = get_query_parameters_dict(request, on_errors="ignore", clean_query_string=True) @@ -52,17 +176,31 @@ def recent(): extra_pages = Configuration().webserver["extra_pages_to_load_on_posts"] max_offset = limit * 1000 # only load 1000 pages of any result query = query_params.get("q", "").strip()[: Configuration().webserver["max_full_text_search_input_len"]] + tags = request.args.getlist("tag") o = query_params.pop("o", 0) offset = positive_or_none(step_int(parse_int(o, 0), limit)) + if offset is None or offset > max_offset: - response = make_response(jsonify({"error": "offset not multiple of 150 or too large"}), 400) - return response + return create_client_error_response("offset not multiple of 150 or too large") + extra_offset = positive_or_none(step_int(parse_int(o, 0), limit * extra_pages)) slice_offset = offset - extra_offset - if not query or len(query) < 2: - extra_results = get_all_posts_summary(extra_offset, limit * extra_pages, cache_ttl=Configuration().cache_ttl_for_recent_posts)[slice_offset : limit + slice_offset] - # true_count = count_all_posts() - # count = limit_int(count_all_posts(), max_offset) + count = 0 + true_count = 0 + + if tags: + extra_results = get_tagged_posts(tags, extra_offset, limit * extra_pages) + total_count = count_all_posts_for_tag(tags) + true_count = total_count + count = limit_int(total_count, max_offset) + + elif not query or len(query) < 2: + extra_results = get_all_posts_summary( + extra_offset, limit * extra_pages, cache_ttl=Configuration().cache_ttl_for_recent_posts + )[slice_offset : limit + slice_offset] + true_count = count_all_posts() + count = limit_int(true_count, max_offset) + else: try: extra_results = get_all_posts_for_query(query, extra_offset, limit * extra_pages) @@ -73,23 +211,362 @@ def recent(): query_params["q"] = query extra_results = get_all_posts_for_query(query, extra_offset, limit * extra_pages) - # count not used - # if not offset and len(extra_results) < limit: - # true_count = 0 - # count = len(extra_results) - # else: - # try: - # true_count = count_all_posts_for_query(query) - # count = limit_int(props["true_count"], max_offset) - # except Exception as count_error: # catch timeouts, set count as max offset - # logging.exception( - # "Caught error in count_all_posts_for_query", - # extra={"e": count_error}, - # ) - # true_count = 0 - # count = max_offset + if not offset and len(extra_results) < limit: + true_count = 0 + count = len(extra_results) + else: + try: + true_count = count_all_posts_for_query(query) + count = limit_int(true_count, max_offset) + except Exception as count_error: # catch timeouts, set count as max offset + logging.exception( + "Caught error in count_all_posts_for_query", + extra={"e": count_error}, + ) + true_count = 0 + count = max_offset results = extra_results[slice_offset : limit + slice_offset] - response = make_response(jsonify(results), 200) + response = make_response( + jsonify( + count=count, + true_count=true_count, + posts=results + ), + 200 + ) response.headers["Cache-Control"] = "max-age=60, public, stale-while-revalidate=2592000" + return response + + +@v1api_bp.get("/posts/random") +def random_post(): + post = get_random_post_key(Configuration().webserver.get("table_sample_bernoulli_sample_size")) + + if post is None: + message = "No post found" + response = make_response(jsonify(error=message), 404) + + return response + + response = make_response( + jsonify( + service=post["service"], + artist_id=post["user"], + post_id=post["id"], + ), + 200, + ) + + return response + + +@v1api_bp.get("/posts/popular") +def popular_posts(): + query_params = get_query_parameters_dict(request) + earliest_date_for_popular: date = Configuration().webserver.get("earliest_date_for_popular") + # checked below but doesn't typecheck without a cast + scale = cast(PeriodScale, query_params.get("period", "recent")) + + if scale not in get_args(PeriodScale): + scale = "recent" + + info, valid_date = parse_scale_string(query_params.get("date"), scale) + does_not_match_step_date = scale != "recent" and info.date.date() != info.navigation_dates[scale][2] + + if ( + not valid_date + or does_not_match_step_date + or info.date.date() > datetime.date.today() + or info.date.date() < earliest_date_for_popular + ): + correct_date = info.navigation_dates[scale][2].isoformat() + + if info.date.date() > datetime.date.today(): + correct_date = datetime.date.today() + scale = "day" + + elif info.date.date() < earliest_date_for_popular: + correct_date = earliest_date_for_popular + scale = "day" + + new_url = set_query_parameter(url_for("api.v1.popular_posts"), {"date": correct_date, "period": scale}) + response = redirect(new_url) + cache_seconds = int(datetime.timedelta(days=7).total_seconds()) + + if info.date.date() > datetime.date.today(): + cache_seconds = int(datetime.timedelta(hours=3).total_seconds()) + + response.headers["Cache-Control"] = f"max-age={cache_seconds}" + + return response + + expiry = int(datetime.timedelta(days=30).total_seconds()) + + if scale == "recent": + expiry = int(datetime.timedelta(minutes=30 + 1).total_seconds()) + elif info.max_date > datetime.datetime.utcnow(): + if scale == "day": + expiry = int(datetime.timedelta(hours=3).total_seconds()) + + elif scale == "week": + expiry = int(datetime.timedelta(days=1).total_seconds()) + + elif scale == "month": + if datetime.date.today().day < 7: + expiry = int(datetime.timedelta(days=1).total_seconds()) + else: + expiry = int(datetime.timedelta(days=5).total_seconds()) + + pages = Configuration().webserver.get("pages_in_popular") + per_page = 50 + offset = positive_or_none(step_int(parse_int(query_params.pop("o", 0), 0), per_page)) + + if offset is None: + response = redirect(url_for("posts.popular_posts")) + response.headers["Cache-Control"] = f"max-age={int(datetime.timedelta(days=7).total_seconds())}" + + return response + + posts = get_popular_posts_for_date_range( + info.min_date, info.max_date, scale, offset // per_page, per_page, pages, expiry + ) + (previews, attachments, is_image) = get_render_data_for_posts(posts) + props = dict( + currentPage="popular_posts", + today=datetime.date.today(), + earliest_date_for_popular=Configuration().webserver.get("earliest_date_for_popular"), + limit=per_page, + count=pages * per_page, + ) + + response = make_response( + jsonify( + info=info, + props=props, + results=posts, + base=query_params, + result_previews=previews, + result_attachments=attachments, + result_is_image=is_image, + ), + 200, + ) + response.headers["Cache-Control"] = f"max-age={int(expiry)}" + + return response + + +@v1api_bp.get("/posts/tags") +def list_tags(): + props = dict(currentPage="tags") + response = make_response( + jsonify( + props=props, + tags=get_all_tags(), + ), + ) + response.headers["Cache-Control"] = "s-maxage=3600" + + return response + + +DOWNLOAD_URL_FANBOX_REGEX = re.compile(r"") + + +class TDPostProps(TypedDict): + flagged: str + revisions: list[TDPostRevision] + + +def ready_post_props_light(post: Post): + service = post["service"] + artist_id = post["user"] + post_id = post["id"] + + if service in ("patreon",): + + if post["file"] and post["attachments"] and post["file"] == post["attachments"][0]: + post["attachments"] = post["attachments"][1:] + + if service in ("fansly", "onlyfans"): + posts_incomplete_rewards = get_posts_incomplete_rewards(post_id, artist_id, service) + + if posts_incomplete_rewards: + post["incomplete_rewards"] = "This post is missing paid rewards from a higher tier or payment." + + if post["service"] == "onlyfans": + try: + rewards_info_text = ( + f"{posts_incomplete_rewards["incomplete_attachments_info"]["media_count"]} media, " + f"{posts_incomplete_rewards["incomplete_attachments_info"]["photo_count"]} photos, " + f"{posts_incomplete_rewards["incomplete_attachments_info"]["video_count"]} videos, " + f"for {posts_incomplete_rewards["incomplete_attachments_info"]["price"]}$." + ) + post["incomplete_rewards"] += "\n" + rewards_info_text + except Exception: + pass + + elif post["service"] == "fansly": + try: + rewards_info_text = ( + f"Downloaded:{posts_incomplete_rewards["incomplete_attachments_info"]["complete"]} " + f"Missing:{posts_incomplete_rewards["incomplete_attachments_info"]["incomplete"]}" + ) + post["incomplete_rewards"] += "\n" + rewards_info_text + except Exception: + pass + previews = [] + attachments = [] + videos = [] + + if "path" in post["file"]: + + if images_pattern.search(post["file"]["path"]): + previews.append( + { + "type": "thumbnail", + "server": get_fileserver_for_value(f"/data{post["file"]["path"]}"), + "name": post["file"].get("name"), + "path": post["file"]["path"], + } + ) + else: + file_extension = PurePath(post["file"]["path"]).suffix + name_extension = PurePath(post["file"].get("name") or "").suffix + # filename without extension + stem = PurePath(post["file"]["path"]).stem + attachments.append( + { + "server": get_fileserver_for_value(f"/data{post["file"]["path"]}"), + "name": post["file"].get("name"), + "extension": file_extension, + "name_extension": name_extension, + "stem": stem, + "path": post["file"]["path"], + } + ) + + if len(post.get("embed") or []): + previews.append( + { + "type": "embed", + "url": post["embed"]["url"], + "subject": post["embed"]["subject"], + "description": post["embed"]["description"], + } + ) + + for attachment in post["attachments"]: + + if images_pattern.search(attachment["path"]): + previews.append( + { + "type": "thumbnail", + "server": get_fileserver_for_value(f"/data{attachment["path"]}"), + "name": attachment["name"], + "path": attachment["path"], + } + ) + else: + file_extension = PurePath(attachment["path"]).suffix + name_extension = PurePath(attachment.get("name") or "").suffix + # filename without extension + stem = PurePath(attachment["path"]).stem + attachments.append( + { + "server": get_fileserver_for_value(f"/data{attachment["path"]}"), + "name": attachment.get("name"), + "extension": file_extension, + "name_extension": name_extension, + "stem": stem, + "path": attachment["path"], + } + ) + + for i, attachment in enumerate(attachments): + if attachment["extension"] in video_extensions: + videos.append( + { + "index": i, + "path": attachment["path"], + "name": attachment.get("name"), + "extension": attachment["extension"], + "name_extension": attachment["name_extension"], + "server": get_fileserver_for_value(f"/data{attachment["path"]}"), + } + ) + + if post.get("poll") is not None: + post["poll"]["total_votes"] = sum(choice["votes"] for choice in post["poll"]["choices"]) + post["poll"]["created_at"] = datetime.datetime.fromisoformat(post["poll"]["created_at"]) + if post["poll"]["closes_at"]: + post["poll"]["closes_at"] = datetime.datetime.fromisoformat(post["poll"]["closes_at"]) + + if (captions := post.get("captions")) is not None: + for file_hash, caption_data in captions.items(): + for preview_data in [preview for preview in previews if preview.get("path") == file_hash]: + if isinstance(caption_data, dict): + preview_data["caption"] = caption_data.get("text") or "" + elif isinstance(caption_data, list): + preview_data["caption"] = " ".join(each.get("text") or "" for each in caption_data) + for video in [video for video in videos if video["path"] == file_hash]: + if isinstance(caption_data, dict): + video["caption"] = caption_data.get("text") or "" + elif isinstance(caption_data, list): + video["caption"] = " ".join(each.get("text") or "" for each in caption_data) + + props = TDPostProps( + flagged=is_post_flagged(service, artist_id, post_id), + revisions=get_post_revisions(service, artist_id, post_id), + ) + real_post = post if not post.get("revision_id") else get_post(service, artist_id, post_id) + all_revisions = [real_post] + props["revisions"] + for set_prev_next_revision in (post, *props["revisions"]): + set_prev_next_revision["prev"] = real_post["prev"] + set_prev_next_revision["next"] = real_post["next"] + + if props["revisions"]: + last_date = real_post["added"] + for i, rev in enumerate(all_revisions[:-1]): + rev["added"] = all_revisions[i + 1]["added"] + props["revisions"][-1]["added"] = last_date + + if real_post["service"] == "fanbox": + top_rev_stripped = all_revisions[0].copy() + top_rev_stripped.pop("file") + top_rev_stripped.pop("added") + top_rev_stripped.pop("revision_id", None) + for fanbox_attachment in top_rev_stripped["attachments"]: + if 41 >= len(fanbox_attachment["name"]) >= 39: + fanbox_attachment.pop("name", None) + for duplicated_check_rev in all_revisions[1:]: + duplicated_check_rev_file_stripped = duplicated_check_rev.copy() + duplicated_check_rev_file_stripped.pop("file") + duplicated_check_rev_file_stripped.pop("added") + duplicated_check_rev_file_stripped.pop("revision_id", None) + for fanbox_attachment in duplicated_check_rev_file_stripped["attachments"]: + if 41 >= len(fanbox_attachment["name"]) >= 39: + fanbox_attachment.pop("name", None) + if duplicated_check_rev_file_stripped == top_rev_stripped: + all_revisions.remove(duplicated_check_rev) + else: + top_rev_stripped = duplicated_check_rev_file_stripped + + if isinstance(post["tags"], str): + post["tags"] = [tag.strip('"') for tag in post["tags"][1:-1].split(",")] + + transformed_revisions = list(reversed([ + (i, rev) + for i, rev + in enumerate(reversed(all_revisions)) + ])) + props["revisions"] = transformed_revisions + if post["service"] == "fanbox": + post["content"] = DOWNLOAD_URL_FANBOX_REGEX.sub("", post["content"]) + post["content"] = sanitize_html(post["content"], allow_iframe=post["service"] == "fanbox") + if post["service"] == "boosty": + post["content"] = patch_inline_img(post["content"]) + + return attachments, previews, videos, props diff --git a/src/pages/api/v2/__init__.py b/src/pages/api/v2/__init__.py new file mode 100644 index 0000000..a1f0e18 --- /dev/null +++ b/src/pages/api/v2/__init__.py @@ -0,0 +1,47 @@ +from flask import Blueprint, abort, request + +from src.lib.api import ( + create_api_v2_invalid_body_error_response, + create_api_v2_error_response, + TDAPIRequestBody, + APIV2_REQUEST_BODY_TYPE, + TDAPIError, +) + +from .account import account_bp + +v2api_bp = Blueprint("v2", __name__, url_prefix="/v2") + +methods_with_body = ("POST", "PUT", "PATH", "DELETE") + + +# validate body of request for methods which support bodies +@v2api_bp.before_request +def check_api_request(): + method = request.method + + if method not in methods_with_body: + return + + body: TDAPIRequestBody = request.get_json() + + if not (isinstance(body, dict)): + abort(create_api_v2_invalid_body_error_response()) + + type = body.get("type") + + if not type or type != APIV2_REQUEST_BODY_TYPE: + abort(create_api_v2_invalid_body_error_response()) + + +@v2api_bp.errorhandler(500) +def handle_server_error(error: Exception): + """ + TODO: proper logging + """ + responseError = TDAPIError(type="server_error", message="Unknown error.") + + return create_api_v2_error_response(responseError, 500) + + +v2api_bp.register_blueprint(account_bp) diff --git a/src/pages/api/v2/account/__init__.py b/src/pages/api/v2/account/__init__.py new file mode 100644 index 0000000..834ed81 --- /dev/null +++ b/src/pages/api/v2/account/__init__.py @@ -0,0 +1,33 @@ +from flask import Blueprint, abort + +from src.lib.account import ( + is_logged_in, + load_account, +) +from src.lib.api import create_api_v2_client_error_response, TDAPIError + +from .administrator import administrator_bp + +account_bp = Blueprint("account", __name__, url_prefix="/account") + + +# check credentials for all requests for this blueprint +# so the subsequent handlers wouldn't need to check it again +@account_bp.before_request +def check_auth(): + if not is_logged_in(): + response = create_api_v2_client_error_response( + TDAPIError(type="api_account_not_authenticated", message="Account not authenticated."), 401 + ) + abort(response) + + account = load_account() + + if not account: + response = create_api_v2_client_error_response( + TDAPIError(type="api_account_not_authenticated", message="Account not authenticated."), 401 + ) + abort(response) + + +account_bp.register_blueprint(administrator_bp) diff --git a/src/pages/api/v2/account/administrator/__init__.py b/src/pages/api/v2/account/administrator/__init__.py new file mode 100644 index 0000000..d4d727c --- /dev/null +++ b/src/pages/api/v2/account/administrator/__init__.py @@ -0,0 +1,23 @@ +from flask import Blueprint, g, abort + +from src.lib.api import create_api_v2_not_found_error_response +from src.types.account import Account + +from .accounts import get_accounts_count, get_account_list +from .account import get_target_account_overview, change_target_account_details + +administrator_bp = Blueprint("administrator", __name__, url_prefix="/administrator") + + +@administrator_bp.before_request +def check_credentials(): + account: Account = g.get("account") + + if account.role != "administrator": + return abort(create_api_v2_not_found_error_response()) + + +administrator_bp.get("/accounts")(get_accounts_count) +administrator_bp.get("/accounts/")(get_account_list) +administrator_bp.get("/account/")(get_target_account_overview) +administrator_bp.patch("/account/")(change_target_account_details) diff --git a/src/pages/api/v2/account/administrator/account.py b/src/pages/api/v2/account/administrator/account.py new file mode 100644 index 0000000..6a47a24 --- /dev/null +++ b/src/pages/api/v2/account/administrator/account.py @@ -0,0 +1,81 @@ +from flask import g, request +from typing import TypedDict + +from src.lib.api import ( + create_api_v2_response, + create_api_v2_client_error_response, + TDAPIError, + create_api_v2_not_found_error_response, + create_api_v2_invalid_body_error_response, + get_api_v2_request_data, +) +from src.lib.account import load_account +from src.lib.administrator import change_account_role +from src.types.account import Account, visible_roles, AccountRoleChange + + +def get_target_account_overview(account_id: str): + parsed_account_id = int(account_id) + + if parsed_account_id == 0: + return create_api_v2_client_error_response( + TDAPIError(type="invalid_id", message="Account ID must be positive.") + ) + + target_account = load_account(account_id) + + if not target_account: + return create_api_v2_not_found_error_response() + + response = create_api_v2_response(target_account) + + return response + + +class TDAccountUpdate(TypedDict): + role: str + + +def change_target_account_details(account_id: str): + parsed_account_id = int(account_id) + body: TDAccountUpdate = get_api_v2_request_data(request) + + if parsed_account_id == 0: + return create_api_v2_client_error_response( + TDAPIError(type="invalid_id", message="Account ID must be positive.") + ) + + is_valid_body = body is not None and isinstance(body, dict) and (body.get("role") in visible_roles) + + if not is_valid_body: + return create_api_v2_invalid_body_error_response() + + role = body["role"] + target_account = load_account(account_id) + + if not target_account: + return create_api_v2_not_found_error_response() + + if target_account.role == "administrator": + return create_api_v2_client_error_response( + TDAPIError(type="http_conflict", message="Cannot change the role of another admin."), 409 + ) + + if target_account.role == role: + return create_api_v2_client_error_response( + TDAPIError(type="http_conflict", message="Target role is the same as old one."), 409 + ) + + admin_account: Account = g.get("account") + + if admin_account.id == target_account.id: + return create_api_v2_client_error_response( + TDAPIError(type="http_conflict", message="Cannot change the role of yourself."), 409 + ) + + change_data = AccountRoleChange(old_role=target_account.role, new_role=role) + change_account_role([str(target_account.id)], change_data) + + response = create_api_v2_response(account_id) + + return response diff --git a/src/pages/api/v2/account/administrator/accounts.py b/src/pages/api/v2/account/administrator/accounts.py new file mode 100644 index 0000000..af3eef9 --- /dev/null +++ b/src/pages/api/v2/account/administrator/accounts.py @@ -0,0 +1,45 @@ +from flask import request + +from src.lib.pagination import create_pagination +from src.lib.api import create_api_v2_response, create_api_v2_client_error_response, TDAPIError +from src.lib.administrator import count_accounts, get_accounts + + +def get_accounts_count(): + name = request.args.get("name") + role = request.args.get("role") + + if name: + name = name.strip() + + count = count_accounts(role, name) + response = create_api_v2_response(count) + + return response + + +def get_account_list(page: str): + current_page = int(page) + name = request.args.get("name") + role = request.args.get("role") + + if name: + name = name.strip() + + if current_page < 1: + return create_api_v2_client_error_response( + TDAPIError(type="invalid_page", message="Page number must be positive.") + ) + + count = count_accounts(role, name) + pagination = create_pagination(count, current_page) + + if current_page > pagination["total_pages"]: + return create_api_v2_client_error_response( + TDAPIError(type="invalid_page", message="Page number must not be higher than total pages.") + ) + + accounts = get_accounts(pagination, role, name) + response = create_api_v2_response(accounts) + + return response diff --git a/src/pages/artists.py b/src/pages/artists.py index 8d65f4b..c696107 100644 --- a/src/pages/artists.py +++ b/src/pages/artists.py @@ -1,466 +1,11 @@ -from flask import Blueprint, Response, abort, flash, g, make_response, redirect, render_template, request, session, url_for - -from src.lib.announcements import get_artist_announcements -from src.lib.artist import ( - delete_creator_link, - get_artist, - get_artists_by_update_time, - get_fancards_by_artist, - get_top_artists_by_faves, - create_unapproved_link_request, - get_linked_creators, -) -from src.lib.dms import count_user_dms, get_artist_dms -from src.lib.filehaus import get_artist_share_count, get_artist_shares from src.lib.post import ( get_all_posts_by_artist, - get_artist_post_count, - get_artist_posts_summary, - get_fileserver_for_value, - get_render_data_for_posts, ) -from src.lib.posts import count_all_posts_for_tag, get_all_tags, get_tagged_posts from src.pages.artists_types import ( - ArtistAnnouncementsProps, ArtistDisplayData, - ArtistDMsProps, - ArtistFancardsProps, - ArtistPageProps, - ArtistShareProps, - LinkedAccountsProps, ) from src.types.paysites import Paysite, Paysites -from src.utils.utils import offset_list, parse_int, positive_or_none, sort_dict_list_by, step_int, take -from src.types.account.account import Account -from src.utils.decorators import require_login - -artists_bp = Blueprint("artists", __name__) - - -@artists_bp.route("/artists") -def list(): - base = dict() - limit = 50 - - results = get_top_artists_by_faves(0, limit) - props = dict( - currentPage="artists", - display="cached popular artists", - count=len(results), - limit=limit, - ) - - response = make_response(render_template("artists.html", props=props, results=results, base=base), 200) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@artists_bp.route("/artists/updated") -def updated(): - base = dict(commit=True, sort_by="updated") - limit = 50 - - results = get_artists_by_update_time(offset=0, limit=limit) - props = dict( - currentPage="artists", - display="cached updated artists", - count=len(results), - limit=limit, - ) - - response = make_response(render_template("artists.html", props=props, results=results, base=base), 200) - response.headers["Cache-Control"] = "max-age=60, public, stale-while-revalidate=2592000" - return response - - -@artists_bp.route("//user/") -def get(service: str, artist_id: str): - if service == "discord": - response = redirect(f"/discord/server/{artist_id}", 308) - response.headers["Cache-Control"] = "s-maxage=86400" - return response - - base = request.args.to_dict() - base.pop("o", None) - base["service"] = service - base["artist_id"] = artist_id - - artist = get_artist(service, artist_id) - if artist is None: - return redirect(url_for("artists.list")) - elif artist["public_id"] == artist_id and artist["id"] != artist_id: - return redirect(url_for("artists.get", service=service, artist_id=artist["id"])) - - query = request.args.get("q", default="").strip() - tags = sorted(request.args.getlist("tag")) - limit = 50 - offset = positive_or_none(step_int(parse_int(request.args.get("o"), 0), limit)) - if offset is None: - return redirect(url_for("artists.list")) - - if tags: - posts = get_tagged_posts(tags, offset, limit, service, artist_id) - total_count = count_all_posts_for_tag(tags, service, artist_id) - elif not query or len(query) < 2: - total_count = get_artist_post_count(service, artist_id) - if offset > total_count: - return redirect(url_for("artists.get", service=service, artist_id=artist_id)) - else: - posts = get_artist_posts_summary(artist_id, service, offset, limit, "published DESC NULLS LAST") - else: - (posts, total_count) = do_artist_post_search(artist_id, service, query, offset, limit) - - ( - result_previews, - result_attachments, - result_is_image, - ) = get_render_data_for_posts(posts) - - props = ArtistPageProps( - id=artist_id, - service=service, - session=session, - name=artist["name"], - count=total_count, - limit=limit, - artist=artist, - display_data=make_artist_display_data(artist), - dm_count=count_user_dms(service, artist_id), - share_count=get_artist_share_count(service, artist_id), - has_links="✔️" if artist["relation_id"] else "0", - ) - - response = make_response( - render_template( - "user.html", - props=props, - base=base, - results=posts, - result_previews=result_previews, - result_attachments=result_attachments, - result_is_image=result_is_image, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@artists_bp.get("//user//tags") -def get_tags(service: str, artist_id: str): - artist = get_artist(service, artist_id) - if not artist: - response = redirect(url_for("artists.list"), code=301) - response.headers["Cache-Control"] = "s-maxage=60" - return response - elif artist["public_id"] == artist_id and artist["id"] != artist_id: - return redirect(url_for("artists.get_tags", service=service, artist_id=artist["id"]), code=301) - - tags = get_all_tags(service, artist_id) - - response = make_response( - render_template( - "artist/tags.html", - props={ - "display_data": make_artist_display_data(artist), - "artist": artist, - "service": service, - "id": artist["id"], - "share_count": get_artist_share_count(service, artist_id), - "dm_count": count_user_dms(service, artist_id), - "has_links": "✔️" if artist["relation_id"] else "0", - }, - tags=tags, - service=service, - artist=artist, - ) - ) - response.headers["Cache-Control"] = "s-maxage=600" - return response - - -@artists_bp.route("/fanbox/user//fancards") -def get_fancards(artist_id: str): - service = "fanbox" - artist = get_artist(service, artist_id) - if not artist: - response = redirect(url_for("artists.list"), code=301) - response.headers["Cache-Control"] = "s-maxage=60" - return response - elif artist["public_id"] == artist_id: - return redirect(url_for("artists.get_fancards", artist_id=artist["id"]), code=301) - - fancards = get_fancards_by_artist(artist_id) - for fancard in fancards: - fhash = fancard["hash"] - ext = fancard["ext"] - fancard["path"] = f"/data/{fhash[0:2]}/{fhash[2:4]}/{fhash}{ext}" - fancard["server"] = get_fileserver_for_value(fancard["path"]) - - props = ArtistFancardsProps( - id=artist_id, - session=session, - artist=artist, - display_data=make_artist_display_data(artist), - fancards=fancards, - share_count=get_artist_share_count(artist_id=artist_id, service=service), - dm_count=count_user_dms(service, artist_id), - has_links="✔️" if artist["relation_id"] else "0", - ) - - response = make_response( - render_template( - "artist/fancards.html", - artist=artist, - fancards=fancards, - props=props, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@artists_bp.route("//user//shares") -def get_shares(service: str, artist_id: str): - base = request.args.to_dict() - base.pop("o", None) - base["service"] = service - base["artist_id"] = artist_id - - dm_count = count_user_dms(service, artist_id) - shares = get_artist_shares(artist_id, service) - - artist = get_artist(service, artist_id) - if artist is None: - return redirect(url_for("artists.list")) - elif artist["public_id"] == artist_id and artist["id"] != artist_id: - return redirect(url_for("artists.get_shares", service=service, artist_id=artist["id"]), code=301) - - props = ArtistShareProps( - display_data=make_artist_display_data(artist), - service=service, - session=session, - artist=artist, - id=artist_id, - dm_count=dm_count, - share_count=len(shares), - has_links="✔️" if artist["relation_id"] else "0", - ) - - response = make_response( - render_template("artist/shares.html", results=shares, props=props, base=base), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@artists_bp.route("//user//dms") -def get_dms(service: str, artist_id: str): - # pagination might be added at some point if we need it, but considering how few dms most artists end up having, we probably won't - # base = request.args.to_dict() - # base.pop('o', None) - # base["service"] = service - # base["artist_id"] = artist_id - - # offset = int(request.args.get('o') or 0) - # query = request.args.get('q') - # limit = limit_int(int(request.args.get('limit') or 25), 50) - - artist = get_artist(service, artist_id) - if artist is None: - return redirect(url_for("artists.list")) - elif artist["public_id"] == artist_id and artist["id"] != artist_id: - return redirect(url_for("artists.get_dms", service=service, artist_id=artist["id"]), code=301) - - dms = get_artist_dms(service, artist_id) - - props = ArtistDMsProps( - id=artist_id, - service=service, - session=session, - artist=artist, - display_data=make_artist_display_data(artist), - share_count=get_artist_share_count(service, artist_id), - dm_count=len(dms), - dms=dms, - has_links="✔️" if artist["relation_id"] else "0", - ) - - response = make_response( - render_template( - "artist/dms.html", - props=props, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@artists_bp.route("//user//announcements") -def get_announcements(service: str, artist_id: str) -> Response: - # offset = int(request.args.get("o") or 0) - query = request.args.get("q", "") - - artist = get_artist(service, artist_id) - if artist is None: - return redirect(url_for("artists.list")) - elif artist["public_id"] == artist_id and artist["id"] != artist_id: - return redirect(url_for("artists.get_announcements", service=service, artist_id=artist["id"]), code=301) - - announcements = get_artist_announcements(service, artist_id, query=query, reload=True) - # total_announcement_count = get_announcement_count(service=service, artist_id=artist_id, query=query, reload=True) - - props = ArtistAnnouncementsProps( - id=artist_id, - service=service, - artist=artist, - announcements=announcements, - # count=total_announcement_count, - share_count=get_artist_share_count(service, artist_id), - dm_count=count_user_dms(service, artist_id), - has_links="✔️" if artist["relation_id"] else "0", - session=session, - display_data=make_artist_display_data(artist), - ) - response: Response = make_response( - render_template( - "artist/announcements.html", - props=props, - base={"service": service, "artist_id": artist_id}, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@artists_bp.get("//user//links") -def get_linked_accounts(service: str, artist_id: str): - artist = get_artist(service, artist_id) - if not artist: - return redirect(url_for("artists.list")) - elif artist["public_id"] == artist_id and artist["id"] != artist_id: - return redirect(url_for("artists.get_linked_accounts", service=service, artist_id=artist["id"]), code=301) - links = get_linked_creators(service, artist_id) - - props = LinkedAccountsProps( - id=artist_id, - service=service, - artist=artist, - share_count=get_artist_share_count(service, artist_id), - dm_count=count_user_dms(service, artist_id), - has_links="✔️" if artist["relation_id"] else "0", - display_data=make_artist_display_data(artist), - ) - - response = make_response( - render_template( - "artist/linked_accounts.html", - props=props, - links=links, - base={"service": service, "artist_id": artist_id}, - ), - 200 - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@artists_bp.delete("//user//links") -@require_login -def delete_linked_account(service: str, creator_id: str, user: Account): - if user.role != "administrator": - abort(404) - else: - delete_creator_link(service, creator_id) - return "", 204 - - -@artists_bp.get("//user//links/new") -@require_login -def get_new_link_page(service: str, artist_id: str, user: Account): - artist = get_artist(service, artist_id) - if not artist: - return redirect(url_for("artists.list")) - elif artist["public_id"] == artist_id and artist["id"] != artist_id: - return redirect(url_for("artists.get_new_link_page", service=service, artist_id=artist["id"]), code=301) - - props = LinkedAccountsProps( - id=artist_id, - service=service, - artist=artist, - share_count=get_artist_share_count(service, artist_id), - dm_count=count_user_dms(service, artist_id), - has_links="✔️" if artist["relation_id"] else "0", - display_data=make_artist_display_data(artist), - ) - - response = make_response( - render_template( - "artist/new_linked_account.html", - props=props, - base={"service": service, "artist_id": artist_id}, - ), - 200 - ) - response.headers["Cache-Control"] = "s-maxage=600" - return response - - -@artists_bp.post("//user//links/new") -@require_login -def post_new_link_page(service: str, artist_id: str, user: Account): - dest_service, dest_artist_id = request.form.get("creator", "/").split("/") - reason = request.form.get("reason", "") - - from_artist = get_artist(service, artist_id) - to_artist = get_artist(dest_service, dest_artist_id) - - if not from_artist: - return redirect(url_for("artists.list")) - elif from_artist["public_id"] == artist_id and from_artist["id"] != artist_id: - return redirect(url_for("artists.post_new_link_page", service=service, artist_id=from_artist["id"]), code=301) - - props = LinkedAccountsProps( - id=artist_id, - service=service, - artist=from_artist, - share_count=get_artist_share_count(service, artist_id), - dm_count=count_user_dms(service, artist_id), - has_links="✔️" if from_artist["relation_id"] else "0", - display_data=make_artist_display_data(from_artist), - ) - - tmpl = render_template( - "artist/new_linked_account.html", - props=props, - base={"service": service, "artist_id": artist_id}, - ) - if not to_artist: - flash(f"Invalid creator (svc: {dest_service}, id: {dest_artist_id})") - response = make_response(tmpl, 404) - return response - - if len(reason) > 140: - flash("Reason is too long") - return tmpl, 422 - - if dest_service == service and dest_artist_id == artist_id: - flash("Can't link an artist to themself") - response = make_response(tmpl, 422) - return response - - if from_artist["relation_id"] == to_artist["relation_id"] and from_artist["relation_id"] is not None: - flash("Already linked") - response = make_response(tmpl, 422) - return response - - create_unapproved_link_request(from_artist, to_artist, user.id, reason) - flash("Request created. It will be shown here when approved.") - return redirect(url_for("artists.get_linked_accounts", service=service, artist_id=artist_id)) +from src.utils.utils import offset_list, sort_dict_list_by, take def do_artist_post_search(artist_id, service, search, o, limit): diff --git a/src/pages/artists_types.py b/src/pages/artists_types.py index 9cea111..709becf 100644 --- a/src/pages/artists_types.py +++ b/src/pages/artists_types.py @@ -1,8 +1,6 @@ from dataclasses import dataclass from typing import Any, Dict, List -from flask.sessions import SessionMixin - from src.internals.internal_types import PageProps from src.types.kemono import Approved_DM @@ -18,7 +16,6 @@ class ArtistPageProps(PageProps): currentPage = "posts" id: str service: str - session: SessionMixin name: str count: int limit: int @@ -34,7 +31,6 @@ class ArtistShareProps(PageProps): currentPage = "shares" id: str service: str - session: SessionMixin artist: Dict display_data: ArtistDisplayData dm_count: int @@ -47,7 +43,6 @@ class ArtistDMsProps(PageProps): currentPage = "dms" id: str service: str - session: SessionMixin artist: Dict display_data: ArtistDisplayData dm_count: int @@ -59,7 +54,6 @@ class ArtistDMsProps(PageProps): @dataclass class ArtistFancardsProps(PageProps): id: str - session: SessionMixin artist: Dict display_data: ArtistDisplayData fancards: List[Any] # todo remove any @@ -80,7 +74,6 @@ class ArtistAnnouncementsProps(PageProps): share_count: int dm_count: int has_links: str - session: SessionMixin display_data: ArtistDisplayData currentPage: str = "announcements" limit: int = 50 diff --git a/src/pages/creator_link_requests.py b/src/pages/creator_link_requests.py deleted file mode 100644 index 3ed6533..0000000 --- a/src/pages/creator_link_requests.py +++ /dev/null @@ -1,26 +0,0 @@ -from flask import Blueprint, abort, jsonify - -from src.lib.artist import approve_unapproved_link_request, reject_unapproved_link_request -from src.utils.decorators import require_login -from src.types.account.account import Account - - -bp = Blueprint("creator_link_requests", __name__) - - -@bp.post("/creator_link_requests//approve") -@require_login -def approve_request(request_id: int, user: Account): - if user.role not in ["moderator", "administrator"]: - return abort(404) - approve_unapproved_link_request(request_id) - return jsonify({"response": "approved"}) - - -@bp.post("/creator_link_requests//reject") -@require_login -def reject_request(request_id: int, user: Account): - if user.role not in ["moderator", "administrator"]: - return abort(404) - reject_unapproved_link_request(request_id) - return jsonify({"response": "rejected"}) diff --git a/src/pages/dms.py b/src/pages/dms.py deleted file mode 100644 index 13fcb04..0000000 --- a/src/pages/dms.py +++ /dev/null @@ -1,58 +0,0 @@ -from dataclasses import dataclass -from typing import Dict, List - -from flask import Blueprint, make_response, redirect, render_template, request, url_for - -from src.config import Configuration -from src.internals.internal_types import PageProps -from src.lib.artist import get_artist -from src.lib.dms import get_all_dms, get_all_dms_by_query, get_all_dms_by_query_count, get_all_dms_count -from src.types.kemono import Approved_DM -from src.utils.utils import get_query_parameters_dict, parse_int, positive_or_none, step_int - - -@dataclass -class DMsProps(PageProps): - currentPage = "artists" - count: int - limit: int - dms: List[Approved_DM] - - -dms_bp = Blueprint("dms", __name__) - - -@dms_bp.route("/dms") -def get_dms(): - base = get_query_parameters_dict(request, on_errors="ignore", clean_query_string=True) - - limit = 50 - max_offset = limit * 1000 # only load 1000 pages of any result - offset = positive_or_none(step_int(parse_int(base.pop("o", 0), 0), limit)) - if offset is None or offset > max_offset: - return redirect(url_for("dms.get_dms")) - query = base.get("q", "").strip()[: Configuration().webserver["max_full_text_search_input_len"]] - - if not query or len(query) < 3: - total_count = get_all_dms_count() - if offset > total_count: - return redirect(url_for("dms.get_dms")) - dms = get_all_dms(offset, limit) - else: - total_count = get_all_dms_by_query_count(query) - if offset > total_count: - return redirect(url_for("dms.get_dms")) - dms = get_all_dms_by_query(query, offset, limit) - - props = DMsProps(count=total_count, limit=limit, dms=dms) - - response = make_response( - render_template( - "all_dms.html", - props=props, - base=base, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response diff --git a/src/pages/favorites.py b/src/pages/favorites.py deleted file mode 100644 index ab41025..0000000 --- a/src/pages/favorites.py +++ /dev/null @@ -1,60 +0,0 @@ -from flask import Blueprint, make_response, redirect, render_template, request, url_for - -from src.lib.favorites import get_favorite_artists, get_favorite_posts -from src.types.account.account import Account -from src.utils.decorators import require_login -from src.utils.utils import offset_list, parse_int, positive_or_none, restrict_value, sort_dict_list_by, step_int, take - -favorites_bp = Blueprint("favorites", __name__) - - -@favorites_bp.route("/favorites", methods=["GET"]) -@require_login -def list_favorites(user: Account): - props = {"currentPage": "favorites"} - base = request.args.to_dict() - base.pop("o", None) - - fave_type = request.args.get("type", "artist") - if fave_type == "post": - favorites = get_favorite_posts(user.id) - sort_field = restrict_value(request.args.get("sort"), ["faved_seq", "published"], "faved_seq") - else: - fave_type = "artist" - favorites = get_favorite_artists(user.id) - sort_field = restrict_value( - request.args.get("sort"), - ["faved_seq", "updated", "last_imported"], - "updated", - ) - - limit = 50 - offset = positive_or_none(step_int(parse_int(request.args.get("o"), 0), limit)) - if offset is None: - return redirect(url_for("favorites.list_favorites")) - sort_asc = request.args.get("order") == "asc" - results = sort_and_filter_favorites(favorites, offset, sort_field, sort_asc) - - props["fave_type"] = fave_type - props["sort_field"] = sort_field - props["sort_asc"] = sort_asc - props["count"] = len(favorites) - props["limit"] = limit - - response = make_response( - render_template( - "favorites.html", - props=props, - base=base, - source="account", - results=results, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -def sort_and_filter_favorites(favorites, o, field, asc): - favorites = sort_dict_list_by(favorites, field, not asc) - return take(50, offset_list(o, favorites)) diff --git a/src/pages/filehaus.py b/src/pages/filehaus.py deleted file mode 100644 index cf715b3..0000000 --- a/src/pages/filehaus.py +++ /dev/null @@ -1,79 +0,0 @@ -from flask import Blueprint, flash, make_response, redirect, render_template, request, url_for, g - -from src.config import Configuration -from src.lib.filehaus import get_all_shares_count, get_files_for_share, get_share, get_shares -from src.utils.utils import parse_int, positive_or_none, step_int - -filehaus_bp = Blueprint("filehaus", __name__) - - -@filehaus_bp.route("/share/") -def get_share_handler(share_id: str): - base = request.args.to_dict() - base.pop("o", None) - - props = dict(currentPage="shares") - share = get_share(int(share_id)) if share_id.isdigit() else None - if share is None: - response = redirect(url_for("filehaus.get_shares_page")) - return response - - share_files = get_files_for_share(share["id"]) - - response = make_response( - render_template("share.html", share_files=share_files, share=share, props=props, base=base), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@filehaus_bp.route("/shares") -def get_shares_page(): - base = request.args.to_dict() - base.pop("o", None) - - limit = 50 - offset = positive_or_none(step_int(parse_int(request.args.get("o"), 0), limit)) - # query = request.args.get('q') - - shares = None - total_count = None - (shares, total_count) = get_share_page(offset, limit) - - props = dict(currentPage="shares", count=total_count, shares=shares, limit=limit) - - response = make_response( - render_template( - "shares.html", - props=props, - base=base, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -def get_share_page(offset: int, limit: int): - posts = get_shares(offset, limit) - total_count = get_all_shares_count() - return posts, total_count - - -@filehaus_bp.route("/posts/upload") -def upload_post(): - account = g.get("account") - if Configuration().filehaus["requires_account"] and account is None: - flash("Filehaus uploading requires an account.") - return redirect(url_for("account.get_login")) - required_roles = Configuration().filehaus["required_roles"] - if len(required_roles) and account.role not in required_roles: - flash( - "Filehaus uploading requires elevated permissions. " "Please contact the administrator to change your role." - ) - return redirect(url_for("account.get_account")) - props = {"currentPage": "posts"} - response = make_response(render_template("upload.html", props=props), 200) - response.headers["Cache-Control"] = "s-maxage=60" - return response diff --git a/src/pages/files.py b/src/pages/files.py deleted file mode 100644 index af3f793..0000000 --- a/src/pages/files.py +++ /dev/null @@ -1,43 +0,0 @@ -from flask import Blueprint, make_response, redirect, render_template, request, url_for - -from src.internals.database.database import get_cursor -from src.lib.files import get_file_relationships - -files_bp = Blueprint("files", __name__) - - -@files_bp.route("/search_hash", methods=["GET", "POST"]) -def search_hash(): - file_hash = request.args.get("hash") - if file_hash: - if not (len(file_hash) == 64 and all(c in "0123456789abcdefABCDEF" for c in file_hash)): - return redirect(url_for("files.search_hash")) - file_data: dict | None = get_file_relationships(file_hash) - for discord_post in (file_data["discord_posts"] or []) if file_data else []: - cursor = get_cursor() - cursor.execute( - "SELECT * FROM discord_channels WHERE channel_id = %s", - (discord_post["channel"],), - ) - lookup_result = cursor.fetchall() - discord_post["channel_name"] = lookup_result[0]["name"] if len(lookup_result) else "" - response = make_response( - render_template( - "search_results.html", - hash=file_hash, - file_data=file_data, - props={"currentPage": "search_hash"}, - ) - ) - response.headers["Cache-Control"] = "s-maxage=60" - else: - response = make_response( - render_template( - "search_hash.html", - props={"currentPage": "search_hash"}, - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - - return response diff --git a/src/pages/help.py b/src/pages/help.py deleted file mode 100644 index 9191e2f..0000000 --- a/src/pages/help.py +++ /dev/null @@ -1,16 +0,0 @@ -from flask import Blueprint, make_response, redirect, render_template, url_for - -help_app_bp = Blueprint("help_app", __name__) - - -@help_app_bp.route("/") -def help(): - return redirect(url_for("help_app.faq"), 302) - - -@help_app_bp.get("/faq") -def faq(): - props = dict(currentPage="help") - response = make_response(render_template("help/faq.html", props=props), 200) - response.headers["Cache-Control"] = "max-age=60, public, stale-while-revalidate=2592000" - return response diff --git a/src/pages/home.py b/src/pages/home.py deleted file mode 100644 index 3140220..0000000 --- a/src/pages/home.py +++ /dev/null @@ -1,13 +0,0 @@ -from flask import Blueprint, make_response, render_template, request - -home_bp = Blueprint("pages", __name__) - - -@home_bp.get("/") -def get_home(): - props = {} - base = request.args.to_dict() - base.pop("o", None) - response = make_response(render_template("home.html", props=props, base=base), 200) - response.headers["Cache-Control"] = "s-maxage=60" - return response diff --git a/src/pages/imports/__init__.py b/src/pages/imports/__init__.py deleted file mode 100644 index c02a770..0000000 --- a/src/pages/imports/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .blueprint import importer_page_bp diff --git a/src/pages/imports/blueprint.py b/src/pages/imports/blueprint.py deleted file mode 100644 index b5df5d8..0000000 --- a/src/pages/imports/blueprint.py +++ /dev/null @@ -1,55 +0,0 @@ -from flask import Blueprint, make_response, redirect, render_template, request, session, url_for - -from src.lib.dms import approve_dms, cleanup_unapproved_dms, get_unapproved_dms -from src.types.props import SuccessProps - -from .types import DMPageProps, ImportProps, StatusPageProps - -importer_page_bp = Blueprint("importer_page", __name__) - - -@importer_page_bp.get("/importer") -def importer(): - props = ImportProps() - - response = make_response(render_template("importer_list.html", props=props), 200) - response.headers["Cache-Control"] = "max-age=60, public, stale-while-revalidate=2592000" - return response - - -@importer_page_bp.get("/importer/tutorial") -def importer_tutorial(): - props = ImportProps() - - response = make_response(render_template("importer_tutorial.html", props=props), 200) - response.headers["Cache-Control"] = "max-age=60, public, stale-while-revalidate=2592000" - return response - - -@importer_page_bp.get("/importer/tutorial_fanbox") -def importer_tutorial_fanbox(): - props = ImportProps() - - response = make_response(render_template("importer_tutorial_fanbox.html", props=props), 200) - response.headers["Cache-Control"] = "max-age=60, public, stale-while-revalidate=2592000" - return response - - -@importer_page_bp.get("/importer/ok") -def importer_ok(): - props = ImportProps() - - response = make_response(render_template("importer_ok.html", props=props), 200) - response.headers["Cache-Control"] = "max-age=60, public, stale-while-revalidate=2592000" - return response - - -@importer_page_bp.get("/importer/status/") -def importer_status(import_id): - is_dms = bool(request.args.get("dms")) - - props = StatusPageProps(import_id=import_id, is_dms=is_dms) - response = make_response(render_template("importer_status.html", props=props), 200) - - response.headers["Cache-Control"] = "max-age=0, private, must-revalidate" - return response diff --git a/src/pages/imports/types.py b/src/pages/imports/types.py deleted file mode 100644 index d9bbdd3..0000000 --- a/src/pages/imports/types.py +++ /dev/null @@ -1,23 +0,0 @@ -from dataclasses import dataclass -from typing import List - -from src.internals.internal_types import PageProps -from src.types.kemono import Unapproved_DM - - -@dataclass -class ImportProps(PageProps): - currentPage = "import" - - -@dataclass -class StatusPageProps(ImportProps): - import_id: str - is_dms: bool - - -@dataclass -class DMPageProps(ImportProps): - account_id: int - dms: List[Unapproved_DM] - status: str diff --git a/src/pages/post.py b/src/pages/post.py index 2258cba..da957a4 100644 --- a/src/pages/post.py +++ b/src/pages/post.py @@ -1,91 +1,42 @@ import datetime -import json import re from pathlib import PurePath -import dateutil.parser -from flask import Blueprint, make_response, redirect, render_template, url_for - from src.config import Configuration from src.lib.artist import get_artist from src.lib.post import ( get_fileserver_for_value, get_post, - get_post_by_id, get_post_comments, get_post_revisions, get_posts_incomplete_rewards, is_post_flagged, + patch_inline_img, ) +from src.lib.posts import Post from src.utils.utils import images_pattern, sanitize_html -post_bp = Blueprint("post", __name__) +from flask import session + video_extensions = Configuration().webserver["ui"]["video_extensions"] -@post_bp.route("//post/") -def get_by_id(service, post_id): - post = get_post_by_id(post_id, service) - - if post: - response = redirect( - url_for( - "post.get", - service=post["service"], - artist_id=post["user"], - post_id=post["id"], - ) - ) - response.headers["Cache-Control"] = "s-maxage=86400" - else: - response = redirect(url_for("artists.list"), code=301) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -@post_bp.route("//user//post/") -def get(service, artist_id, post_id): - artist = get_artist(service, artist_id) - if artist and artist["public_id"] == artist_id and artist["id"] != artist_id: - return redirect(url_for("post.get", service=service, artist_id=artist["id"], post_id=post_id), code=301) - - post: dict = get_post(service, artist_id, post_id) - if not post: - response = redirect(url_for("artists.get", service=service, artist_id=artist_id)) - return response - - attachments, comments, previews, videos, props = ready_post_props(post) - props["currentPage"] = "posts" - - response = make_response( - render_template( - "post.html", - props=props, - post=post, - comments=comments, - result_previews=previews, - result_attachments=attachments, - videos=videos, - archives_enabled=Configuration().archive_server["enabled"], - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=60" - return response - - -def ready_post_props(post): +def ready_post_props(post: Post): service = post["service"] artist_id = post["user"] post_id = post["id"] if service in ("patreon",): + if post["file"] and post["attachments"] and post["file"] == post["attachments"][0]: post["attachments"] = post["attachments"][1:] + if service in ("fansly", "onlyfans"): posts_incomplete_rewards = get_posts_incomplete_rewards(post_id, artist_id, service) + if posts_incomplete_rewards: post["incomplete_rewards"] = "This post is missing paid rewards from a higher tier or payment." + if post["service"] == "onlyfans": try: rewards_info_text = ( @@ -97,6 +48,7 @@ def ready_post_props(post): post["incomplete_rewards"] += "\n" + rewards_info_text except Exception: pass + elif post["service"] == "fansly": try: rewards_info_text = ( @@ -109,7 +61,9 @@ def ready_post_props(post): previews = [] attachments = [] videos = [] + if "path" in post["file"]: + if images_pattern.search(post["file"]["path"]): previews.append( { @@ -134,6 +88,7 @@ def ready_post_props(post): "path": post["file"]["path"], } ) + if len(post.get("embed") or []): previews.append( { @@ -143,7 +98,9 @@ def ready_post_props(post): "description": post["embed"]["description"], } ) + for attachment in post["attachments"]: + if images_pattern.search(attachment["path"]): previews.append( { @@ -168,6 +125,7 @@ def ready_post_props(post): "path": attachment["path"], } ) + for i, attachment in enumerate(attachments): if attachment["extension"] in video_extensions: videos.append( @@ -247,6 +205,8 @@ def ready_post_props(post): if post["service"] == "fanbox": post["content"] = DOWNLOAD_URL_FANBOX_REGEX.sub("", post["content"]) post["content"] = sanitize_html(post["content"], allow_iframe=post["service"] == "fanbox") + if post["service"] == "boosty": + post["content"] = patch_inline_img(post["content"]) return attachments, comments, previews, videos, props diff --git a/src/pages/posts.py b/src/pages/posts.py deleted file mode 100644 index c98dc1c..0000000 --- a/src/pages/posts.py +++ /dev/null @@ -1,228 +0,0 @@ -import datetime -import logging -from typing import cast, get_args - -from flask import Blueprint, Response, make_response, redirect, render_template, request, url_for -from psycopg.errors import QueryCanceled -from src.lib.files import get_archive_files - -from src.config import Configuration -from src.lib.post import get_render_data_for_posts -from src.lib.posts import ( - count_all_posts, - count_all_posts_for_query, - count_all_posts_for_tag, - get_all_posts_for_query, - get_all_posts_summary, - get_all_tags, - get_popular_posts_for_date_range, - get_tagged_posts, -) -from src.utils.datetime_ import PeriodScale, parse_scale_string -from src.utils.utils import ( - get_query_parameters_dict, - limit_int, - parse_int, - parse_offset, - positive_or_none, - set_query_parameter, - step_int, -) - -posts_bp = Blueprint("posts", __name__) - - -@posts_bp.route("/posts") -def get_posts(): - props = { - "currentPage": "posts", - "limit": 50, - } - - query_params = get_query_parameters_dict(request, on_errors="ignore", clean_query_string=True) - - extra_pages = Configuration().webserver["extra_pages_to_load_on_posts"] - max_offset = props["limit"] * 1000 # only load 1000 pages of any result - query = query_params.get("q", "").strip()[: Configuration().webserver["max_full_text_search_input_len"]] - tags = request.args.getlist("tag") - o = query_params.pop("o", 0) - offset = positive_or_none(step_int(parse_int(o, 0), props["limit"])) - if offset is None or offset > max_offset: - return redirect(url_for("posts.get_posts")) - extra_offset = positive_or_none(step_int(parse_int(o, 0), props["limit"] * extra_pages)) - slice_offset = offset - extra_offset - # todo this true_count and count have no real meaning seeing it is displayed as {{props.true_count or props.count }} - if tags: - extra_results = get_tagged_posts(tags, extra_offset, props["limit"] * extra_pages) - total_count = count_all_posts_for_tag(tags) - props["true_count"] = total_count - props["count"] = limit_int(total_count, max_offset) - elif not query or len(query) < 2: - extra_results = get_all_posts_summary(extra_offset, props["limit"] * extra_pages, cache_ttl=Configuration().cache_ttl_for_recent_posts)[ - slice_offset : props["limit"] + slice_offset - ] - props["true_count"] = count_all_posts() - props["count"] = limit_int(count_all_posts(), max_offset) - else: - try: - extra_results = get_all_posts_for_query(query, extra_offset, props["limit"] * extra_pages) - except QueryCanceled: - return make_response("Query Timeout. Please fix your query text or try again later.", 408) - except Exception as error: - if "failed to parse expression" not in str(error): - raise - query = "Failed to parse query." - query_params["q"] = query - extra_results = get_all_posts_for_query(query, extra_offset, props["limit"] * extra_pages) - - if not offset and len(extra_results) < props["limit"]: - props["true_count"] = 0 - props["count"] = len(extra_results) - else: - try: - props["true_count"] = count_all_posts_for_query(query) - props["count"] = limit_int(props["true_count"], max_offset) - except Exception as count_error: # catch timeouts, set count as max offset - logging.exception( - "Caught error in count_all_posts_for_query", - extra={"e": count_error}, - ) - props["true_count"] = 0 - props["count"] = max_offset - - results = extra_results[slice_offset : props["limit"] + slice_offset] - - ( - result_previews, - result_attachments, - result_is_image, - ) = get_render_data_for_posts(results) - - response = make_response( - render_template( - "posts.html", - props=props, - results=results, - base=query_params, - result_previews=result_previews, - result_attachments=result_attachments, - result_is_image=result_is_image, - ), - 200, - ) - # response.headers["Cache-Control"] = "no-store, max-age=0" - return response - - -@posts_bp.route("/posts/popular") -def popular_posts() -> Response: - query_params = get_query_parameters_dict(request) - earliest_date_for_popular = Configuration().webserver.get("earliest_date_for_popular") - # checked below but doesn't typecheck without a cast - scale: PeriodScale = cast(PeriodScale, query_params.get("period", "recent")) - - if scale not in get_args(PeriodScale): - scale = "recent" - - info, valid_date = parse_scale_string(query_params.get("date"), scale) - does_not_match_step_date = scale != "recent" and info.date.date() != info.navigation_dates[scale][2] - if ( - not valid_date - or does_not_match_step_date - or info.date.date() > datetime.date.today() - or info.date.date() < earliest_date_for_popular - ): - correct_date = info.navigation_dates[scale][2].isoformat() - if info.date.date() > datetime.date.today(): - correct_date = datetime.date.today() - scale = "day" - elif info.date.date() < earliest_date_for_popular: - correct_date = earliest_date_for_popular - scale = "day" - new_url = set_query_parameter(url_for("posts.popular_posts"), {"date": correct_date, "period": scale}) - response = redirect(new_url) - cache_seconds = int(datetime.timedelta(days=7).total_seconds()) - if info.date.date() > datetime.date.today(): - cache_seconds = int(datetime.timedelta(hours=3).total_seconds()) - response.headers["Cache-Control"] = f"max-age={cache_seconds}" - return response - expiry = int(datetime.timedelta(days=30).total_seconds()) - if scale == "recent": - expiry = int(datetime.timedelta(minutes=30 + 1).total_seconds()) - elif info.max_date > datetime.datetime.utcnow(): - if scale == "day": - expiry = int(datetime.timedelta(hours=3).total_seconds()) - elif scale == "week": - expiry = int(datetime.timedelta(days=1).total_seconds()) - elif scale == "month": - if datetime.date.today().day < 7: - expiry = int(datetime.timedelta(days=1).total_seconds()) - else: - expiry = int(datetime.timedelta(days=5).total_seconds()) - - pages = Configuration().webserver.get("pages_in_popular") - per_page = 50 - offset = positive_or_none(step_int(parse_int(query_params.pop("o", 0), 0), per_page)) - if offset is None: - response = redirect(url_for("posts.popular_posts")) - response.headers["Cache-Control"] = f"max-age={int(datetime.timedelta(days=7).total_seconds())}" - return response - posts = get_popular_posts_for_date_range( - info.min_date, info.max_date, scale, offset // per_page, per_page, pages, expiry - ) - (previews, attachments, is_image) = get_render_data_for_posts(posts) - - response = make_response( - render_template( - "posts/popular.html", - info=info, - props={ - "currentPage": "popular_posts", - "today": datetime.date.today(), - "earliest_date_for_popular": Configuration().webserver.get("earliest_date_for_popular"), - "limit": per_page, - "count": pages * per_page, - }, - results=posts, - base=query_params, - result_previews=previews, - result_attachments=attachments, - result_is_image=is_image, - ), - 200, - ) - response.headers["Cache-Control"] = f"max-age={int(expiry)}" - return response - - -@posts_bp.get("/posts/tags") -def list_tags(): - response = make_response( - render_template( - "tags.html", - props={"currentPage": "tags"}, - tags=get_all_tags(), - ), - ) - response.headers["Cache-Control"] = "s-maxage=3600" - return response - - -@posts_bp.route("/discord/server/") -def discord_server(server_id): - response = make_response(render_template("discord.html"), 200) - response.headers["Cache-Control"] = "s-maxage=600" - return response - - -@posts_bp.route("/posts/archives/") -def list_archive(file_hash: str): - archive = get_archive_files(file_hash) - response = make_response(render_template( - "posts/archive.html", - props={}, - archive=archive, - file_serving_enabled=Configuration().archive_server["file_serving_enabled"], - ), 200) - response.headers["Cache-Control"] = "s-maxage=600" - return response diff --git a/src/pages/random_.py b/src/pages/random_.py deleted file mode 100644 index 3c74a69..0000000 --- a/src/pages/random_.py +++ /dev/null @@ -1,45 +0,0 @@ -import random - -from flask import Blueprint, redirect, url_for - -from src.config import Configuration -from src.lib.artist import get_random_artist_keys -from src.lib.post import get_random_post_key - -random_bp = Blueprint("random", __name__) - - -@random_bp.route("/posts/random") -def random_post(): - post = get_random_post_key(Configuration().webserver.get("table_sample_bernoulli_sample_size")) - if post is None: - return redirect(url_for("posts.get_posts")) - - return redirect( - url_for( - "post.get", - service=post["service"], - artist_id=post["user"], - post_id=post["id"], - ) - ) - - -@random_bp.route("/artists/random") -def random_artist(): - """todo decide after random posts with redis list if its worth""" - artist = get_random_artist() - if artist is None: - return redirect(url_for("artists.list")) - - # currently we don't get random discord artists but anyway... - if artist["service"] == "discord": - return redirect(url_for("posts.discord_server", server_id=artist["id"])) - return redirect(url_for("artists.get", service=artist["service"], artist_id=artist["id"])) - - -def get_random_artist(): - artists = get_random_artist_keys(1000) - if len(artists) == 0: - return None - return random.choice(artists) diff --git a/src/pages/review_dms.py b/src/pages/review_dms.py deleted file mode 100644 index 98571a6..0000000 --- a/src/pages/review_dms.py +++ /dev/null @@ -1,47 +0,0 @@ -from flask import Blueprint, make_response, redirect, render_template, request, url_for - -from src.lib.dms import approve_dms, cleanup_unapproved_dms, get_unapproved_dms, clean_dms_already_approved -from src.pages.imports.types import DMPageProps -from src.types.account.account import Account -from src.types.props import SuccessProps -from src.utils.decorators import require_login - -review_dms_bp = Blueprint("review_dms", __name__) - - -@review_dms_bp.get("/account/review_dms") -@require_login -def importer_dms(user: Account): - account_id_int = int(user.id) - status = "ignored" if request.args.get("status") == "ignored" else "pending" - dms = get_unapproved_dms(account_id_int, request.args.get("status") == "ignored") - - props = DMPageProps(account_id=account_id_int, dms=dms, status=status) - - response = make_response( - render_template( - "review_dms/review_dms.html", - props=props, - ), - 200, - ) - - response.headers["Cache-Control"] = "max-age=0, private, must-revalidate" - return response - - -@review_dms_bp.post("/account/review_dms") -@require_login -def approve_importer_dms(user: Account): - props = SuccessProps(currentPage="import", redirect="/account/review_dms") - approved_hashes = request.form.getlist("approved_hashes") - delete_ignored = bool(request.form.get("delete_ignored", default=False)) - approve_dms(int(user.id), approved_hashes) - clean_dms_already_approved(int(user.id)) - cleanup_unapproved_dms(int(user.id)) - if delete_ignored: - cleanup_unapproved_dms(int(user.id), delete=True) - - response = make_response(render_template("success.html", props=props), 200) - response.headers["Cache-Control"] = "max-age=0, private, must-revalidate" - return response diff --git a/src/pages/revisions.py b/src/pages/revisions.py deleted file mode 100644 index 37c3c31..0000000 --- a/src/pages/revisions.py +++ /dev/null @@ -1,37 +0,0 @@ -from flask import Blueprint, make_response, redirect, render_template, url_for - -from src.config import Configuration -from src.lib.post import get_post_revisions -from src.pages.post import ready_post_props - -revisions_bp = Blueprint("revisions", __name__) - - -@revisions_bp.route("//user//post//revision/") -def get(service: str, artist_id: str, post_id: str, revision_id: str): - revisions = get_post_revisions(service, artist_id, post_id) if revision_id.isdigit() else [] - revision = next((rev for rev in revisions if rev["revision_id"] == int(revision_id)), None) - if not revision or not ( - service == revision["service"] and artist_id == revision["user"] and post_id == revision["id"] - ): - response = redirect(url_for("post.get", service=service, artist_id=artist_id, post_id=get)) - return response - - attachments, comments, previews, videos, props = ready_post_props(revision) - props["currentPage"] = "revisions" - - response = make_response( - render_template( - "post.html", - props=props, - post=revision, - comments=comments, - result_previews=previews, - result_attachments=attachments, - videos=videos, - archives_enabled=Configuration().archive_server["enabled"], - ), - 200, - ) - response.headers["Cache-Control"] = "s-maxage=600" - return response diff --git a/src/server.py b/src/server.py index 5e43bf1..27a07bf 100644 --- a/src/server.py +++ b/src/server.py @@ -3,10 +3,11 @@ import os import pathlib import jinja2 -from flask import Flask, g, make_response, render_template, request, send_from_directory, session +from flask import Flask, g, make_response, render_template, request, send_from_directory, session, jsonify from flask.json.provider import JSONProvider from src.config import Configuration +from src.lib.api import create_api_v2_client_error_response, TDAPIError app = Flask( __name__, @@ -39,22 +40,7 @@ import orjson from src.lib.account import is_logged_in, load_account from src.lib.notification import count_new_notifications from src.lib.post import get_fileserver_for_value -from src.pages.account import account_bp from src.pages.api import api_bp -from src.pages.artists import artists_bp -from src.pages.dms import dms_bp -from src.pages.favorites import favorites_bp -from src.pages.filehaus import filehaus_bp -from src.pages.files import files_bp -from src.pages.help import help_app_bp -from src.pages.home import home_bp -from src.pages.imports import importer_page_bp -from src.pages.post import post_bp -from src.pages.posts import posts_bp -from src.pages.random_ import random_bp -from src.pages.revisions import revisions_bp -from src.pages.review_dms import review_dms_bp -from src.pages.creator_link_requests import bp as link_request_bp from src.types.account import Account from src.utils.utils import ( freesites, @@ -68,21 +54,6 @@ from src.utils.utils import ( app.url_map.strict_slashes = False app.register_blueprint(api_bp) -app.register_blueprint(home_bp) -app.register_blueprint(artists_bp) -app.register_blueprint(random_bp) -app.register_blueprint(post_bp) -app.register_blueprint(posts_bp) -app.register_blueprint(revisions_bp) -app.register_blueprint(account_bp) -app.register_blueprint(favorites_bp) -app.register_blueprint(filehaus_bp) -app.register_blueprint(files_bp) -app.register_blueprint(importer_page_bp) -app.register_blueprint(dms_bp) -app.register_blueprint(review_dms_bp) -app.register_blueprint(help_app_bp, url_prefix="/help") -app.register_blueprint(link_request_bp) app.config.update( @@ -279,6 +250,31 @@ def do_finish_stuff(response): return response +# adding the handlers there because +# flask doesn't allow handling 404/405 in blueprints +# https://flask.palletsprojects.com/en/2.3.x/errorhandling/#blueprint-error-handlers +@app.errorhandler(404) +def route_not_found(error): + if request.path.startswith('/api/v1'): + return jsonify(error="Not Found"), 404 + + if request.path.startswith('/api/v2'): + error = TDAPIError(type="http_error", message="Not Found") + return create_api_v2_client_error_response(error, 404) + + return error, 404 + +@app.errorhandler(405) +def method_not_allowed(error): + if request.path.startswith('/api/v1'): + return jsonify(error="Method Not Allowed"), 405 + + if request.path.startswith('/api/v2'): + error = TDAPIError(type="http_error", message="Method Not Allowed") + return create_api_v2_client_error_response(error, 405) + + return error, 405 + @app.errorhandler(413) def upload_exceeded(error): props = {"redirect": request.headers.get("Referer") if request.headers.get("Referer") else "/"} diff --git a/src/types/account/account.py b/src/types/account/account.py index cdf8c2f..aede2b8 100644 --- a/src/types/account/account.py +++ b/src/types/account/account.py @@ -13,38 +13,3 @@ class Account(DatabaseEntry): username: str created_at: datetime role: str - - -# @dataclass -# class Consumer(Account): -# pass - -# @dataclass -# class Moderator(Account): -# pass - -# @dataclass -# class Administrator(Account): -# pass - -# class Agreement: -# """ -# The user's agreement. -# """ -# name: str -# agreed_at: datetime -# version: str -# def is_outdated(self, version: str) -> bool: -# current_version = parse_version(self.version) -# new_version = parse_version(version) -# return current_version < new_version - -# class __Import: -# """ -# The user's import. -# """ -# id: str -# service: str -# approved: list[str] -# rejected: list[str] -# pending: list[str] diff --git a/src/types/account/notification.py b/src/types/account/notification.py index ba03bb2..e3d6be0 100644 --- a/src/types/account/notification.py +++ b/src/types/account/notification.py @@ -12,7 +12,7 @@ class Notification(DatabaseEntry): account_id: int type: str created_at: datetime - extra_info: Optional[TypedDict] + extra_info: Optional[dict] is_seen: bool = False diff --git a/src/types/paysites/__init__.py b/src/types/paysites/__init__.py index e650c9f..d4f6936 100644 --- a/src/types/paysites/__init__.py +++ b/src/types/paysites/__init__.py @@ -16,6 +16,12 @@ from .subscribestar import Subscribestar # duplicated in /client/src/utils/_index.js +# nothing can be done about that (for now) +# short of refactoring into JSON file and URL templates +# but those have their own issues and sometimes can be way less readable +# than string interpolations for respective languages +# not to mention different libs are going to parse templates +# with all the subtle interop issues class Paysites: afdian = Afdian() diff --git a/src/types/paysites/boosty.py b/src/types/paysites/boosty.py index 062d4d4..5b1a2b2 100644 --- a/src/types/paysites/boosty.py +++ b/src/types/paysites/boosty.py @@ -6,13 +6,13 @@ from .base import Paysite, Service_Post, Service_User @dataclass class User(Service_User): def profile(self, artist: dict) -> str: - return "" + return f"https://boosty.to/{(artist or {}).get('id')}" @dataclass class Post(Service_Post): def link(self, post_id: str, user_id: str) -> str: - return "" + return f"https://boosty.to/{user_id}/posts/{post_id}" @dataclass diff --git a/src/utils/datetime_.py b/src/utils/datetime_.py index 10af38a..232f0ce 100644 --- a/src/utils/datetime_.py +++ b/src/utils/datetime_.py @@ -16,7 +16,7 @@ class TimeRangeInfo: date: datetime min_date: datetime max_date: datetime - navigation_dates: dict[PeriodScale, tuple[date, date, date]] + navigation_dates: dict[PeriodScale, tuple['date', 'date', 'date']] range_desc: str scale: PeriodScale @@ -32,25 +32,33 @@ def get_minmax_ts( round_factor = int(round_to.total_seconds()) rounded_seconds = round(now_as_timedelta.total_seconds() / round_factor) * round_factor rdt = today_as_datetime + timedelta(seconds=rounded_seconds) + return rdt - timedelta(days=1), rdt + case "day": + return ( datetime.combine(input_date, time.min), datetime.combine(input_date, time.max), ) + case "week": input_date = beginning_of_week(input_date) + return ( datetime.combine(beginning_of_week(input_date), time.min), datetime.combine(next_week(input_date), time.min), ) + case "month": input_date = input_date.replace(day=1) last_day = calendar.monthrange(input_date.year, input_date.month)[1] + return ( datetime.combine(input_date.replace(day=1), time.min), datetime.combine(input_date.replace(day=last_day), time.max), ) + case _: raise Exception("Invalid scale") @@ -59,16 +67,21 @@ def surrounding_dates_for_scale(input_date: date, scale: PeriodScale) -> tuple[d match scale: case "recent": # not meaningful delta = relativedelta(hours=24) + case "day": delta = relativedelta(days=1) + case "week": input_date = beginning_of_week(input_date) delta = relativedelta(days=7) + case "month": input_date = input_date.replace(day=1) delta = relativedelta(months=1) + case _: raise Exception("Invalid scale") + return input_date - delta, input_date + delta, input_date @@ -76,18 +89,23 @@ def date_range_description(input_date: datetime, scale: PeriodScale) -> str: match scale: case "recent": return "the past 24 hours" + case "day": return input_date.strftime("%B %d, %Y") + case "week": min_date = beginning_of_week(input_date) max_date = next_week(input_date) + return f"{min_date.strftime("%B %d, %Y")} - {max_date.strftime("%B %d, %Y")}" + case "month": return input_date.strftime("%B %Y") def beginning_of_week(input_date: date) -> date: days_to_monday = input_date.weekday() - 1 if input_date.weekday() != 0 else 6 + return input_date - timedelta(days=days_to_monday) @@ -97,6 +115,7 @@ def next_week(input_datetime: date) -> date: def parse_scale_string(date_string: str | None, scale: PeriodScale = "recent") -> tuple[TimeRangeInfo, bool]: valid_date = True + if date_string is None: parsed_date = datetime.now() else: @@ -107,8 +126,10 @@ def parse_scale_string(date_string: str | None, scale: PeriodScale = "recent") - valid_date = False nav: dict[PeriodScale, tuple[date, date, date]] = {} + for period in get_args(PeriodScale): nav[period] = surrounding_dates_for_scale(parsed_date.date(), period) + desc = date_range_description(parsed_date, scale) (min_date, max_date) = get_minmax_ts(parsed_date, scale)