From 69c5c1b947caa314232fbe186e580ab7b642e43c Mon Sep 17 00:00:00 2001 From: ildyria Date: Mon, 21 Aug 2023 21:11:09 +0200 Subject: [PATCH 001/226] squash --- .env.example | 4 + .github/workflows/.env.mariadb | 2 +- .github/workflows/.env.postgresql | 2 +- .github/workflows/.env.sqlite | 2 +- .github/workflows/php-cs-fixer.yml | 5 +- .gitignore | 34 +- .../Pipes/Checks/IniSettingsCheck.php | 9 + app/Assets/ArrayToTextTable.php | 48 - app/Assets/Helpers.php | 18 + app/Contracts/Livewire/Openable.php | 32 + app/Contracts/Livewire/Reloadable.php | 8 + app/Enum/ColumnSortingAlbumType.php | 17 + app/Enum/ColumnSortingPhotoType.php | 23 + app/Enum/Livewire/AlbumMode.php | 27 + app/Enum/Livewire/NotificationType.php | 11 + app/Enum/Livewire/PhotoOverlayMode.php | 11 + app/Enum/OrderSortingType.php | 14 + app/Enum/SmartAlbumType.php | 2 +- app/Enum/Traits/WireableEnumTrait.php | 35 + app/Exceptions/Handlers/AccessDBDenied.php | 3 +- app/Exceptions/Handlers/NoEncryptionKey.php | 3 +- app/Facades/Helpers.php | 1 + .../Administration/JobController.php | 2 +- .../Administration/UserController.php | 1 - app/Http/Controllers/IndexController.php | 2 + app/Http/Controllers/PhotoController.php | 1 + app/Http/Kernel.php | 1 + app/Http/Middleware/AcceptContentType.php | 36 + app/Http/Middleware/DisableCSP.php | 26 + .../Collections/AlbumForestResource.php | 4 +- app/Http/RuleSets/AddAlbumRuleSet.php | 19 + app/Http/RuleSets/ChangeLoginRuleSet.php | 20 + app/Http/RuleSets/LoginRuleSet.php | 19 + app/Livewire/Components/Base/ContextMenu.php | 70 + app/Livewire/Components/Base/Modal.php | 88 + .../Components/Forms/Add/ImportFromServer.php | 89 + .../Components/Forms/Add/ImportFromUrl.php | 112 + .../Forms/Add/MultipleFileUploader.php | 163 + app/Livewire/Components/Forms/Add/Upload.php | 104 + .../Components/Forms/Album/Create.php | 97 + .../Components/Forms/Album/CreateTag.php | 95 + .../Components/Forms/Album/Delete.php | 77 + app/Livewire/Components/Forms/Album/Move.php | 242 + .../Components/Forms/Album/Properties.php | 114 + .../Components/Forms/Album/ShareWith.php | 146 + .../Components/Forms/Album/ShareWithLine.php | 80 + .../Components/Forms/Album/Transfer.php | 116 + .../Components/Forms/Album/Visibility.php | 142 + app/Livewire/Components/Forms/BaseForm.php | 117 + .../Components/Forms/Confirms/SaveAll.php | 42 + .../Components/Forms/Photo/Delete.php | 87 + .../Components/Forms/Profile/GetApiToken.php | 106 + .../Forms/Profile/ManageSecondFactor.php | 78 + .../Components/Forms/Profile/SetEmail.php | 60 + .../Components/Forms/Profile/SetLogin.php | 72 + .../Base/BaseConfigDoubleDropDown.php | 95 + .../Settings/Base/BaseConfigDropDown.php | 67 + .../Forms/Settings/Base/BooleanSetting.php | 83 + .../Forms/Settings/Base/StringSetting.php | 75 + .../SetAlbumDecorationOrientationSetting.php | 38 + .../Settings/SetAlbumDecorationSetting.php | 39 + .../Forms/Settings/SetAlbumSortingSetting.php | 65 + .../Forms/Settings/SetLangSetting.php | 35 + .../Forms/Settings/SetLayoutSetting.php | 71 + .../Settings/SetLicenseDefaultSetting.php | 67 + .../Forms/Settings/SetMapProviderSetting.php | 39 + .../Forms/Settings/SetPhotoOverlaySetting.php | 38 + .../Forms/Settings/SetPhotoSortingSetting.php | 67 + app/Livewire/Components/Menus/AlbumAdd.php | 68 + app/Livewire/Components/Menus/LeftMenu.php | 62 + app/Livewire/Components/Modals/About.php | 54 + app/Livewire/Components/Modals/Login.php | 92 + .../Diagnostics/AbstractPreSection.php | 32 + .../Modules/Diagnostics/Configurations.php | 15 + .../Components/Modules/Diagnostics/Errors.php | 61 + .../Components/Modules/Diagnostics/Infos.php | 15 + .../Components/Modules/Diagnostics/Space.php | 34 + .../Modules/Profile/SecondFactor.php | 71 + .../Components/Modules/Sidebar/Photo.php | 192 + .../Components/Modules/Users/UserLine.php | 100 + app/Livewire/Components/Pages/AllSettings.php | 72 + app/Livewire/Components/Pages/Diagnostics.php | 31 + .../Components/Pages/Gallery/Album.php | 190 + .../Components/Pages/Gallery/Albums.php | 97 + .../Components/Pages/Gallery/Photo.php | 123 + .../Pages/Gallery/SensitiveWarning.php | 56 + app/Livewire/Components/Pages/Jobs.php | 44 + app/Livewire/Components/Pages/Landing.php | 40 + app/Livewire/Components/Pages/Profile.php | 55 + app/Livewire/Components/Pages/Settings.php | 43 + app/Livewire/Components/Pages/Sharing.php | 73 + app/Livewire/Components/Pages/Users.php | 91 + app/Livewire/DTO/AlbumFlags.php | 19 + app/Livewire/DTO/PhotoFlags.php | 18 + app/Livewire/Forms/AllConfigsForms.php | 68 + app/Livewire/Synth/AlbumSynth.php | 42 + app/Livewire/Synth/PhotoSynth.php | 38 + .../Traits/InteractWithContextMenu.php | 31 + app/Livewire/Traits/InteractWithModal.php | 45 + app/Livewire/Traits/Notify.php | 24 + app/Livewire/Traits/UseOpenable.php | 51 + app/Livewire/Traits/UseValidator.php | 37 + app/Livewire/Traits/UseWireable.php | 47 + app/Models/Album.php | 5 + app/Models/BaseAlbumImpl.php | 5 + app/Models/Configs.php | 13 +- app/Models/Extensions/SizeVariants.php | 43 +- .../Extensions/ThrowsConsistentExceptions.php | 1 + app/Models/Extensions/Thumb.php | 8 +- .../ToArrayThrowsNotImplemented.php | 13 +- app/Models/Extensions/UTCBasedTimes.php | 2 +- app/Models/JobHistory.php | 2 - app/Models/Photo.php | 47 +- app/Models/SizeVariant.php | 28 + app/Models/SymLink.php | 5 + app/Models/TagAlbum.php | 16 + app/Models/User.php | 9 +- app/Policies/AlbumPolicy.php | 4 +- app/Providers/AppServiceProvider.php | 13 + app/Providers/RouteServiceProvider.php | 3 + app/Rules/CurrentPasswordRule.php | 33 + app/SmartAlbums/BaseSmartAlbum.php | 31 + app/View/Components/Footer.php | 66 + app/View/Components/Gallery/Album/Details.php | 46 + app/View/Components/Gallery/Album/Hero.php | 34 + .../Components/Gallery/Album/SharingLinks.php | 31 + .../Components/Gallery/Album/Thumbs/Album.php | 74 + .../Gallery/Album/Thumbs/AlbumThumb.php | 45 + .../Components/Gallery/Album/Thumbs/Photo.php | 246 + app/View/Components/Gallery/Photo/Overlay.php | 73 + app/View/Components/Meta.php | 75 + composer.json | 3 + composer.lock | 647 +- config/app.php | 21 + config/livewire.php | 133 + config/markdown.php | 96 +- ...110932_add_date_display_configurations.php | 88 + lang/cz/lychee.php | 4 + lang/de/lychee.php | 4 + lang/el/lychee.php | 4 + lang/en/lychee.php | 4 + lang/es/lychee.php | 4 + lang/fr/lychee.php | 4 + lang/hu/lychee.php | 4 + lang/it/lychee.php | 4 + lang/nl/lychee.php | 4 + lang/no/lychee.php | 4 + lang/pl/lychee.php | 4 + lang/pt/lychee.php | 4 + lang/ru/lychee.php | 4 + lang/sk/lychee.php | 4 + lang/sv/lychee.php | 4 + lang/vi/lychee.php | 4 + lang/zh_CN/lychee.php | 4 + lang/zh_TW/lychee.php | 4 + package-lock.json | 16465 +--------------- package.json | 28 +- phpstan.neon | 21 +- phpstan/stubs/Wireable.stub | 22 + postcss.config.js | 6 + public/css/app.css | 523 +- public/css/filepond.css | 961 + public/js/alpine.min.js | 5 + public/js/app.js | 2908 ++- public/js/filepond.js | 12728 ++++++++++++ public/js/justified-layout.min.js | 13 + public/js/webauthn.js | 427 + public/mix-manifest.json | 7 +- resources/assets/js/app.js | 0 resources/assets/scss/_basicModal.custom.scss | 45 + resources/assets/scss/_photo-thumbs.scss | 310 +- resources/assets/scss/app.scss | 7 +- .../assets/scss/basicModal/_animations.scss | 20 + .../assets/scss/basicModal/_container.scss | 40 + resources/assets/scss/basicModal/_main.scss | 16 + resources/assets/scss/basicModal/_modal.scss | 25 + resources/assets/scss/basicModal/_vars.scss | 5 + .../scss/basicModal/components/_button.scss | 47 + .../scss/basicModal/components/_input.scss | 29 + .../scss/basicModal/components/_text.scss | 13 + .../assets/scss/basicModal/themes/_small.scss | 11 + .../scss/basicModal/themes/_xclose.scss | 40 + resources/css/app.css | 67 + resources/css/filepond.css | 1047 + resources/js/app.js | 310 + resources/js/vendor/alpine.min.js | 5 + resources/js/vendor/filepond.js | 12728 ++++++++++++ resources/js/vendor/webauthn/webauthn.js | 88 +- .../components/context-menu/item.blade.php | 8 + .../context-menu/separator.blade.php | 1 + resources/views/components/footer.blade.php | 39 + .../components/forms/buttons/action.blade.php | 7 + .../components/forms/buttons/cancel.blade.php | 7 + .../components/forms/buttons/create.blade.php | 7 + .../components/forms/buttons/danger.blade.php | 7 + .../components/forms/defaulttickbox.blade.php | 7 + .../views/components/forms/dropdown.blade.php | 12 + .../components/forms/error-message.blade.php | 4 + .../components/forms/file-pond.blade.php | 25 + .../forms/inputs/important.blade.php | 8 + .../forms/inputs/password.blade.php | 8 + .../components/forms/inputs/text.blade.php | 7 + .../views/components/forms/textarea.blade.php | 3 + .../views/components/forms/tickbox.blade.php | 9 + .../views/components/forms/toggle.blade.php | 6 + .../gallery/album/details.blade.php | 37 + .../components/gallery/album/hero.blade.php | 22 + .../gallery/album/menu/danger.blade.php | 8 + .../gallery/album/menu/item.blade.php | 10 + .../gallery/album/menu/menu.blade.php | 45 + .../gallery/album/sharing-links.blade.php | 35 + .../album/thumbs/album-thumb.blade.php | 14 + .../gallery/album/thumbs/album.blade.php | 97 + .../gallery/album/thumbs/photo.blade.php | 61 + .../views/components/gallery/badge.blade.php | 7 + .../components/gallery/divider.blade.php | 4 + .../gallery/photo/overlay.blade.php | 23 + .../views/components/header/back.blade.php | 2 + .../views/components/header/bar.blade.php | 6 + .../views/components/header/button.blade.php | 4 + .../views/components/header/search.blade.php | 4 + .../views/components/header/title.blade.php | 3 + .../views/components/help/cell.blade.php | 2 + .../views/components/help/head.blade.php | 1 + resources/views/components/help/kbd.blade.php | 1 + .../views/components/help/table.blade.php | 3 + .../views/components/icons/iconic.blade.php | 2 + .../views/components/layouts/app.blade.php | 27 + .../components/leftbar/leftbar-item.blade.php | 11 + resources/views/components/meta.blade.php | 24 + .../views/components/notifications.blade.php | 71 + .../views/components/shortcuts.blade.php | 115 + .../views/components/update-status.blade.php | 3 + .../views/components/webauthn/login.blade.php | 27 + resources/views/includes/svg.blade.php | 246 +- .../{jobs/list.blade.php => jobs.blade.php} | 0 resources/views/layouts/app.blade.php | 16 +- .../views/layouts/livewire.blade.php.delete | 37 + .../components/context-menu.blade.php | 12 + .../components/header.blade.php.remove.me | 91 + .../livewire/components/left-menu.blade.php | 54 + .../views/livewire/components/modal.blade.php | 18 + .../livewire/components/sidebar.blade.php | 4 + .../context-menus/album-add.blade.php | 16 + .../livewire/context-menus/move.blade.php | 27 + .../context-menus/photos-add.blade.php | 15 + .../forms/add/import-from-server.blade.php | 44 + .../multiple-file-uploader-chunk.blade.php | 48 + .../add/multiple-file-uploader.blade.php | 58 + .../views/livewire/forms/add/upload.blade.php | 10 + .../livewire/forms/album/delete.blade.php | 5 + .../views/livewire/forms/album/move.blade.php | 61 + .../livewire/forms/album/properties.blade.php | 20 + .../forms/album/share-with-line.blade.php | 18 + .../livewire/forms/album/share-with.blade.php | 93 + .../livewire/forms/album/transfer.blade.php | 9 + .../livewire/forms/album/visibility.blade.php | 48 + .../forms/confirms/save-all.blade.php | 11 + .../views/livewire/forms/default.blade.php | 30 + .../livewire/forms/photo/delete.blade.php | 9 + .../livewire/forms/photo/download.blade.php | 38 + .../livewire/forms/photo/visibility.blade.php | 30 + .../forms/profile/get-api-token.blade.php | 22 + .../profile/manage-second-factor.blade.php | 4 + .../forms/profile/set-login.blade.php | 27 + .../forms/settings/double-drop-down.blade.php | 9 + .../forms/settings/drop-down.blade.php | 6 + .../livewire/forms/settings/input.blade.php | 9 + .../livewire/forms/settings/toggle.blade.php | 11 + .../views/livewire/modals/about.blade.php | 27 + .../views/livewire/modals/login.blade.php | 32 + .../modules/diagnostics/pre-colored.blade.php | 9 + .../modules/diagnostics/pre.blade.php | 9 + .../modules/diagnostics/space.blade.php | 16 + .../gallery/sensitive-warning.blade.php | 3 + .../modules/profile/second-factor.blade.php | 26 + .../livewire/modules/sidebar/album.blade.php | 91 + .../livewire/modules/sidebar/photo.blade.php | 116 + .../modules/users/user-line.blade.php | 15 + .../livewire/pages/all-settings.blade.php | 49 + .../livewire/pages/diagnostics.blade.php | 14 + .../views/livewire/pages/frame.blade.php | 7 + .../views/livewire/pages/gallery.blade.php | 42 + .../livewire/pages/gallery/album.blade.php | 85 + .../livewire/pages/gallery/albums.blade.php | 77 + .../livewire/pages/gallery/photo.blade.php | 129 + resources/views/livewire/pages/jobs.blade.php | 24 + .../views/livewire/pages/landing.blade.php | 44 + .../views/livewire/pages/profile.blade.php | 22 + .../views/livewire/pages/settings.blade.php | 55 + .../views/livewire/pages/sharing.blade.php | 51 + .../views/livewire/pages/users.blade.php | 55 + .../vendor/livewire/simple-tailwind.blade.php | 45 + .../views/vendor/livewire/tailwind.blade.php | 114 + routes/api.php | 1 + routes/web-livewire.php | 54 + tailwind.config.js | 92 + vite.config.js | 24 + webpack.mix.js | 8 + 299 files changed, 43668 insertions(+), 16305 deletions(-) create mode 100644 app/Contracts/Livewire/Openable.php create mode 100644 app/Contracts/Livewire/Reloadable.php create mode 100644 app/Enum/Livewire/AlbumMode.php create mode 100644 app/Enum/Livewire/NotificationType.php create mode 100644 app/Enum/Livewire/PhotoOverlayMode.php create mode 100644 app/Enum/Traits/WireableEnumTrait.php create mode 100644 app/Http/RuleSets/AddAlbumRuleSet.php create mode 100644 app/Http/RuleSets/ChangeLoginRuleSet.php create mode 100644 app/Http/RuleSets/LoginRuleSet.php create mode 100644 app/Livewire/Components/Base/ContextMenu.php create mode 100644 app/Livewire/Components/Base/Modal.php create mode 100644 app/Livewire/Components/Forms/Add/ImportFromServer.php create mode 100644 app/Livewire/Components/Forms/Add/ImportFromUrl.php create mode 100644 app/Livewire/Components/Forms/Add/MultipleFileUploader.php create mode 100644 app/Livewire/Components/Forms/Add/Upload.php create mode 100644 app/Livewire/Components/Forms/Album/Create.php create mode 100644 app/Livewire/Components/Forms/Album/CreateTag.php create mode 100644 app/Livewire/Components/Forms/Album/Delete.php create mode 100644 app/Livewire/Components/Forms/Album/Move.php create mode 100644 app/Livewire/Components/Forms/Album/Properties.php create mode 100644 app/Livewire/Components/Forms/Album/ShareWith.php create mode 100644 app/Livewire/Components/Forms/Album/ShareWithLine.php create mode 100644 app/Livewire/Components/Forms/Album/Transfer.php create mode 100644 app/Livewire/Components/Forms/Album/Visibility.php create mode 100644 app/Livewire/Components/Forms/BaseForm.php create mode 100644 app/Livewire/Components/Forms/Confirms/SaveAll.php create mode 100644 app/Livewire/Components/Forms/Photo/Delete.php create mode 100644 app/Livewire/Components/Forms/Profile/GetApiToken.php create mode 100644 app/Livewire/Components/Forms/Profile/ManageSecondFactor.php create mode 100644 app/Livewire/Components/Forms/Profile/SetEmail.php create mode 100644 app/Livewire/Components/Forms/Profile/SetLogin.php create mode 100644 app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php create mode 100644 app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php create mode 100644 app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/Base/StringSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetAlbumDecorationOrientationSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetAlbumDecorationSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetAlbumSortingSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetLangSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetLayoutSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetLicenseDefaultSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetMapProviderSetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetPhotoOverlaySetting.php create mode 100644 app/Livewire/Components/Forms/Settings/SetPhotoSortingSetting.php create mode 100644 app/Livewire/Components/Menus/AlbumAdd.php create mode 100644 app/Livewire/Components/Menus/LeftMenu.php create mode 100644 app/Livewire/Components/Modals/About.php create mode 100644 app/Livewire/Components/Modals/Login.php create mode 100644 app/Livewire/Components/Modules/Diagnostics/AbstractPreSection.php create mode 100644 app/Livewire/Components/Modules/Diagnostics/Configurations.php create mode 100644 app/Livewire/Components/Modules/Diagnostics/Errors.php create mode 100644 app/Livewire/Components/Modules/Diagnostics/Infos.php create mode 100644 app/Livewire/Components/Modules/Diagnostics/Space.php create mode 100644 app/Livewire/Components/Modules/Profile/SecondFactor.php create mode 100644 app/Livewire/Components/Modules/Sidebar/Photo.php create mode 100644 app/Livewire/Components/Modules/Users/UserLine.php create mode 100644 app/Livewire/Components/Pages/AllSettings.php create mode 100644 app/Livewire/Components/Pages/Diagnostics.php create mode 100644 app/Livewire/Components/Pages/Gallery/Album.php create mode 100644 app/Livewire/Components/Pages/Gallery/Albums.php create mode 100644 app/Livewire/Components/Pages/Gallery/Photo.php create mode 100644 app/Livewire/Components/Pages/Gallery/SensitiveWarning.php create mode 100644 app/Livewire/Components/Pages/Jobs.php create mode 100644 app/Livewire/Components/Pages/Landing.php create mode 100644 app/Livewire/Components/Pages/Profile.php create mode 100644 app/Livewire/Components/Pages/Settings.php create mode 100644 app/Livewire/Components/Pages/Sharing.php create mode 100644 app/Livewire/Components/Pages/Users.php create mode 100644 app/Livewire/DTO/AlbumFlags.php create mode 100644 app/Livewire/DTO/PhotoFlags.php create mode 100644 app/Livewire/Forms/AllConfigsForms.php create mode 100644 app/Livewire/Synth/AlbumSynth.php create mode 100644 app/Livewire/Synth/PhotoSynth.php create mode 100644 app/Livewire/Traits/InteractWithContextMenu.php create mode 100644 app/Livewire/Traits/InteractWithModal.php create mode 100644 app/Livewire/Traits/Notify.php create mode 100644 app/Livewire/Traits/UseOpenable.php create mode 100644 app/Livewire/Traits/UseValidator.php create mode 100644 app/Livewire/Traits/UseWireable.php create mode 100644 app/Rules/CurrentPasswordRule.php create mode 100644 app/View/Components/Footer.php create mode 100644 app/View/Components/Gallery/Album/Details.php create mode 100644 app/View/Components/Gallery/Album/Hero.php create mode 100644 app/View/Components/Gallery/Album/SharingLinks.php create mode 100644 app/View/Components/Gallery/Album/Thumbs/Album.php create mode 100644 app/View/Components/Gallery/Album/Thumbs/AlbumThumb.php create mode 100644 app/View/Components/Gallery/Album/Thumbs/Photo.php create mode 100644 app/View/Components/Gallery/Photo/Overlay.php create mode 100644 app/View/Components/Meta.php create mode 100644 config/livewire.php create mode 100644 database/migrations/2023_08_06_110932_add_date_display_configurations.php create mode 100644 phpstan/stubs/Wireable.stub create mode 100644 postcss.config.js create mode 100644 public/css/filepond.css create mode 100644 public/js/alpine.min.js create mode 100644 public/js/filepond.js create mode 100644 public/js/justified-layout.min.js create mode 100644 public/js/webauthn.js delete mode 100644 resources/assets/js/app.js create mode 100644 resources/assets/scss/_basicModal.custom.scss create mode 100644 resources/assets/scss/basicModal/_animations.scss create mode 100644 resources/assets/scss/basicModal/_container.scss create mode 100644 resources/assets/scss/basicModal/_main.scss create mode 100644 resources/assets/scss/basicModal/_modal.scss create mode 100644 resources/assets/scss/basicModal/_vars.scss create mode 100644 resources/assets/scss/basicModal/components/_button.scss create mode 100644 resources/assets/scss/basicModal/components/_input.scss create mode 100644 resources/assets/scss/basicModal/components/_text.scss create mode 100644 resources/assets/scss/basicModal/themes/_small.scss create mode 100644 resources/assets/scss/basicModal/themes/_xclose.scss create mode 100644 resources/css/app.css create mode 100644 resources/css/filepond.css create mode 100644 resources/js/app.js create mode 100644 resources/js/vendor/alpine.min.js create mode 100644 resources/js/vendor/filepond.js create mode 100644 resources/views/components/context-menu/item.blade.php create mode 100644 resources/views/components/context-menu/separator.blade.php create mode 100644 resources/views/components/footer.blade.php create mode 100644 resources/views/components/forms/buttons/action.blade.php create mode 100644 resources/views/components/forms/buttons/cancel.blade.php create mode 100644 resources/views/components/forms/buttons/create.blade.php create mode 100644 resources/views/components/forms/buttons/danger.blade.php create mode 100644 resources/views/components/forms/defaulttickbox.blade.php create mode 100644 resources/views/components/forms/dropdown.blade.php create mode 100644 resources/views/components/forms/error-message.blade.php create mode 100644 resources/views/components/forms/file-pond.blade.php create mode 100644 resources/views/components/forms/inputs/important.blade.php create mode 100644 resources/views/components/forms/inputs/password.blade.php create mode 100644 resources/views/components/forms/inputs/text.blade.php create mode 100644 resources/views/components/forms/textarea.blade.php create mode 100644 resources/views/components/forms/tickbox.blade.php create mode 100644 resources/views/components/forms/toggle.blade.php create mode 100644 resources/views/components/gallery/album/details.blade.php create mode 100644 resources/views/components/gallery/album/hero.blade.php create mode 100644 resources/views/components/gallery/album/menu/danger.blade.php create mode 100644 resources/views/components/gallery/album/menu/item.blade.php create mode 100644 resources/views/components/gallery/album/menu/menu.blade.php create mode 100644 resources/views/components/gallery/album/sharing-links.blade.php create mode 100644 resources/views/components/gallery/album/thumbs/album-thumb.blade.php create mode 100644 resources/views/components/gallery/album/thumbs/album.blade.php create mode 100644 resources/views/components/gallery/album/thumbs/photo.blade.php create mode 100644 resources/views/components/gallery/badge.blade.php create mode 100644 resources/views/components/gallery/divider.blade.php create mode 100644 resources/views/components/gallery/photo/overlay.blade.php create mode 100644 resources/views/components/header/back.blade.php create mode 100644 resources/views/components/header/bar.blade.php create mode 100644 resources/views/components/header/button.blade.php create mode 100644 resources/views/components/header/search.blade.php create mode 100644 resources/views/components/header/title.blade.php create mode 100644 resources/views/components/help/cell.blade.php create mode 100644 resources/views/components/help/head.blade.php create mode 100644 resources/views/components/help/kbd.blade.php create mode 100644 resources/views/components/help/table.blade.php create mode 100644 resources/views/components/icons/iconic.blade.php create mode 100644 resources/views/components/layouts/app.blade.php create mode 100644 resources/views/components/leftbar/leftbar-item.blade.php create mode 100644 resources/views/components/meta.blade.php create mode 100644 resources/views/components/notifications.blade.php create mode 100644 resources/views/components/shortcuts.blade.php create mode 100644 resources/views/components/update-status.blade.php create mode 100644 resources/views/components/webauthn/login.blade.php rename resources/views/{jobs/list.blade.php => jobs.blade.php} (100%) create mode 100644 resources/views/layouts/livewire.blade.php.delete create mode 100644 resources/views/livewire/components/context-menu.blade.php create mode 100644 resources/views/livewire/components/header.blade.php.remove.me create mode 100644 resources/views/livewire/components/left-menu.blade.php create mode 100644 resources/views/livewire/components/modal.blade.php create mode 100644 resources/views/livewire/components/sidebar.blade.php create mode 100644 resources/views/livewire/context-menus/album-add.blade.php create mode 100644 resources/views/livewire/context-menus/move.blade.php create mode 100644 resources/views/livewire/context-menus/photos-add.blade.php create mode 100644 resources/views/livewire/forms/add/import-from-server.blade.php create mode 100644 resources/views/livewire/forms/add/multiple-file-uploader-chunk.blade.php create mode 100644 resources/views/livewire/forms/add/multiple-file-uploader.blade.php create mode 100644 resources/views/livewire/forms/add/upload.blade.php create mode 100644 resources/views/livewire/forms/album/delete.blade.php create mode 100644 resources/views/livewire/forms/album/move.blade.php create mode 100644 resources/views/livewire/forms/album/properties.blade.php create mode 100644 resources/views/livewire/forms/album/share-with-line.blade.php create mode 100644 resources/views/livewire/forms/album/share-with.blade.php create mode 100644 resources/views/livewire/forms/album/transfer.blade.php create mode 100644 resources/views/livewire/forms/album/visibility.blade.php create mode 100644 resources/views/livewire/forms/confirms/save-all.blade.php create mode 100644 resources/views/livewire/forms/default.blade.php create mode 100644 resources/views/livewire/forms/photo/delete.blade.php create mode 100644 resources/views/livewire/forms/photo/download.blade.php create mode 100644 resources/views/livewire/forms/photo/visibility.blade.php create mode 100644 resources/views/livewire/forms/profile/get-api-token.blade.php create mode 100644 resources/views/livewire/forms/profile/manage-second-factor.blade.php create mode 100644 resources/views/livewire/forms/profile/set-login.blade.php create mode 100644 resources/views/livewire/forms/settings/double-drop-down.blade.php create mode 100644 resources/views/livewire/forms/settings/drop-down.blade.php create mode 100644 resources/views/livewire/forms/settings/input.blade.php create mode 100644 resources/views/livewire/forms/settings/toggle.blade.php create mode 100644 resources/views/livewire/modals/about.blade.php create mode 100644 resources/views/livewire/modals/login.blade.php create mode 100644 resources/views/livewire/modules/diagnostics/pre-colored.blade.php create mode 100644 resources/views/livewire/modules/diagnostics/pre.blade.php create mode 100644 resources/views/livewire/modules/diagnostics/space.blade.php create mode 100644 resources/views/livewire/modules/gallery/sensitive-warning.blade.php create mode 100644 resources/views/livewire/modules/profile/second-factor.blade.php create mode 100644 resources/views/livewire/modules/sidebar/album.blade.php create mode 100644 resources/views/livewire/modules/sidebar/photo.blade.php create mode 100644 resources/views/livewire/modules/users/user-line.blade.php create mode 100644 resources/views/livewire/pages/all-settings.blade.php create mode 100644 resources/views/livewire/pages/diagnostics.blade.php create mode 100644 resources/views/livewire/pages/frame.blade.php create mode 100644 resources/views/livewire/pages/gallery.blade.php create mode 100644 resources/views/livewire/pages/gallery/album.blade.php create mode 100644 resources/views/livewire/pages/gallery/albums.blade.php create mode 100644 resources/views/livewire/pages/gallery/photo.blade.php create mode 100644 resources/views/livewire/pages/jobs.blade.php create mode 100644 resources/views/livewire/pages/landing.blade.php create mode 100644 resources/views/livewire/pages/profile.blade.php create mode 100644 resources/views/livewire/pages/settings.blade.php create mode 100644 resources/views/livewire/pages/sharing.blade.php create mode 100644 resources/views/livewire/pages/users.blade.php create mode 100644 resources/views/vendor/livewire/simple-tailwind.blade.php create mode 100644 resources/views/vendor/livewire/tailwind.blade.php create mode 100644 routes/web-livewire.php create mode 100644 tailwind.config.js create mode 100644 vite.config.js diff --git a/.env.example b/.env.example index dc65064bdb2..9622b2e5376 100644 --- a/.env.example +++ b/.env.example @@ -8,6 +8,7 @@ APP_FORCE_HTTPS=false # enable or disable debug bar. By default it is disabled. # Do note that this disable CSP!! DEBUGBAR_ENABLED=false +LIVEWIRE_ENABLED=false # enable or disable log viewer. By default it is enabled. LOG_VIEWER_ENABLED=true @@ -101,3 +102,6 @@ TRUSTED_PROXIES=null # Comma-separated list of class names of diagnostics checks that should be skipped. #SKIP_DIAGNOSTICS_CHECKS= + +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" \ No newline at end of file diff --git a/.github/workflows/.env.mariadb b/.github/workflows/.env.mariadb index ff63b84d058..5b2b4f189d1 100644 --- a/.github/workflows/.env.mariadb +++ b/.github/workflows/.env.mariadb @@ -1,6 +1,6 @@ APP_NAME=Lychee APP_URL=https://localhost -APP_ENV=testing +APP_ENV=dev APP_KEY=SomeRandomString APP_DEBUG=true diff --git a/.github/workflows/.env.postgresql b/.github/workflows/.env.postgresql index ce31ff92ff1..2d6c582c84b 100644 --- a/.github/workflows/.env.postgresql +++ b/.github/workflows/.env.postgresql @@ -1,6 +1,6 @@ APP_NAME=Lychee APP_URL=https://localhost -APP_ENV=testing +APP_ENV=dev APP_KEY=SomeRandomString APP_DEBUG=true diff --git a/.github/workflows/.env.sqlite b/.github/workflows/.env.sqlite index ff3c90395bc..1aff99054cb 100644 --- a/.github/workflows/.env.sqlite +++ b/.github/workflows/.env.sqlite @@ -1,6 +1,6 @@ APP_NAME=Lychee APP_URL=https://localhost -APP_ENV=testing +APP_ENV=dev APP_KEY=SomeRandomString APP_DEBUG=true diff --git a/.github/workflows/php-cs-fixer.yml b/.github/workflows/php-cs-fixer.yml index f96ee5e723a..90fdc20a247 100644 --- a/.github/workflows/php-cs-fixer.yml +++ b/.github/workflows/php-cs-fixer.yml @@ -3,7 +3,10 @@ on: push: branches-ignore: - master + - livewire/** pull_request: + branches-ignore: + - livewire/** paths-ignore: - '**.md' - '**.js' @@ -30,7 +33,7 @@ jobs: coverage: none - name: Install PHP-CS-Fixer run: | - curl -L https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v3.22.0/php-cs-fixer.phar -o .github/build/php-cs-fixer + curl -L https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v3.23.0/php-cs-fixer.phar -o .github/build/php-cs-fixer chmod a+x .github/build/php-cs-fixer - name: Prepare Git User run: | diff --git a/.gitignore b/.gitignore index 3a2bf144a0f..c16f434059b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,22 @@ -/node_modules +# We don't care about those +node_modules build/* +# Those are personal public/dist/user.css +public/dist/custom.js +# Pictures we do not commit public/uploads/** +# Storage stuff: useless /storage/*.key /storage/clockwork/ + +# Those are generated /vendor + +# IDE & Cache stuff /.idea /.vscode /.vagrant @@ -15,18 +24,10 @@ Homestead.json Homestead.yaml npm-debug.log yarn-error.log -.env -.env.* - -aliases - -Lychee/* .phpunit* _ide* - .php_cs.cache .php-cs-fixer.cache - *.log clover.xml *.swp @@ -37,6 +38,19 @@ installed.log storage/bootstrap/cache/* storage/image-jobs/* +# used by Vite +public/hot + sync/* + +# Local DB for easy deployment backup.sql -reset.sh \ No newline at end of file + +# Make sure we don't commit secrets +.env +.env.* + +aliases + +# Building stuff for releaseses +Lychee/* diff --git a/app/Actions/Diagnostics/Pipes/Checks/IniSettingsCheck.php b/app/Actions/Diagnostics/Pipes/Checks/IniSettingsCheck.php index cda251d2a09..efcfc473b4a 100644 --- a/app/Actions/Diagnostics/Pipes/Checks/IniSettingsCheck.php +++ b/app/Actions/Diagnostics/Pipes/Checks/IniSettingsCheck.php @@ -66,6 +66,15 @@ public function handle(array &$data, \Closure $next): array // @codeCoverageIgnoreEnd } + if (extension_loaded('xdebug')) { + // @codeCoverageIgnoreStart + $msg = config('app.debug') !== true + ? 'Errror: xdebug is enabled although Lychee is not in debug mode. Outside of debugging, xdebug may generate significant slowdown on your application.' + : 'Warning: xdebug is enabled. This may generate significant slowdown on your application.'; + $data[] = $msg; + // @codeCoverageIgnoreEnd + } + if (ini_get('assert.exception') !== '1') { // @codeCoverageIgnoreStart $data[] = 'Warning: assert.exception is set to false. Lychee assumes that failing assertions throw proper exceptions.'; diff --git a/app/Assets/ArrayToTextTable.php b/app/Assets/ArrayToTextTable.php index f2fce113814..1fd7947ab21 100644 --- a/app/Assets/ArrayToTextTable.php +++ b/app/Assets/ArrayToTextTable.php @@ -120,54 +120,6 @@ public function getTable(?array $rawData = null): string return $table; } - /** - * @return array - */ - public function getData(): array - { - return $this->data; - } - - public function getDecorator(): DecoratorInterface - { - return $this->decorator; - } - - public function getIndentation(): string - { - return $this->indentation; - } - - public function getDisplayKeys(): bool|string - { - return $this->displayKeys; - } - - public function getUpperKeys(): bool - { - return $this->upperKeys; - } - - public function getKeysAlignment(): int - { - return $this->keysAlignment; - } - - public function getValuesAlignment(): int - { - return $this->valuesAlignment; - } - - public function getFormatter(): ?\Closure - { - return $this->formatter; - } - - public function getIgnoredKeys(): array - { - return $this->ignoredKeys; - } - /** * @param array|null $data * diff --git a/app/Assets/Helpers.php b/app/Assets/Helpers.php index ef96076da12..1a8db018d64 100644 --- a/app/Assets/Helpers.php +++ b/app/Assets/Helpers.php @@ -256,4 +256,22 @@ public function isExecAvailable(): bool return function_exists('exec') && !in_array('exec', $disabledFunctions, true); } + + /** + * Given a duration convert it into hms. + * + * @param int|float $d length in seconds + * + * @return string equivalent time string formatted + */ + public function secondsToHMS(int|float $d): string + { + $h = (int) floor($d / 3600); + $m = (int) floor(($d % 3600) / 60); + $s = (int) floor($d % 60); + + return ($h > 0 ? $h . 'h' : '') + . ($m > 0 ? $m . 'm' : '') + . ($s > 0 || ($h === 0 && $m === 0) ? $s . 's' : ''); + } } diff --git a/app/Contracts/Livewire/Openable.php b/app/Contracts/Livewire/Openable.php new file mode 100644 index 00000000000..1fb10b4eb54 --- /dev/null +++ b/app/Contracts/Livewire/Openable.php @@ -0,0 +1,32 @@ +value); } + + /** + * Convert the enum into it's translated format. + * Note that it is missing owner. + * + * @return array + */ + public static function toTranslation(): array + { + return [ + self::CREATED_AT->value => __('lychee.SORT_ALBUM_SELECT_1'), + self::TITLE->value => __('lychee.SORT_ALBUM_SELECT_2'), + self::DESCRIPTION->value => __('lychee.SORT_ALBUM_SELECT_3'), + self::MIN_TAKEN_AT->value => __('lychee.SORT_ALBUM_SELECT_5'), + self::MAX_TAKEN_AT->value => __('lychee.SORT_ALBUM_SELECT_6'), + ]; + } } diff --git a/app/Enum/ColumnSortingPhotoType.php b/app/Enum/ColumnSortingPhotoType.php index 471c5c2fe1b..324da6544a5 100644 --- a/app/Enum/ColumnSortingPhotoType.php +++ b/app/Enum/ColumnSortingPhotoType.php @@ -2,6 +2,8 @@ namespace App\Enum; +use App\Enum\Traits\DecorateBackedEnum; + /** * Enum ColumnSortingPhotoType. * @@ -9,6 +11,8 @@ */ enum ColumnSortingPhotoType: string { + use DecorateBackedEnum; + case OWNER_ID = 'owner_id'; case CREATED_AT = 'created_at'; case TITLE = 'title'; @@ -28,4 +32,23 @@ public function toColumnSortingType(): ColumnSortingType { return ColumnSortingType::from($this->value); } + + /** + * Convert the enum into it's translated format. + * Note that it is missing owner. + * + * @return array + */ + public static function toTranslation(): array + { + return [ + self::CREATED_AT->value => __('lychee.SORT_PHOTO_SELECT_1'), + self::TAKEN_AT->value => __('lychee.SORT_PHOTO_SELECT_2'), + self::TITLE->value => __('lychee.SORT_PHOTO_SELECT_3'), + self::DESCRIPTION->value => __('lychee.SORT_PHOTO_SELECT_4'), + self::IS_PUBLIC->value => __('lychee.SORT_PHOTO_SELECT_5'), + self::IS_STARRED->value => __('lychee.SORT_PHOTO_SELECT_6'), + self::TYPE->value => __('lychee.SORT_PHOTO_SELECT_7'), + ]; + } } diff --git a/app/Enum/Livewire/AlbumMode.php b/app/Enum/Livewire/AlbumMode.php new file mode 100644 index 00000000000..32a5a069202 --- /dev/null +++ b/app/Enum/Livewire/AlbumMode.php @@ -0,0 +1,27 @@ +name); + } +} diff --git a/app/Enum/Livewire/NotificationType.php b/app/Enum/Livewire/NotificationType.php new file mode 100644 index 00000000000..e6f2dc86faa --- /dev/null +++ b/app/Enum/Livewire/NotificationType.php @@ -0,0 +1,11 @@ + + */ + public static function toTranslation(): array + { + return [ + self::ASC->value => __('lychee.SORT_ASCENDING'), + self::DESC->value => __('lychee.SORT_DESCENDING'), + ]; + } } diff --git a/app/Enum/SmartAlbumType.php b/app/Enum/SmartAlbumType.php index 469061b6239..db68bad4799 100644 --- a/app/Enum/SmartAlbumType.php +++ b/app/Enum/SmartAlbumType.php @@ -12,8 +12,8 @@ enum SmartAlbumType: string use DecorateBackedEnum; case UNSORTED = 'unsorted'; + case PUBLIC = 'public'; case STARRED = 'starred'; case RECENT = 'recent'; - case PUBLIC = 'public'; case ON_THIS_DAY = 'on_this_day'; } \ No newline at end of file diff --git a/app/Enum/Traits/WireableEnumTrait.php b/app/Enum/Traits/WireableEnumTrait.php new file mode 100644 index 00000000000..edf5a498018 --- /dev/null +++ b/app/Enum/Traits/WireableEnumTrait.php @@ -0,0 +1,35 @@ +value; + } + + public static function fromLivewire(mixed $value): self + { + if (!is_string($value) && !is_int($value)) { + throw new LycheeLogicException('Enum could not be instanciated from ' . strval($value), null); + } + + return self::from($value); + } + + /** + * @return string[]|int[]|\Closure + * + * @psalm-return array | Closure(string):(int|string) + */ + protected static function values() + { + return function (string $name): string { + return mb_strtolower($name); + }; + } +} \ No newline at end of file diff --git a/app/Exceptions/Handlers/AccessDBDenied.php b/app/Exceptions/Handlers/AccessDBDenied.php index 918be4e661c..6006855bf3e 100644 --- a/app/Exceptions/Handlers/AccessDBDenied.php +++ b/app/Exceptions/Handlers/AccessDBDenied.php @@ -7,7 +7,6 @@ use Illuminate\Database\QueryException; use Symfony\Component\HttpFoundation\Response as SymfonyResponse; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface as HttpException; -use Throwable; /** * Class AccessDBDenied. @@ -45,7 +44,7 @@ public function renderHttpException(SymfonyResponse $defaultResponse, HttpExcept } return $redirectResponse; - } catch (Throwable) { + } catch (\Throwable) { return $defaultResponse; } } diff --git a/app/Exceptions/Handlers/NoEncryptionKey.php b/app/Exceptions/Handlers/NoEncryptionKey.php index fe65b0ff758..7240e6b26be 100644 --- a/app/Exceptions/Handlers/NoEncryptionKey.php +++ b/app/Exceptions/Handlers/NoEncryptionKey.php @@ -7,7 +7,6 @@ use Illuminate\Encryption\MissingAppKeyException; use Symfony\Component\HttpFoundation\Response as SymfonyResponse; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface as HttpException; -use Throwable; /** * Class NoEncryptionKey. @@ -45,7 +44,7 @@ public function renderHttpException(SymfonyResponse $defaultResponse, HttpExcept } return $redirectResponse; - } catch (Throwable) { + } catch (\Throwable) { return $defaultResponse; } } diff --git a/app/Facades/Helpers.php b/app/Facades/Helpers.php index e6523e63fd8..30c627c77d4 100644 --- a/app/Facades/Helpers.php +++ b/app/Facades/Helpers.php @@ -22,6 +22,7 @@ * @method static void data_index_set(int $idx = 0) * @method static array get_all_licenses() * @method static bool isExecAvailable() + * @method static string secondsToHMS(int|float $d) */ class Helpers extends Facade { diff --git a/app/Http/Controllers/Administration/JobController.php b/app/Http/Controllers/Administration/JobController.php index ac846f9eec4..e36bfe6bfe5 100644 --- a/app/Http/Controllers/Administration/JobController.php +++ b/app/Http/Controllers/Administration/JobController.php @@ -38,6 +38,6 @@ public function list(ShowJobsRequest $request, string $order = 'desc'): Collecti */ public function view(ShowJobsRequest $request): View { - return view('jobs.list', ['jobs' => $this->list($request)]); + return view('jobs', ['jobs' => $this->list($request)]); } } diff --git a/app/Http/Controllers/Administration/UserController.php b/app/Http/Controllers/Administration/UserController.php index 659819b3826..1f6c75df6c1 100644 --- a/app/Http/Controllers/Administration/UserController.php +++ b/app/Http/Controllers/Administration/UserController.php @@ -35,7 +35,6 @@ public function updateLogin(ChangeLoginRequest $request, UpdateLogin $updateLogi $request->oldPassword(), $request->ip() ); - // Update the session with the new credentials of the user. // Otherwise, the session is out-of-sync and falsely assumes the user // to be unauthenticated upon the next request. diff --git a/app/Http/Controllers/IndexController.php b/app/Http/Controllers/IndexController.php index a5b6d1f9f42..ab24f635a39 100644 --- a/app/Http/Controllers/IndexController.php +++ b/app/Http/Controllers/IndexController.php @@ -214,6 +214,8 @@ protected function frontend(?string $title = null, ?string $description = null, /** * Returns user.css url with cache busting if file has been updated. * + * @param string $fileName + * * @return string */ public static function getUserCustomFiles(string $fileName): string diff --git a/app/Http/Controllers/PhotoController.php b/app/Http/Controllers/PhotoController.php index 74075b99280..49136eb4727 100644 --- a/app/Http/Controllers/PhotoController.php +++ b/app/Http/Controllers/PhotoController.php @@ -89,6 +89,7 @@ public function getRandom(PhotoQueryPolicy $photoQueryPolicy): PhotoResource ->photos() ->with(['album', 'size_variants', 'size_variants.sym_links']); } + // PHPStan does not understand that `firstOrFail` returns `Photo`, but assumes that it returns `Model` // @phpstan-ignore-next-line return PhotoResource::make($query->inRandomOrder() diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index cd7300f5d39..a562195e0a3 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -92,5 +92,6 @@ class Kernel extends HttpKernel 'content_type' => \App\Http\Middleware\ContentType::class, 'accept_content_type' => \App\Http\Middleware\AcceptContentType::class, 'redirect-legacy-id' => \App\Http\Middleware\RedirectLegacyPhotoID::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ]; } diff --git a/app/Http/Middleware/AcceptContentType.php b/app/Http/Middleware/AcceptContentType.php index e31d3c53795..c696f33798d 100644 --- a/app/Http/Middleware/AcceptContentType.php +++ b/app/Http/Middleware/AcceptContentType.php @@ -19,6 +19,15 @@ class AcceptContentType public const JSON = 'json'; public const HTML = 'html'; + /** + * The URIs that should be excluded from CSRF verification. + * + * @var array + */ + protected $except = [ + 'livewire/upload-file', + ]; + /** * Handles the incoming request. * @@ -36,6 +45,11 @@ class AcceptContentType */ public function handle(Request $request, \Closure $next, string $contentType): mixed { + // Skip $except + if ($this->inExceptArray($request)) { + return $next($request); + } + if ($contentType === self::JSON) { if (!$request->expectsJson()) { throw new UnexpectedContentType(self::JSON); @@ -60,4 +74,26 @@ public function handle(Request $request, \Closure $next, string $contentType): m return $next($request); } + + /** + * Determine if the request has a URI that should pass through CSRF verification. + * + * @param \Illuminate\Http\Request $request + * + * @return bool + */ + protected function inExceptArray($request) + { + foreach ($this->except as $except) { + if ($except !== '/') { + $except = trim($except, '/'); + } + + if ($request->fullUrlIs($except) || $request->is($except)) { + return true; + } + } + + return false; + } } diff --git a/app/Http/Middleware/DisableCSP.php b/app/Http/Middleware/DisableCSP.php index 43763e2ac47..b19f4d65217 100644 --- a/app/Http/Middleware/DisableCSP.php +++ b/app/Http/Middleware/DisableCSP.php @@ -3,7 +3,9 @@ namespace App\Http\Middleware; use App\Contracts\Exceptions\LycheeException; +use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Http\Request; +use Illuminate\Support\Facades\File; /** * Class DisableCSP. @@ -44,6 +46,30 @@ public function handle(Request $request, \Closure $next): mixed config(['secure-headers.csp.script-src.hashes.sha256' => []]); } + if (config('app.livewire', false) === true) { + $this->handleLivewire(); + } + return $next($request); } + + /** + * Disabling rules because of poor decision from the designer of Livewire. + * + * @return void + * + * @throws BindingResolutionException + */ + private function handleLivewire() + { + // We have to disable unsafe-eval because Livewire requires it... + // So stupid.... + config(['secure-headers.csp.script-src.unsafe-eval' => true]); + + // if the public/hot file exists, it means that we need to disable CSP completely + // As we will be reloading on the fly the page and Vite has poor CSP support. + if (File::exists(public_path('hot'))) { + config(['secure-headers.csp.enable' => false]); + } + } } diff --git a/app/Http/Resources/Collections/AlbumForestResource.php b/app/Http/Resources/Collections/AlbumForestResource.php index d659e09ea63..03b59854ed7 100644 --- a/app/Http/Resources/Collections/AlbumForestResource.php +++ b/app/Http/Resources/Collections/AlbumForestResource.php @@ -12,8 +12,8 @@ class AlbumForestResource extends JsonResource { public function __construct( - private Collection $albums, - private ?Collection $sharedAlbums = null + public Collection $albums, + public ?Collection $sharedAlbums = null ) { // Laravel applies a shortcut when this value === null but not when it is something else. parent::__construct('must_not_be_null'); diff --git a/app/Http/RuleSets/AddAlbumRuleSet.php b/app/Http/RuleSets/AddAlbumRuleSet.php new file mode 100644 index 00000000000..ea199a81aea --- /dev/null +++ b/app/Http/RuleSets/AddAlbumRuleSet.php @@ -0,0 +1,19 @@ + ['present', new RandomIDRule(true)], + RequestAttribute::TITLE_ATTRIBUTE => ['required', new TitleRule()], + ]; + } +} diff --git a/app/Http/RuleSets/ChangeLoginRuleSet.php b/app/Http/RuleSets/ChangeLoginRuleSet.php new file mode 100644 index 00000000000..c26dc678f60 --- /dev/null +++ b/app/Http/RuleSets/ChangeLoginRuleSet.php @@ -0,0 +1,20 @@ + ['sometimes', new UsernameRule(true)], + RequestAttribute::PASSWORD_ATTRIBUTE => ['required', 'confirmed', new PasswordRule(false)], + RequestAttribute::OLD_PASSWORD_ATTRIBUTE => ['required', new PasswordRule(false)], + ]; + } +} diff --git a/app/Http/RuleSets/LoginRuleSet.php b/app/Http/RuleSets/LoginRuleSet.php new file mode 100644 index 00000000000..e8feffcc82b --- /dev/null +++ b/app/Http/RuleSets/LoginRuleSet.php @@ -0,0 +1,19 @@ + ['required', new UsernameRule()], + RequestAttribute::PASSWORD_ATTRIBUTE => ['required', new PasswordRule(false)], + ]; + } +} diff --git a/app/Livewire/Components/Base/ContextMenu.php b/app/Livewire/Components/Base/ContextMenu.php new file mode 100644 index 00000000000..5fc8ae81b95 --- /dev/null +++ b/app/Livewire/Components/Base/ContextMenu.php @@ -0,0 +1,70 @@ +type = $type; + $this->params = $params; + $this->open(); + } + + /** + * Close the ContextMenu component. + * + * @return void + */ + #[On('closeContextMenu')] + public function closeContextMenu(): void + { + $this->close(); + } + + /** + * Rendering of the Component. + * + * @return View + */ + public function render(): View + { + return view('livewire.components.context-menu'); + } +} diff --git a/app/Livewire/Components/Base/Modal.php b/app/Livewire/Components/Base/Modal.php new file mode 100644 index 00000000000..231b79de9d4 --- /dev/null +++ b/app/Livewire/Components/Base/Modal.php @@ -0,0 +1,88 @@ + no close button + * any other string correspond to the LANG text. + * + * @var string + */ + public string $close_text = ''; + + /** + * @var array defines the arguments to be passed to the + * Livewire component loaded inside the Modal + */ + public array $params = []; + + /** + * Css properties for the modal. + * + * @var string + */ + public string $modalSize = 'md:max-w-xl'; + + /** + * Open a Modal. + * + * @param string $type defines the Component loaded inside the modal + * @param string $close_text text to put if we use a close button + * @param array $params Arguments to pass to the modal + * + * @return void + */ + #[On('openModal')] + public function openModal(string $type, string $close_text = '', array $params = []): void + { + $this->open(); + $this->type = $type; + $this->close_text = $close_text; + $this->params = $params; + } + + /** + * Close the Modal component. + * + * @return void + */ + #[On('closeModal')] + public function closeModal(): void + { + $this->close(); + } + + /** + * Rendering of the Component. + * + * @return View + */ + public function render(): View + { + return view('livewire.components.modal'); + } +} diff --git a/app/Livewire/Components/Forms/Add/ImportFromServer.php b/app/Livewire/Components/Forms/Add/ImportFromServer.php new file mode 100644 index 00000000000..691762b1cd3 --- /dev/null +++ b/app/Livewire/Components/Forms/Add/ImportFromServer.php @@ -0,0 +1,89 @@ +render = 'add.import-from-server'; + + // Initialize form elements (and dependent form elements) based on + // global configuration settings. + $this->form = [ + RequestAttribute::PATH_ATTRIBUTE => public_path('uploads/import/'), + RequestAttribute::DELETE_IMPORTED_ATTRIBUTE => Configs::getValueAsBool('delete_imported'), + RequestAttribute::IMPORT_VIA_SYMLINK_ATTRIBUTE => !Configs::getValueAsBool('delete_imported') && Configs::getValueAsBool('import_via_symlink'), + RequestAttribute::SKIP_DUPLICATES_ATTRIBUTE => Configs::getValueAsBool('skip_duplicates'), + RequestAttribute::RESYNC_METADATA_ATTRIBUTE => false, + ]; + } + + /** + * Hook the submit button. + * + * @return void + * + * @throws \Throwable + * @throws ValidationException + * @throws BindingResolutionException + * @throws \InvalidArgumentException + * @throws QueryBuilderException + */ + public function submit(): void + { + // Empty error bag + $this->resetErrorBag(); + + // prepare + $subject = $this->form[RequestAttribute::PATH_ATTRIBUTE]; + + // We split the given path string at unescaped spaces into an + // array or more precisely we create an array whose entries + // match strings with non-space characters or escaped spaces. + // After splitting, the escaped spaces must be replaced by + // proper spaces as escaping of spaces is a GUI-only thing to + // allow input of several paths into a single input field. + $pattern = '/(?:\\ |\S)+/'; + preg_match($pattern, $subject, $matches); + + // drop first element: matched elements start at index 1 + array_shift($matches); + $this->form[RequestAttribute::PATH_ATTRIBUTE] = array_map(fn ($v) => str_replace('\\ ', ' ', $v), $matches); + + // Validate + // $values = $this->validate()['form']; + // TODO: Return streamed response ? + } +} diff --git a/app/Livewire/Components/Forms/Add/ImportFromUrl.php b/app/Livewire/Components/Forms/Add/ImportFromUrl.php new file mode 100644 index 00000000000..fee3ac1e061 --- /dev/null +++ b/app/Livewire/Components/Forms/Add/ImportFromUrl.php @@ -0,0 +1,112 @@ +title = __('lychee.UPLOAD_IMPORT_INSTR'); + $this->validate = __('lychee.UPLOAD_IMPORT'); + $this->cancel = __('lychee.CANCEL'); + // Localization + $this->formLocale = [ + RequestAttribute::URLS_ATTRIBUTE => 'https://', + ]; + // values + $this->form = [ + RequestAttribute::URLS_ATTRIBUTE => '', + RequestAttribute::ALBUM_ID_ATTRIBUTE => $params['parentId'], + ]; + $this->formHidden = [RequestAttribute::ALBUM_ID_ATTRIBUTE]; + } + + /** + * A form has a Submit method. + * + * @return void + */ + public function submit(): void + { + // Reset error bag + $this->resetErrorBag(); + + /** @var int $currentUserId */ + $currentUserId = Auth::id() ?? throw new UnauthenticatedException(); + + // prepare + $subject = $this->form[RequestAttribute::URLS_ATTRIBUTE]; + $this->form[RequestAttribute::URLS_ATTRIBUTE] = [$subject]; + $values = $this->validate()['form']; + + $parentAlbumID = $values[RequestAttribute::ALBUM_ID_ATTRIBUTE]; + + /** @var Album|null $parentAlbum */ + $parentAlbum = $parentAlbumID === null ? null : Album::query()->findOrFail($parentAlbumID); + + // The replacement below looks suspicious. + // If it was really necessary, then there would be much more special + // characters (e.i. for example umlauts in international domain names) + // which would require replacement by their corresponding %-encoding. + // However, I assume that the PHP method `fopen` is happily fine with + // any character and internally handles special characters itself. + // Hence, either use a proper encoding method here instead of our + // home-brewed, poor-man replacement or drop it entirely. + // TODO: Find out what is needed and proceed accordingly. + $urls = str_replace(' ', '%20', $values[RequestAttribute::URLS_ATTRIBUTE]); + + // Authorize + Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $parentAlbum]); + + // Create + $fromUrl = resolve(FromUrl::class); + $fromUrl->do($urls, $parentAlbum, $currentUserId); + + // Do we want refresh or direcly open newly created Album ? + $this->dispatch('reload')->to(PageGalleryAlbum::class); + // $this->dispatch('reload')->to(PageGalleryAlbum::class); + + $this->close(); + } +} diff --git a/app/Livewire/Components/Forms/Add/MultipleFileUploader.php b/app/Livewire/Components/Forms/Add/MultipleFileUploader.php new file mode 100644 index 00000000000..c7668e55cdf --- /dev/null +++ b/app/Livewire/Components/Forms/Add/MultipleFileUploader.php @@ -0,0 +1,163 @@ +uploads[intval($index)]; + + // // Final File + // $fileName = $fileDetails['fileName']; + // $finalPath = Storage::path('/livewire-tmp/'.$fileName); + + // // Chunk File + // $chunkName = $fileDetails['fileChunk']->getFileName(); + // $chunkPath = Storage::path('/livewire-tmp/'.$chunkName); + // $chunk = fopen($chunkPath, 'rb'); + // $buff = fread($chunk, $this->chunkSize); + // fclose($chunk); + + // // Merge Together + // $final = fopen($finalPath, 'ab'); + // fwrite($final, $buff); + // fclose($final); + // unlink($chunkPath); + + // // Progress + // $curSize = Storage::size('/livewire-tmp/'.$fileName); + // $this->uploads[$index]['progress'] = + // $curSize/$fileDetails['fileSize']*100; + // if( $this->uploads[$index]['progress'] == 100 ){ + // $this->uploads[$index]['fileRef'] = + // TemporaryUploadedFile::createFromLivewire( + // '/'.$fileDetails['fileName'] + // ); + // } + // } + // } + + // public function render() + // { + // return view('livewire.forms.add.multiple-file-uploader-chunk'); + // } + + use WithFileUploads; + + /** @var array */ + public $files = []; + + /** + * @var array + */ + public $uploadedThumbs = []; + + /** + * @var array + */ + public $skipped = []; + + /** + * @var string|null albumId of where to upload the picture + */ + public ?string $albumId = null; + + /** + * Mount the component. + * + * @param array $params + * + * @return void + */ + public function mount(array $params = []): void + { + $this->albumId = $params['parentId'] ?? null; + } + + public function updatedFiles(): void + { + foreach ($this->files as $idx => $file) { + if (!array_key_exists($idx, $this->uploadedThumbs) && !array_key_exists($idx, $this->skipped)) { + // This code is a nasty work-around which should not exist. + // PHP stores a temporary copy of the uploaded file without a file + // extension. + // Unfortunately, most of our methods pass around absolute file paths + // instead of proper `File` object. + // During the process we have a lot of code which tries to + // re-determine the MIME type of the file based on the file path. + // This is not only inefficient, but the original MIME type (of the + // uploaded file) gets lost on the way. + // As a work-around we store the uploaded file with a file extension. + // Unfortunately, we cannot simply re-name the file, because this + // might break due to permission problems for certain installation + // if the temporarily uploaded file is stored in the system-global + // temporary directory below another mount point or another Docker + // image than the Lychee installation. + // Hence, we must make a deep copy. + // TODO: Remove this code again, if all other TODOs regarding MIME and file handling are properly refactored and we have stopped using absolute file paths as the least common denominator to pass around files. + $uploadedFile = new UploadedFile($file); + $processableFile = new ProcessableJobFile( + $uploadedFile->getOriginalExtension(), + $uploadedFile->getOriginalBasename() + ); + $processableFile->write($uploadedFile->read()); + $uploadedFile->close(); + $uploadedFile->delete(); + $processableFile->close(); + // End of work-around + + try { + $this->uploadedThumbs[$idx] = 'img/placeholder.png'; + if (Configs::getValueAsBool('use_job_queues')) { + // TODO: replace 0 correct time/date + ProcessImageJob::dispatch($processableFile, $this->albumId, 0); + } else { + // TODO: replace 0 correct time/date + ProcessImageJob::dispatchSync($processableFile, $this->albumId, 0); + } + } catch (PhotoSkippedException $e) { + $this->skipped[$idx] = true; + } + } + } + } + + // public function finishUpload($name, $tmpPath, $isMultiple) + // { + // $this->cleanupOldUploads(); + + // $files = collect($tmpPath)->map(function ($i) { + // return TemporaryUploadedFile::createFromLivewire($i); + // })->toArray(); + // $this->dispatch('upload:finished', $name, collect($files)->map->getFilename()->toArray())->self(); + + // $files = array_merge($this->getPropertyValue($name), $files); + // $this->syncInput($name, $files); + // } + + /** + * @return View + */ + public function render(): View + { + return view('livewire.forms.add.multiple-file-uploader'); + } +} diff --git a/app/Livewire/Components/Forms/Add/Upload.php b/app/Livewire/Components/Forms/Add/Upload.php new file mode 100644 index 00000000000..40748329a15 --- /dev/null +++ b/app/Livewire/Components/Forms/Add/Upload.php @@ -0,0 +1,104 @@ + */ + public $files = []; + + /** + * @var array + */ + public $uploadedThumbs = []; + + /** + * @var array + */ + public $skipped = []; + + /** + * @var string|null albumId of where to upload the picture + */ + public ?string $albumId = null; + + /** + * Mount the component. + * + * @param array $params + * + * @return void + */ + public function mount(array $params = []): void + { + $this->albumId = $params['parentId'] ?? null; + } + + protected function updatedFiles(): void + { + foreach ($this->files as $idx => $file) { + if (!array_key_exists($idx, $this->uploadedThumbs) && !array_key_exists($idx, $this->skipped)) { + // This code is a nasty work-around which should not exist. + // PHP stores a temporary copy of the uploaded file without a file + // extension. + // Unfortunately, most of our methods pass around absolute file paths + // instead of proper `File` object. + // During the process we have a lot of code which tries to + // re-determine the MIME type of the file based on the file path. + // This is not only inefficient, but the original MIME type (of the + // uploaded file) gets lost on the way. + // As a work-around we store the uploaded file with a file extension. + // Unfortunately, we cannot simply re-name the file, because this + // might break due to permission problems for certain installation + // if the temporarily uploaded file is stored in the system-global + // temporary directory below another mount point or another Docker + // image than the Lychee installation. + // Hence, we must make a deep copy. + // TODO: Remove this code again, if all other TODOs regarding MIME and file handling are properly refactored and we have stopped using absolute file paths as the least common denominator to pass around files. + $uploadedFile = new UploadedFile($file); + $processableFile = new ProcessableJobFile( + $uploadedFile->getOriginalExtension(), + $uploadedFile->getOriginalBasename() + ); + $processableFile->write($uploadedFile->read()); + $uploadedFile->close(); + $uploadedFile->delete(); + $processableFile->close(); + // End of work-around + + try { + $this->uploadedThumbs[$idx] = 'img/placeholder.png'; + if (Configs::getValueAsBool('use_job_queues')) { + // TODO: replace 0 correct time/date + ProcessImageJob::dispatch($processableFile, $this->albumId, 0); + } else { + // TODO: replace 0 correct time/date + ProcessImageJob::dispatchSync($processableFile, $this->albumId, 0); + } + } catch (PhotoSkippedException $e) { + $this->skipped[$idx] = true; + } + } + } + } + + public function render(): View + { + return view('livewire.forms.add.upload'); + } +} diff --git a/app/Livewire/Components/Forms/Album/Create.php b/app/Livewire/Components/Forms/Album/Create.php new file mode 100644 index 00000000000..3131fa025b3 --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Create.php @@ -0,0 +1,97 @@ +title = __('lychee.TITLE_NEW_ALBUM'); + $this->validate = __('lychee.CREATE_ALBUM'); + $this->cancel = __('lychee.CANCEL'); + // Localization + $this->formLocale = [ + RequestAttribute::TITLE_ATTRIBUTE => __('lychee.UNTITLED'), + ]; + // values + $this->form = [ + RequestAttribute::TITLE_ATTRIBUTE => '', + RequestAttribute::PARENT_ID_ATTRIBUTE => $params['parentId'], + ]; + $this->formHidden = [RequestAttribute::PARENT_ID_ATTRIBUTE]; + } + + /** + * A form has a Submit method. + * + * @return void + */ + public function submit(): void + { + // Reset error bag + $this->resetErrorBag(); + + // Validate + $values = $this->validate()['form']; + $parentAlbumID = $values[RequestAttribute::PARENT_ID_ATTRIBUTE]; + $title = $values[RequestAttribute::TITLE_ATTRIBUTE]; + + /** @var Album|null $parentAlbum */ + $parentAlbum = $parentAlbumID === null ? null : Album::query()->findOrFail($parentAlbumID); + + // Authorize + Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $parentAlbum]); + + /** @var int $ownerId */ + $ownerId = Auth::id() ?? throw new UnauthenticatedException(); + $create = new AlbumCreate($ownerId); + $create->create($title, $parentAlbum); + + // Do we want refresh or direcly open newly created Album ? + $this->dispatch('reload')->to(PagesGalleryAlbums::class); + $this->dispatch('reload')->to(PagesGalleryAlbum::class); + + $this->close(); + } +} diff --git a/app/Livewire/Components/Forms/Album/CreateTag.php b/app/Livewire/Components/Forms/Album/CreateTag.php new file mode 100644 index 00000000000..7d073dff15f --- /dev/null +++ b/app/Livewire/Components/Forms/Album/CreateTag.php @@ -0,0 +1,95 @@ +title = __('lychee.ALBUM_NEW_TITLE'); + $this->validate = __('lychee.CREATE_TAG_ALBUM'); + $this->cancel = __('lychee.CANCEL'); + // Localization + $this->formLocale = [ + RequestAttribute::TITLE_ATTRIBUTE => __('lychee.UNTITLED'), + RequestAttribute::TAGS_ATTRIBUTE => __('lychee.PHOTO_TAGS'), + ]; + + // values + $this->form = [ + RequestAttribute::TITLE_ATTRIBUTE => '', + RequestAttribute::TAGS_ATTRIBUTE => '', + ]; + $this->formHidden = [RequestAttribute::PARENT_ID_ATTRIBUTE]; + } + + /** + * A form has a Submit method. + * + * @return void + */ + public function submit(): void + { + // Reset error bag + $this->resetErrorBag(); + + // prepare + // TODO: Refactor tags rules. + $this->form[RequestAttribute::TAGS_ATTRIBUTE] = explode(',', $this->form[RequestAttribute::TAGS_ATTRIBUTE]); + + // Validate + $values = $this->validate()['form']; + $tags = $values[RequestAttribute::TAGS_ATTRIBUTE]; + $title = $values[RequestAttribute::TITLE_ATTRIBUTE]; + + // Authorize + Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, null]); + + // Create + resolve(CreateTagAlbum::class)->create($title, $tags); + + // Do we want refresh or direcly open newly created Album ? + $this->dispatch('reload')->to(PagesGalleryAlbums::class); + $this->dispatch('reload')->to(PagesGalleryAlbum::class); + + $this->close(); + } +} diff --git a/app/Livewire/Components/Forms/Album/Delete.php b/app/Livewire/Components/Forms/Album/Delete.php new file mode 100644 index 00000000000..7849c158463 --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Delete.php @@ -0,0 +1,77 @@ + */ + public array $albumIDs; + public string $title; + + /** + * This is the equivalent of the constructor for Livewire Components. + * + * @param BaseAlbum $album to update the attributes of + * + * @return void + */ + public function mount(BaseAlbum $album): void + { + $this->albumIDs = [$album->id]; + $this->title = $album->title; + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.delete'); + } + + /** + * Execute deletion. + * + * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + */ + public function delete(AlbumFactory $albumFactory): \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + { + $this->validate(DeleteAlbumsRuleSet::rules()); + + $baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumIDs[0], false); + + $this->authorize(AlbumPolicy::CAN_DELETE, $baseAlbum); + + $parent_id = ($baseAlbum instanceof Album) ? $baseAlbum->parent_id : null; + + $delete = resolve(DeleteAction::class); + $fileDeleter = $delete->do([$baseAlbum->id]); + App::terminating(fn () => $fileDeleter->do()); + + if ($parent_id !== null) { + return redirect()->to(route('livewire-gallery-album', ['albumId' => $parent_id])); + } + + return redirect()->to(route('livewire-gallery')); + } +} diff --git a/app/Livewire/Components/Forms/Album/Move.php b/app/Livewire/Components/Forms/Album/Move.php new file mode 100644 index 00000000000..f2620cd107a --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Move.php @@ -0,0 +1,242 @@ + */ + public array $albumIDs; + public ?string $titleMoved; + + // Destination + public ?string $albumID = null; + public ?string $title = null; + + public ?string $search = null; // ! wired + + public array $albumListSaved; + + /** + * This is the equivalent of the constructor for Livewire Components. + * + * @param Album $album to update the attributes of + * + * @return void + */ + public function mount(Album $album): void + { + $this->albumIDs = [$album->id]; + $this->titleMoved = $album->title; + + $this->albumListSaved = $this->getAlbumsListWithPath($album); + } + + /** + * Give the tree of albums owned by the user. + * + * @return Collection + */ + public function getAlbumListProperty(): Collection + { + $filtered = collect($this->albumListSaved); + if ($this->search !== null && trim($this->search) !== '') { + return $filtered->filter(function (array $album) { + return Str::contains($album['title'], ltrim($this->search), true); + }); + } + + return $filtered; + } + + /** + * Prepare confirmation step. + * + * @param string $id + * @param string $title + * + * @return void + */ + public function check(string $id, string $title) + { + $this->albumID = $id; + $this->title = $title; + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.move'); + } + + private function getAlbumsListWithPath(Album $album): array + { + $albumQueryPolicy = resolve(AlbumQueryPolicy::class); + $unfiltered = $albumQueryPolicy->applyReachabilityFilter( + // We remove all sub albums + // Otherwise it would create cyclic dependency + Album::query() + ->where('_lft', '<', $album->_lft) + ->orWhere('_rgt', '>', $album->_rgt) + ); + $sorting = AlbumSortingCriterion::createDefault(); + $query = (new SortingDecorator($unfiltered)) + ->orderBy($sorting->column, $sorting->order); + + /** @var NsCollection $albums */ + $albums = $query->get(); + $tree = $albums->toTree(null); + + $flat_tree = $this->flatten($tree); + + // Prepend with the possibility to move to root if parent is not already root. + if ($album->parent !== null) { + array_unshift( + $flat_tree, + [ + 'id' => null, + 'title' => __('lychee.ROOT'), + 'original' => __('lychee.ROOT'), + 'short_title' => __('lychee.ROOT'), + 'thumb' => 'img/no_images.svg', + ] + ); + } + + return $flat_tree; + } + + /** + * Execute transfer of ownership. + * + * @param MoveAlbums $move + */ + public function move(MoveAlbums $move): void + { + $this->areValid(MoveAlbumsRuleSet::rules()); + + // set default for root. + $this->albumID = $this->albumID === '' ? null : $this->albumID; + + /** @var ?Album $album */ + $album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID); + $this->authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]); + + // `findOrFail` returns a union type, but we know that it returns the + // correct collection in this case + /** @var Collection $albums */ + $albums = Album::query()->findOrFail($this->albumIDs); + foreach ($albums as $movedAlbum) { + $this->authorize(AlbumPolicy::CAN_EDIT, $movedAlbum); + } + + $move->do($album, $albums); + + $this->dispatch('toggleAlbumDetails')->to(GalleryAlbum::class); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } + + // UTILITY FUNCTIONS + + /** + * Flatten the tree and create bread crumb paths. + * + * @param mixed $collection + * @param string $prefix + * + * @return array + */ + private function flatten($collection, $prefix = ''): array + { + $flatArray = []; + foreach ($collection as $node) { + $title = $prefix . ($prefix !== '' ? '/' : '') . $node->title; + $short_title = $this->shorten($title); + $flatArray[] = [ + 'id' => $node->id, + 'title' => $title, + 'original' => $node->title, + 'short_title' => $short_title, + 'thumb' => $node->thumb?->thumbUrl ?? 'img/no_images.svg', + ]; + if ($node->children !== null) { + $flatArray = array_merge($flatArray, $this->flatten($node->children, $title)); + unset($node->children); + } + } + + return $flatArray; + } + + /** + * shorten the title to reach a targetted length. + * + * @param string $title to shorten + * + * @return string short version with elipsis + */ + private function shorten(string $title): string + { + $len = strlen($title); + + if ($len < $this->shorten_by) { + return $title; + } + /** @var Collection $title_split */ + $title_split = collect(explode('/', $title)); + $last_elem = $title_split->last(); + $len_last_elem = strlen($last_elem); + + $num_chunks = $title_split->count() - 1; + + $title_split = $title_split->take($num_chunks); + /** @var Collection $title_lengths */ + $title_lengths = $title_split->map(fn ($v) => strlen($v)); + + // find best target length. + + $len_to_reduce = $this->shorten_by - $len_last_elem - 2 * $num_chunks; + $unit_target_len = (int) ceil($len_to_reduce / $num_chunks); + + do { + $unit_target_len--; + $title_lengths = $title_lengths->map(fn ($v) => $v <= $unit_target_len ? $v : $unit_target_len + 1); + $resulting_len = $title_lengths->sum(); + } while ($len_to_reduce < $resulting_len); + + $title_split = $title_split->map(fn ($v) => Str::limit($v, $unit_target_len, '…')); + + return implode('/', $title_split->all()) . '/' . $last_elem; + } +} diff --git a/app/Livewire/Components/Forms/Album/Properties.php b/app/Livewire/Components/Forms/Album/Properties.php new file mode 100644 index 00000000000..764c7878965 --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Properties.php @@ -0,0 +1,114 @@ +albumID = $album->id; + $this->title = $album->title; + $this->description = $album->description ?? ''; + $this->sorting_column = $album->sorting?->column->value ?? ''; + $this->sorting_order = $album->sorting?->order->value ?? ''; + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.properties'); + } + + /** + * Update Username & Password of current user. + */ + public function submit(AlbumFactory $albumFactory): void + { + $rules = [ + RequestAttribute::TITLE_ATTRIBUTE => ['required', new TitleRule()], + ...SetAlbumDescriptionRuleSet::rules(), + ...SetAlbumSortingRuleSet::rules(), + ]; + + if (!$this->areValid($rules)) { + return; + } + + $baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumID, false); + $this->authorize(AlbumPolicy::CAN_EDIT, $baseAlbum); + + $baseAlbum->title = $this->title; + $baseAlbum->description = $this->description; + + // Not super pretty but whatever. + $column = ColumnSortingPhotoType::tryFrom($this->sorting_column); + $order = OrderSortingType::tryFrom($this->sorting_order); + $sortingCriterion = $column === null ? null : new PhotoSortingCriterion($column->toColumnSortingType(), $order); + + $baseAlbum->sorting = $sortingCriterion; + $this->notify(__('lychee.CHANGE_SUCCESS')); + $baseAlbum->save(); + } + + /** + * Return computed property so that it does not stay in memory. + * + * @return array column sorting + */ + final public function getPhotoSortingColumnsProperty(): array + { + // ? Dark magic: The ... will expand the array. + return ['' => '-', ...ColumnSortingPhotoType::toTranslation()]; + } + + /** + * Return computed property so that it does not stay in memory. + * + * @return array order + */ + final public function getSortingOrdersProperty(): array + { + // ? Dark magic: The ... will expand the array. + return ['' => '-', ...OrderSortingType::toTranslation()]; + } +} diff --git a/app/Livewire/Components/Forms/Album/ShareWith.php b/app/Livewire/Components/Forms/Album/ShareWith.php new file mode 100644 index 00000000000..efeb90a0921 --- /dev/null +++ b/app/Livewire/Components/Forms/Album/ShareWith.php @@ -0,0 +1,146 @@ +album = $album; + $this->resetData(); + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.share-with'); + } + + /** + * Return the list of users to share with. + * This is basically: + * - Not the current user. + * - Not the owner of the album (just to be sure) + * - Not the admins (they already have all access) + * - Not users which have already been shared. + * + * @return array + * + * @throws UnauthorizedException + * @throws QueryBuilderException + */ + public function getUserListProperty(): array + { + $alreadySelected = collect($this->perms) + ->map(fn (AccessPermission $perm) => $perm->user_id) + ->all(); + + $id = Auth::id() ?? throw new UnauthorizedException(); + $filtered = User::query() + ->where('id', '<>', $id) + ->where('id', '<>', $this->album->owner_id) + ->where('may_administrate', '<>', true) + ->whereNotIn('id', $alreadySelected) + ->orderBy('username', 'ASC') + ->get() + ->map(fn (User $usr) => ['id' => $usr->id, 'username' => $usr->username]); + + if ($this->search !== null && trim($this->search) !== '') { + return $filtered->filter(function (array $album) { + return Str::contains($album['username'], ltrim($this->search), true); + })->all(); + } + + return $filtered->all(); + } + + public function add(): void + { + $perm = new AccessPermission(); + $perm->user_id = $this->userID; + $perm->base_album_id = $this->album->id; + $perm->grants_full_photo_access = $this->grants_full_photo_access; + $perm->grants_download = $this->grants_download; + $perm->grants_upload = $this->grants_upload; + $perm->grants_edit = $this->grants_edit; + $perm->grants_delete = $this->grants_delete; + $perm->save(); + + $this->resetData(); + } + + public function select(int $userID, string $username): void + { + $this->userID = $userID; + $this->username = $username; + } + + public function clearUsername(): void + { + $this->userID = null; + $this->username = null; + } + + private function resetData(): void + { + $this->perms = $this->album->access_permissions()->with(['user'])->whereNotNull('user_id')->get()->all(); + $this->grants_download = Configs::getValueAsBool('grants_download'); + $this->grants_full_photo_access = Configs::getValueAsBool('grants_full_photo_access'); + $this->grants_upload = false; + $this->grants_edit = false; + $this->grants_delete = false; + $this->search = null; + $this->userID = null; + $this->username = null; + } + + public function delete(int $id): void + { + AccessPermission::query()->where('id', '=', $id)->delete(); + $this->resetData(); + } +} diff --git a/app/Livewire/Components/Forms/Album/ShareWithLine.php b/app/Livewire/Components/Forms/Album/ShareWithLine.php new file mode 100644 index 00000000000..76a7eb9be6d --- /dev/null +++ b/app/Livewire/Components/Forms/Album/ShareWithLine.php @@ -0,0 +1,80 @@ +album_title = $album_title; + $this->perm = $perm; + $this->username = $perm->user->username; + $this->grants_full_photo_access = $perm->grants_full_photo_access; + $this->grants_download = $perm->grants_download; + $this->grants_upload = $perm->grants_upload; + $this->grants_edit = $perm->grants_edit; + $this->grants_delete = $perm->grants_delete; + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.share-with-line'); + } + + /** + * This runs after a wired property is updated. + * + * @param mixed $field + * @param mixed $value + * + * @return void + */ + public function updated($field, $value): void + { + Gate::authorize(AlbumPolicy::IS_OWNER, [AbstractAlbum::class, $this->perm->album]); + + $this->perm->grants_full_photo_access = $this->grants_full_photo_access; + $this->perm->grants_download = $this->grants_download; + $this->perm->grants_upload = $this->grants_upload; + $this->perm->grants_edit = $this->grants_edit; + $this->perm->grants_delete = $this->grants_delete; + $this->perm->save(); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } +} diff --git a/app/Livewire/Components/Forms/Album/Transfer.php b/app/Livewire/Components/Forms/Album/Transfer.php new file mode 100644 index 00000000000..5b3ce642ebb --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Transfer.php @@ -0,0 +1,116 @@ +albumID = $album->id; + $this->title = $album->title; + $this->current_owner = $album->owner_id; + $this->username = $this->getUsersProperty()[0]; + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.transfer'); + } + + /** + * Return a table with the user_id and associated username. + * + * @return array list of usernames + */ + public function getUsersProperty(): array + { + return User::query() + ->select('username') + ->where('id', '<>', $this->current_owner) + ->orderBy('id', 'ASC') + ->pluck('username') + ->all(); + } + + /** + * Execute transfer of ownership. + * + * @param AlbumFactory $albumFactory + * + * @return RedirectResponse|View + */ + public function transfer(AlbumFactory $albumFactory) + { + $this->areValid([ + 'albumID' => ['required', new AlbumIDRule(false)], + 'username' => ['required', new UsernameRule()], + ]); + + $baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumID, false); + + // We use CAN DELETE because it is pretty much the same. Only the owner and admin can transfer ownership + $this->authorize(AlbumPolicy::CAN_DELETE, $baseAlbum); + + $userId = User::query() + ->select(['id']) + ->where('username', '=', $this->username) + ->firstOrFail(['id'])->id; + + $baseAlbum->owner_id = $userId; + $baseAlbum->save(); + + // If this is an Album, we also need to fix the children and photos ownership + if ($baseAlbum instanceof Album) { + $baseAlbum->parent_id = null; + $baseAlbum->save(); + $baseAlbum->fixOwnershipOfChildren(); + } + + // If we are not an administrator, this mean we no longer have access. + if (Auth::user()->may_administrate !== true) { + return redirect()->to(route('livewire_index', ['page' => 'gallery'])); + } + + // Remount the component and re-render. + $this->mount($baseAlbum); + $this->notify('Transfer successful!'); + + return $this->render(); + } +} diff --git a/app/Livewire/Components/Forms/Album/Visibility.php b/app/Livewire/Components/Forms/Album/Visibility.php new file mode 100644 index 00000000000..c34f8d09731 --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Visibility.php @@ -0,0 +1,142 @@ +albumID = $album->id; + $this->is_nsfw = $album->is_nsfw; + + /** @var AccessPermission $perm */ + $perm = $album->public_permissions(); + + $this->is_public = $perm !== null; + if ($this->is_public) { + $this->setPublic($perm); + } + } + + /** + * When we initialize, we also need to update the public attributes of the components. + * + * @param AccessPermission $perm + * + * @return void + */ + private function setPublic(AccessPermission $perm): void + { + $this->grants_full_photo_access = $perm->grants_full_photo_access; + $this->is_link_required = $perm->is_link_required; + $this->grants_download = $perm->grants_download; + $this->is_password_required = $perm->password !== null; + // ! We do NOT load the password as we do not want to expose it. + } + + /** + * When we set to Private, we automatically reset the all the attributes to false. + * The AccessPermission object associated will be destroyed later, as such it is better to reset the data. + * + * @return void + */ + private function setPrivate(): void + { + $this->grants_full_photo_access = false; + $this->is_link_required = false; + $this->is_password_required = false; + $this->grants_download = false; + $this->password = null; + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.visibility'); + } + + /** + * If any attributes are changed, we call this. + * + * @return void + */ + public function updated() + { + $albumFactory = resolve(AlbumFactory::class); + $baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumID, false); + + $this->validate(SetAlbumProtectionPolicyRuleSet::rules()); + + $this->authorize(AlbumPolicy::CAN_EDIT, $baseAlbum); + + if (!$this->is_public) { + $this->setPrivate(); + } + + $albumProtectionPolicy = new AlbumProtectionPolicy( + is_public: $this->is_public, + is_link_required: $this->is_link_required, + is_nsfw: $this->is_nsfw, + grants_full_photo_access: $this->grants_full_photo_access, + grants_download: $this->grants_download, + ); + + // No empty string. + if ($this->password === '') { + $this->password = null; + } + + // If password is required but password is empty this means that we do not want to change current password. + $passwordUpdateRequested = $this->is_password_required && $this->password !== null; + + // Override password if it is no longer required + if (!$this->is_password_required) { + $this->password = null; + $passwordUpdateRequested = true; + } + + $setProtectionPolicy = resolve(SetProtectionPolicy::class); + $setProtectionPolicy->do( + $baseAlbum, + $albumProtectionPolicy, + $passwordUpdateRequested, + $this->password + ); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } +} diff --git a/app/Livewire/Components/Forms/BaseForm.php b/app/Livewire/Components/Forms/BaseForm.php new file mode 100644 index 00000000000..fe056ec6af9 --- /dev/null +++ b/app/Livewire/Components/Forms/BaseForm.php @@ -0,0 +1,117 @@ +getRuleSet())->mapWithKeys(fn ($v, $k) => ['form.' . $k => $v])->all(); + } + + /** + * This defines the attributes names that we are validating. + * They are displayed in the error messages. + * + * @return array + */ + final protected function getValidationAttributes(): array + { + return collect($this->getRuleSet())->mapWithKeys(fn ($v, $k) => ['form.' . $k => $k])->all(); + } + + /** + * Return the rules to be applied on the form. + * + * @return array + */ + abstract protected function getRuleSet(): array; + + /** + * A form has a Submit method. + * + * @return void + */ + abstract public function submit(): void; + + /** + * We load the parameters. + * + * @param array $params set of parameters of the form + * + * @return void + */ + public function mount(array $params = []): void + { + $this->params = $params; + } + + /** + * Call the parametrized rendering. + * + * @return View + */ + public function render(): View + { + /** @var view-string $view */ + $view = 'livewire.forms.' . $this->render; + + return view($view); + } + + /** + * Add an handle to close the modal form from a user-land call. + * + * @return void + */ + public function close(): void + { + $this->closeModal(); + } +} diff --git a/app/Livewire/Components/Forms/Confirms/SaveAll.php b/app/Livewire/Components/Forms/Confirms/SaveAll.php new file mode 100644 index 00000000000..2e3e0a1d464 --- /dev/null +++ b/app/Livewire/Components/Forms/Confirms/SaveAll.php @@ -0,0 +1,42 @@ +closeModal(); + $this->dispatch('saveAll')->to(AllSettings::class); + } + + public function close(): void + { + $this->closeModal(); + } +} diff --git a/app/Livewire/Components/Forms/Photo/Delete.php b/app/Livewire/Components/Forms/Photo/Delete.php new file mode 100644 index 00000000000..673108e0680 --- /dev/null +++ b/app/Livewire/Components/Forms/Photo/Delete.php @@ -0,0 +1,87 @@ + */ + #[Locked] + public array $photoIDs; + + #[Locked] + public string $albumId; + + #[Locked] + public string $title; + + /** + * This is the equivalent of the constructor for Livewire Components. + * + * @param array $params to delete + * + * @return void + */ + public function mount(array $params = []): void + { + /** @var string $id */ + $id = $params['photoId']; + $this->photoIDs = [$id]; + $this->title = Photo::query()->findOrFail($id)->title; + $this->albumId = $params['albumId']; + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.photo.delete'); + } + + /** + * Execute deletion. + * + * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + */ + public function submit(DeleteAction $delete): \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + { + $this->validate(DeletePhotosRuleSet::rules()); + Gate::check(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); + + $fileDeleter = $delete->do($this->photoIDs); + App::terminating(fn () => $fileDeleter->do()); + + return redirect()->to(route('livewire-gallery-album', ['albumId' => $this->albumId])); + } + + /** + * Add an handle to close the modal form from a user-land call. + * + * @return void + */ + public function close(): void + { + $this->closeModal(); + } +} diff --git a/app/Livewire/Components/Forms/Profile/GetApiToken.php b/app/Livewire/Components/Forms/Profile/GetApiToken.php new file mode 100644 index 00000000000..fb456efe531 --- /dev/null +++ b/app/Livewire/Components/Forms/Profile/GetApiToken.php @@ -0,0 +1,106 @@ +token = __('lychee.TOKEN_NOT_AVAILABLE'); + $this->isDisabled = true; + + if ($user->token === null) { + $this->token = __('lychee.DISABLED_TOKEN_STATUS_MSG'); + } + } + + /** + * Renders the modal content. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.profile.get-api-token'); + } + + /** + * Add an handle to close the modal form from a user-land call. + * + * @return void + */ + public function close(): void + { + $this->closeModal(); + } + + /** + * Method call from front-end to reset the Token. + * We generate a new one on the fly and display it. + * + * @param TokenReset $tokenReset + * + * @return void + */ + public function resetToken(TokenReset $tokenReset): void + { + /** + * Authorize the request. + */ + $this->authorize(UserPolicy::CAN_EDIT, [User::class]); + + $this->token = $tokenReset->do(); + $this->isDisabled = false; + } + + /** + * Method call from front-end to disable the token. + * We simply erase the current one. + * + * @param TokenDisable $tokenDisable + * + * @return void + */ + public function disableToken(TokenDisable $tokenDisable): void + { + /** + * Authorize the request. + */ + $this->authorize(UserPolicy::CAN_EDIT, [User::class]); + + $tokenDisable->do(); + $this->token = __('lychee.DISABLED_TOKEN_STATUS_MSG'); + $this->isDisabled = true; + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php new file mode 100644 index 00000000000..9550cfce0f5 --- /dev/null +++ b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php @@ -0,0 +1,78 @@ +credential = $credential; + $this->alias = $credential->alias ?? Str::substr($credential->id, 0, 30); + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.profile.manage-second-factor'); + } + + /** + * This runs after a wired property is updated. + * + * @param mixed $field + * @param mixed $value + * + * @return void + */ + public function updated($field, $value): void + { + // TODO: ADD VALIDATION + $this->credential->alias = $this->alias; + $this->credential->save(); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } + + /** + * Deletes a user. + * + * The albums and photos owned by the user are re-assigned to the + * admin user. + * + * @return void + */ + public function delete(): void + { + $this->credential->delete(); + $this->dispatch('loadCredentials')->to(SecondFactor::class); + } +} diff --git a/app/Livewire/Components/Forms/Profile/SetEmail.php b/app/Livewire/Components/Forms/Profile/SetEmail.php new file mode 100644 index 00000000000..d7f75359fcb --- /dev/null +++ b/app/Livewire/Components/Forms/Profile/SetEmail.php @@ -0,0 +1,60 @@ +description = __('lychee.ENTER_EMAIL'); + $this->action = __('lychee.SAVE'); + } + + /** + * Render the component with the email form. + * + * @return View + * + * @throws UnauthenticatedException + */ + public function render(): View + { + $user = Auth::user() ?? throw new UnauthenticatedException(); + $this->value = $user->email; + + return view('livewire.forms.settings.input'); + } + + /** + * Save the email address entered. + * + * @return void + * + * @throws UnauthenticatedException + */ + public function save(): void + { + // TODO : VALIDATE + /** @var User $user */ + $user = Auth::user() ?? throw new UnauthenticatedException(); + $user->email = $this->value; + $user->save(); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Profile/SetLogin.php b/app/Livewire/Components/Forms/Profile/SetLogin.php new file mode 100644 index 00000000000..d9bc70ef89e --- /dev/null +++ b/app/Livewire/Components/Forms/Profile/SetLogin.php @@ -0,0 +1,72 @@ +validate(ChangeLoginRuleSet::rules()); + $this->validate(['oldPassword' => new CurrentPasswordRule()]); + + $this->authorize(UserPolicy::CAN_EDIT, [User::class]); + + $currentUser = $updateLogin->do( + $this->username, + $this->password, + $this->oldPassword, + request()->ip() + ); + + // Update the session with the new credentials of the user. + // Otherwise, the session is out-of-sync and falsely assumes the user + // to be unauthenticated upon the next request. + Auth::login($currentUser); + } + + /** + * Open a login modal box. + * + * @return void + */ + public function openApiTokenModal(): void + { + $this->openClosableModal('forms.profile.get-api-token', __('lychee.CLOSE')); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php new file mode 100644 index 00000000000..905d07afcd9 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php @@ -0,0 +1,95 @@ +value1 = $this->config1->value; + $this->value2 = $this->config2->value; + + return view('livewire.forms.settings.double-drop-down'); + } + + /** + * This runs before a wired property is updated. + * + * @param mixed $field + * @param mixed $value + * + * @return void + * + * @throws InvalidCastException + * @throws JsonEncodingException + * @throws \RuntimeException + */ + public function updated($field, $value) + { + Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + $error_msg = $this->config1->sanity($this->value1); + if ($error_msg !== '') { + $this->notify($error_msg, NotificationType::ERROR); + + return; + } + $error_msg = $this->config2->sanity($this->value2); + if ($error_msg !== '') { + $this->notify($error_msg, NotificationType::ERROR); + + return; + } + + $this->config1->value = $this->value1; + $this->config1->save(); + $this->config2->value = $this->value2; + $this->config2->save(); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } + + /** + * Defines accessor for the drop down options1. + * + * @return array + */ + abstract public function getOptions1Property(): array; + + /** + * Defines accessor for the drop down options2. + * + * @return array + */ + abstract public function getOptions2Property(): array; +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php new file mode 100644 index 00000000000..8aa931595ba --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php @@ -0,0 +1,67 @@ +value = $this->config->value; + + return view('livewire.forms.settings.drop-down'); + } + + /** + * This runs before a wired property is updated. + * + * @param mixed $field + * @param mixed $value + * + * @return void + */ + public function updating($field, $value): void + { + Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + $error_msg = $this->config->sanity($value); + if ($error_msg !== '') { + $this->notify($error_msg, NotificationType::ERROR); + + return; + } + + $this->config->value = $value; + $this->config->save(); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } + + /** + * Defines accessor for the drop down options1. + * + * @return array + */ + abstract public function getOptionsProperty(): array; +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php b/app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php new file mode 100644 index 00000000000..9e950dd0e78 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php @@ -0,0 +1,83 @@ +description = __('lychee.' . $description); + $this->footer = $footer !== '' ? __('lychee.' . $footer) : ''; + $this->config = Configs::where('key', '=', $name)->firstOrFail(); + } + + /** + * Render the toggle element. + * + * @return View + */ + public function render(): View + { + $this->flag = $this->config->value === '1'; + + return view('livewire.forms.settings.toggle'); + } + + /** + * This runs before a wired property is updated. + * + * @param mixed $field + * @param mixed $value + * + * @return void + * + * @throws InvalidCastException + * @throws JsonEncodingException + * @throws \RuntimeException + */ + public function updating($field, $value) + { + Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + + $error_msg = $this->config->sanity($value === true ? '1' : '0'); + if ($error_msg !== '') { + $this->notify($error_msg, NotificationType::ERROR); + + return; + } + + $this->config->value = $value === true ? '1' : '0'; + $this->config->save(); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/Base/StringSetting.php b/app/Livewire/Components/Forms/Settings/Base/StringSetting.php new file mode 100644 index 00000000000..dfc9be25eef --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/Base/StringSetting.php @@ -0,0 +1,75 @@ +description = __('lychee.' . $description); + $this->action = __('lychee.' . $action); + $this->placeholder = __('lychee.' . $placeholder); + $this->config = Configs::where('key', '=', $name)->firstOrFail(); + } + + /** + * Renders the input form. + * + * @return View + */ + public function render(): View + { + $this->value = $this->config->value; + + return view('livewire.forms.settings.input'); + } + + /** + * Validation call to persist the data (as opposed to drop down menu and toggle which are instant). + * + * @return void + */ + public function save(): void + { + Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + $error_msg = $this->config->sanity($this->value); + if ($error_msg !== '') { + $this->notify($error_msg, NotificationType::ERROR); + $this->value = $this->config->value; + + return; + } + + $this->config->value = $this->value; + $this->config->save(); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetAlbumDecorationOrientationSetting.php b/app/Livewire/Components/Forms/Settings/SetAlbumDecorationOrientationSetting.php new file mode 100644 index 00000000000..24c5da5cb48 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetAlbumDecorationOrientationSetting.php @@ -0,0 +1,38 @@ + __('lychee.ALBUM_DECORATION_ORIENTATION_ROW'), + 'row_reverse' => __('lychee.ALBUM_DECORATION_ORIENTATION_ROW_REVERSE'), + 'column' => __('lychee.ALBUM_DECORATION_ORIENTATION_COLUMN'), + 'column_reverse' => __('lychee.ALBUM_DECORATION_ORIENTATION_COLUMN_REVERSE'), + ]; + } + + /** + * Set the required strings. + * + * @return void + */ + public function mount(): void + { + $this->description = __('lychee.ALBUM_DECORATION_ORIENTATION'); + $this->config = Configs::where('key', '=', 'album_decoration_orientation')->firstOrFail(); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetAlbumDecorationSetting.php b/app/Livewire/Components/Forms/Settings/SetAlbumDecorationSetting.php new file mode 100644 index 00000000000..33bbd9e9009 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetAlbumDecorationSetting.php @@ -0,0 +1,39 @@ + __('lychee.ALBUM_DECORATION_NONE'), + 'layers' => __('lychee.ALBUM_DECORATION_ORIGINAL'), + 'album' => __('lychee.ALBUM_DECORATION_ALBUM'), + 'photo' => __('lychee.ALBUM_DECORATION_PHOTO'), + 'all' => __('lychee.ALBUM_DECORATION_ALL'), + ]; + } + + /** + * Set up the translations. + * + * @return void + */ + public function mount() + { + $this->description = __('lychee.ALBUM_DECORATION'); + $this->config = Configs::where('key', '=', 'album_decoration')->firstOrFail(); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetAlbumSortingSetting.php b/app/Livewire/Components/Forms/Settings/SetAlbumSortingSetting.php new file mode 100644 index 00000000000..d337fa1f24b --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetAlbumSortingSetting.php @@ -0,0 +1,65 @@ +begin = $matches[1]; + $this->middle = $matches[2]; + $this->end = $matches[3]; + + $this->config1 = Configs::where('key', '=', 'sorting_albums_col')->firstOrFail(); + $this->config2 = Configs::where('key', '=', 'sorting_albums_order')->firstOrFail(); + } + + /** + * Give the options on the column. + * + * @return array + */ + public function getOptions1Property(): array + { + return [ + ColumnSortingAlbumType::CREATED_AT->value => __('lychee.SORT_ALBUM_SELECT_1'), + ColumnSortingAlbumType::TITLE->value => __('lychee.SORT_ALBUM_SELECT_2'), + ColumnSortingAlbumType::DESCRIPTION->value => __('lychee.SORT_ALBUM_SELECT_3'), + ColumnSortingAlbumType::MAX_TAKEN_AT->value => __('lychee.SORT_ALBUM_SELECT_5'), + ColumnSortingAlbumType::MIN_TAKEN_AT->value => __('lychee.SORT_ALBUM_SELECT_6'), + ]; + } + + /** + * Give the options on the ordering. + * + * @return array + */ + public function getOptions2Property(): array + { + return [ + OrderSortingType::ASC->value => __('lychee.SORT_ASCENDING'), + OrderSortingType::DESC->value => __('lychee.SORT_DESCENDING'), + ]; + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetLangSetting.php b/app/Livewire/Components/Forms/Settings/SetLangSetting.php new file mode 100644 index 00000000000..5f8a20e5124 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetLangSetting.php @@ -0,0 +1,35 @@ +description = __('lychee.LANG_TEXT'); + // We do not use Lang::get_code() because we want to be able to modify it. + // We are interested in the setting itself. + $this->config = Configs::where('key', '=', 'lang')->firstOrFail(); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetLayoutSetting.php b/app/Livewire/Components/Forms/Settings/SetLayoutSetting.php new file mode 100644 index 00000000000..c46a7408354 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetLayoutSetting.php @@ -0,0 +1,71 @@ + __('lychee.LAYOUT_SQUARES'), // 0 - \App\Enum\Livewire\AlbumMode::FLKR + 'justified' => __('lychee.LAYOUT_JUSTIFIED'), // 1 - \App\Enum\Livewire\AlbumMode::SQUARE + 'masonry' => __('lychee.LAYOUT_MASONRY'), // 2 - \App\Enum\Livewire\AlbumMode::MASONRY + 'grid' => __('lychee.LAYOUT_GRID'), // 3 - \App\Enum\Livewire\AlbumMode::GRID + ]; + } + + /** + * Mount the texts. + * + * @return void + */ + public function mount() + { + $this->description = __('lychee.LAYOUT_TYPE'); + $this->config = Configs::where('key', '=', 'layout')->firstOrFail(); + } + + public function render(): View + { + $keys = array_keys($this->getOptionsProperty()); + $this->value = $keys[intval($this->config->value)]; + + return view('livewire.forms.settings.drop-down'); + } + + public function updating($field, $value): void + { + Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + + // Fetch the keys and reverse index. + $reverse = array_flip(array_keys($this->getOptionsProperty())); + $value = strval($reverse[$value]); + + $error_msg = $this->config->sanity($value); + if ($error_msg !== '') { + $this->notify($error_msg, NotificationType::ERROR); + + return; + } + + $this->config->value = $value; + $this->config->save(); + $this->notify(__('lychee.CHANGE_SUCCESS')); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetLicenseDefaultSetting.php b/app/Livewire/Components/Forms/Settings/SetLicenseDefaultSetting.php new file mode 100644 index 00000000000..48ac401f895 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetLicenseDefaultSetting.php @@ -0,0 +1,67 @@ + 'None', + 'reserved' => 'All Rights Reserved', + 'CC0' => 'CC0 - Public Domain', + 'CC-BY-1.0' => 'CC Attribution 1.0', + 'CC-BY-2.0' => 'CC Attribution 2.0', + 'CC-BY-2.5' => 'CC Attribution 2.5', + 'CC-BY-3.0' => 'CC Attribution 3.0', + 'CC-BY-4.0' => 'CC Attribution 4.0', + 'CC-BY-ND-1.0' => 'CC Attribution-NoDerivatives 1.0', + 'CC-BY-ND-2.0' => 'CC Attribution-NoDerivatives 2.0', + 'CC-BY-ND-2.5' => 'CC Attribution-NoDerivatives 2.5', + 'CC-BY-ND-3.0' => 'CC Attribution-NoDerivatives 3.0', + 'CC-BY-ND-4.0' => 'CC Attribution-NoDerivatives 4.0', + 'CC-BY-SA-1.0' => 'CC Attribution-ShareAlike 1.0', + 'CC-BY-SA-2.0' => 'CC Attribution-ShareAlike 2.0', + 'CC-BY-SA-2.5' => 'CC Attribution-ShareAlike 2.5', + 'CC-BY-SA-3.0' => 'CC Attribution-ShareAlike 3.0', + 'CC-BY-SA-4.0' => 'CC Attribution-ShareAlike 4.0', + 'CC-BY-NC-1.0' => 'CC Attribution-NonCommercial 1.0', + 'CC-BY-NC-2.0' => 'CC Attribution-NonCommercial 2.0', + 'CC-BY-NC-2.5' => 'CC Attribution-NonCommercial 2.5', + 'CC-BY-NC-3.0' => 'CC Attribution-NonCommercial 3.0', + 'CC-BY-NC-4.0' => 'CC Attribution-NonCommercial 4.0', + 'CC-BY-NC-ND-1.0' => 'CC Attribution-NonCommercial-NoDerivatives 1.0', + 'CC-BY-NC-ND-2.0' => 'CC Attribution-NonCommercial-NoDerivatives 2.0', + 'CC-BY-NC-ND-2.5' => 'CC Attribution-NonCommercial-NoDerivatives 2.5', + 'CC-BY-NC-ND-3.0' => 'CC Attribution-NonCommercial-NoDerivatives 3.0', + 'CC-BY-NC-ND-4.0' => 'CC Attribution-NonCommercial-NoDerivatives 4.0', + 'CC-BY-NC-SA-1.0' => 'CC Attribution-NonCommercial-ShareAlike 1.0', + 'CC-BY-NC-SA-2.0' => 'CC Attribution-NonCommercial-ShareAlike 2.0', + 'CC-BY-NC-SA-2.5' => 'CC Attribution-NonCommercial-ShareAlike 2.5', + 'CC-BY-NC-SA-3.0' => 'CC Attribution-NonCommercial-ShareAlike 3.0', + 'CC-BY-NC-SA-4.0' => 'CC Attribution-NonCommercial-ShareAlike 4.0', + ]; + } + + /** + * Set up the drop down menu. + * + * @return void + */ + public function mount(): void + { + $this->description = __('lychee.DEFAULT_LICENSE'); + $this->config = Configs::where('key', '=', 'default_license')->firstOrFail(); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetMapProviderSetting.php b/app/Livewire/Components/Forms/Settings/SetMapProviderSetting.php new file mode 100644 index 00000000000..238cd551e54 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetMapProviderSetting.php @@ -0,0 +1,39 @@ + __('lychee.MAP_PROVIDER_WIKIMEDIA'), + 'OpenStreetMap.org' => __('lychee.MAP_PROVIDER_OSM_ORG'), + 'OpenStreetMap.de' => __('lychee.MAP_PROVIDER_OSM_DE'), + 'OpenStreetMap.fr' => __('lychee.MAP_PROVIDER_OSM_FR'), + 'RRZE' => __('lychee.MAP_PROVIDER_RRZE'), + ]; + } + + /** + * Mount the config. + * + * @return void + */ + public function mount() + { + $this->description = __('lychee.MAP_PROVIDER'); + $this->config = Configs::where('key', '=', 'map_provider')->firstOrFail(); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetPhotoOverlaySetting.php b/app/Livewire/Components/Forms/Settings/SetPhotoOverlaySetting.php new file mode 100644 index 00000000000..82b1327fcf0 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetPhotoOverlaySetting.php @@ -0,0 +1,38 @@ + __('lychee.OVERLAY_EXIF'), + 'desc' => __('lychee.OVERLAY_DESCRIPTION'), + 'date' => __('lychee.OVERLAY_DATE'), + 'none' => __('lychee.OVERLAY_NONE'), + ]; + } + + /** + * Set up the drop down menu. + * + * @return void + */ + public function mount(): void + { + $this->description = __('lychee.OVERLAY_TYPE'); + $this->config = Configs::where('key', '=', 'image_overlay_type')->firstOrFail(); + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Forms/Settings/SetPhotoSortingSetting.php b/app/Livewire/Components/Forms/Settings/SetPhotoSortingSetting.php new file mode 100644 index 00000000000..0c256cfce79 --- /dev/null +++ b/app/Livewire/Components/Forms/Settings/SetPhotoSortingSetting.php @@ -0,0 +1,67 @@ +begin = $matches[1]; + $this->middle = $matches[2]; + $this->end = $matches[3]; + + $this->config1 = Configs::where('key', '=', 'sorting_photos_col')->firstOrFail(); + $this->config2 = Configs::where('key', '=', 'sorting_photos_order')->firstOrFail(); + } + + /** + * Give the columns options. + * + * @return array + */ + public function getOptions1Property(): array + { + return [ + ColumnSortingPhotoType::CREATED_AT->value => __('lychee.SORT_PHOTO_SELECT_1'), + ColumnSortingPhotoType::TAKEN_AT->value => __('lychee.SORT_PHOTO_SELECT_2'), + ColumnSortingPhotoType::TITLE->value => __('lychee.SORT_PHOTO_SELECT_3'), + ColumnSortingPhotoType::DESCRIPTION->value => __('lychee.SORT_PHOTO_SELECT_4'), + ColumnSortingPhotoType::IS_PUBLIC->value => __('lychee.SORT_PHOTO_SELECT_5'), + ColumnSortingPhotoType::IS_STARRED->value => __('lychee.SORT_PHOTO_SELECT_6'), + ColumnSortingPhotoType::TYPE->value => __('lychee.SORT_PHOTO_SELECT_7'), + ]; + } + + /** + * Ordering ascending or descending. + * + * @return array + */ + public function getOptions2Property(): array + { + return [ + OrderSortingType::ASC->value => __('lychee.SORT_ASCENDING'), + OrderSortingType::DESC->value => __('lychee.SORT_DESCENDING'), + ]; + } +} \ No newline at end of file diff --git a/app/Livewire/Components/Menus/AlbumAdd.php b/app/Livewire/Components/Menus/AlbumAdd.php new file mode 100644 index 00000000000..ea275ee3412 --- /dev/null +++ b/app/Livewire/Components/Menus/AlbumAdd.php @@ -0,0 +1,68 @@ +closeContextMenu(); + $this->openModal('forms.album.create', $this->params); + } + + /** + * Open Create Tag Album modal. + * + * @return void + */ + public function openTagAlbumCreateModal(): void + { + $this->closeContextMenu(); + $this->openModal('forms.album.create-tag', $this->params); + } + + public function openImportFromServerModal(): void + { + $this->closeContextMenu(); + $this->openModal('forms.add.import-from-server', $this->params); + } + + public function openImportFromUrlModal(): void + { + $this->closeContextMenu(); + $this->openModal('forms.add.import-from-url', $this->params); + } + + public function openUploadModal(): void + { + $this->closeContextMenu(); + $this->openModal('forms.add.MultipleFileUploader', $this->params); + } +} diff --git a/app/Livewire/Components/Menus/LeftMenu.php b/app/Livewire/Components/Menus/LeftMenu.php new file mode 100644 index 00000000000..c35d6b6ae96 --- /dev/null +++ b/app/Livewire/Components/Menus/LeftMenu.php @@ -0,0 +1,62 @@ +redirect(route('livewire-gallery'), navigate: false); + } + + /** + * Render the Left menu. + * + * @return View + */ + #[On('reloadPage')] + public function render(): View + { + return view('livewire.components.left-menu'); + } + + /** + * Open a about modal box. + * TODO Consider moving this directly to Blade. + * + * @return void + */ + public function openAboutModal(): void + { + $this->openClosableModal('modals.about', __('lychee.CLOSE')); + } +} diff --git a/app/Livewire/Components/Modals/About.php b/app/Livewire/Components/Modals/About.php new file mode 100644 index 00000000000..1dfb1af400c --- /dev/null +++ b/app/Livewire/Components/Modals/About.php @@ -0,0 +1,54 @@ +version = resolve(InstalledVersion::class)->getVersion()->toString(); + } + + $fileVersion = resolve(FileVersion::class); + $gitHubVersion = resolve(GitHubVersion::class); + if (Configs::getValueAsBool('check_for_updates')) { + $fileVersion->hydrate(); + $gitHubVersion->hydrate(); + } + $this->is_new_release_available = !$fileVersion->isUpToDate(); + $this->is_git_update_available = !$gitHubVersion->isUpToDate(); + } + + /** + * Renders the About component. + * + * @return View + */ + public function render(): View + { + return view('livewire.modals.about'); + } +} diff --git a/app/Livewire/Components/Modals/Login.php b/app/Livewire/Components/Modals/Login.php new file mode 100644 index 00000000000..1dfd1d2812e --- /dev/null +++ b/app/Livewire/Components/Modals/Login.php @@ -0,0 +1,92 @@ +version = resolve(InstalledVersion::class)->getVersion()->toString(); + } + + $fileVersion = resolve(FileVersion::class); + $gitHubVersion = resolve(GitHubVersion::class); + if (Configs::getValueAsBool('check_for_updates')) { + $fileVersion->hydrate(); + $gitHubVersion->hydrate(); + } + $this->is_new_release_available = !$fileVersion->isUpToDate(); + $this->is_git_update_available = !$gitHubVersion->isUpToDate(); + } + + /** + * Hook the submit button. + * + * @return void + * + * @throws \Throwable + * @throws ValidationException + * @throws BindingResolutionException + * @throws \InvalidArgumentException + * @throws QueryBuilderException + */ + public function submit(): void + { + // Empty error bag + $this->resetErrorBag(); + + // Call Livewire validation on the from + $data = $this->validate(LoginRuleSet::rules()); + + // apply login as admin and trigger a reload + if (Auth::attempt(['username' => $data['username'], 'password' => $data['password']])) { + Log::notice(__METHOD__ . ':' . __LINE__ . ' User (' . $data['username'] . ') has logged in from ' . request()->ip()); + $this->dispatch('login-close'); + $this->dispatch('reloadPage'); + + return; + } + + // Wrong login: stay on the modal and update the rendering. + $this->addError('wrongLogin', 'Wrong login or password.'); + Log::error(__METHOD__ . ':' . __LINE__ . ' User (' . $data['username'] . ') has tried to log in from ' . request()->ip()); + } +} diff --git a/app/Livewire/Components/Modules/Diagnostics/AbstractPreSection.php b/app/Livewire/Components/Modules/Diagnostics/AbstractPreSection.php new file mode 100644 index 00000000000..3fd2b4e9221 --- /dev/null +++ b/app/Livewire/Components/Modules/Diagnostics/AbstractPreSection.php @@ -0,0 +1,32 @@ +get(); + } +} diff --git a/app/Livewire/Components/Modules/Diagnostics/Errors.php b/app/Livewire/Components/Modules/Diagnostics/Errors.php new file mode 100644 index 00000000000..f7e4e3df70c --- /dev/null +++ b/app/Livewire/Components/Modules/Diagnostics/Errors.php @@ -0,0 +1,61 @@ + + Diagnostics + ----------- + ' . __('lychee.LOADING') . ' ... +

+'; + } + + /** + * Computable property to access the errors. + * If we are not ready to load, we return an empty array. + * + * @return array + */ + public function getDataProperty(): array + { + return collect(resolve(DiagnosticsErrors::class)->get())->map(function ($line) { + $arr = ['color' => '', 'type' => '', 'line' => $line]; + + if (Str::startsWith($line, 'Warning: ')) { + $arr['color'] = 'text-yellow-500'; + $arr['type'] = 'Warning:'; + $arr['line'] = Str::substr($line, 9); + } + + if (Str::startsWith($line, 'Error: ')) { + $arr['color'] = 'text-red-500'; + $arr['type'] = 'Error:'; + $arr['line'] = Str::substr($line, 7); + } + + return $arr; + })->all(); + } + + /** + * Rendering of the front-end. + * + * @return View + */ + final public function render(): View + { + return view('livewire.modules.diagnostics.pre-colored'); + } +} diff --git a/app/Livewire/Components/Modules/Diagnostics/Infos.php b/app/Livewire/Components/Modules/Diagnostics/Infos.php new file mode 100644 index 00000000000..e2c9f8290e0 --- /dev/null +++ b/app/Livewire/Components/Modules/Diagnostics/Infos.php @@ -0,0 +1,15 @@ +get(); + } +} diff --git a/app/Livewire/Components/Modules/Diagnostics/Space.php b/app/Livewire/Components/Modules/Diagnostics/Space.php new file mode 100644 index 00000000000..edcef3603d6 --- /dev/null +++ b/app/Livewire/Components/Modules/Diagnostics/Space.php @@ -0,0 +1,34 @@ +space = $space->get(); + } +} diff --git a/app/Livewire/Components/Modules/Profile/SecondFactor.php b/app/Livewire/Components/Modules/Profile/SecondFactor.php new file mode 100644 index 00000000000..124b028e74b --- /dev/null +++ b/app/Livewire/Components/Modules/Profile/SecondFactor.php @@ -0,0 +1,71 @@ +loadCredentials(); + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.modules.profile.second-factor'); + } + + /** + * Fetch the credentials of the current user. + * + * @return void + * + * @throws \RuntimeException + * @throws UnauthenticatedException + */ + public function loadCredentials(): void + { + /** @var \App\Models\User $user */ + $user = Auth::user() ?? throw new UnauthenticatedException(); + + $this->credentials = $user->webAuthnCredentials; + } + + /** + * Create a new U2F credential. + * + * @return void + */ + public function create(): void + { + // TODO: create token + // reset attributes and reload user list (triggers refresh) + $this->loadCredentials(); + } +} diff --git a/app/Livewire/Components/Modules/Sidebar/Photo.php b/app/Livewire/Components/Modules/Sidebar/Photo.php new file mode 100644 index 00000000000..22ce4a6abea --- /dev/null +++ b/app/Livewire/Components/Modules/Sidebar/Photo.php @@ -0,0 +1,192 @@ + */ + public array $tags; + + public bool $is_public; + public bool $is_video; + public bool $has_password; + + public string $owner_name = ''; + public string $license; + + public string $duration = ''; + public string $fps = ''; + + public ?string $model; + public ?string $make; + public string $lens; + + public bool $has_exif = false; + public string $iso; + public string $focal; + public string $aperture; + public string $shutter; + public ?string $taken_at; + + public bool $has_location = false; + public string $latitude; + public string $longitude; + public string $altitude; + public ?string $location; + public ?float $img_direction; + + /** + * Given a photo model extract all the information. + * ! It is possible that we may need to extract those in a similar fashion as with Album. + * + * @param PhotoModel $photo + * + * @return void + * + * @throws IllegalOrderOfOperationException + */ + public function mount(PhotoModel $photo): void + { + $date_format_uploaded = Configs::getValueAsString('date_format_sidebar_uploaded'); + $date_format_taken_at = Configs::getValueAsString('date_format_sidebar_taken_at'); + + $this->title = $photo->title; + $this->created_at = $photo->created_at->format($date_format_uploaded); + $this->description = $photo->description ?? ''; + + $this->type = $photo->type; + $original = $photo->size_variants->getOriginal(); + $this->filesize = Helpers::getSymbolByQuantity($original->filesize); + $this->resolution = $original->width . ' x ' . $original->height; + + $this->is_video = $photo->isVideo(); + // $this->is_public = $photo->is_public; + $this->license = $photo->license; + + $this->taken_at = $photo->taken_at?->format($date_format_taken_at); + $this->make = $photo->make; + $this->model = $photo->model; + $this->tags = $photo->tags; + + $this->has_exif = $this->genExifHash($photo) !== ''; + if ($this->has_exif) { + $this->lens = $photo->lens ?? ''; + $this->shutter = $photo->shutter ?? ''; + $this->aperture = str_replace('f/', '', $photo->aperture); + $this->focal = $photo->focal ?? ''; + $this->iso = $photo->iso ?? ''; + } + + if ($this->is_video) { + $this->duration = Helpers::secondsToHMS(intval($photo->aperture)); + $this->fps = $photo->focal ?? ''; + } + + $this->has_location = $this->has_location($photo); + if ($this->has_location) { + $this->latitude = $this->decimalToDegreeMinutesSeconds($photo->latitude, true); + $this->longitude = $this->decimalToDegreeMinutesSeconds($photo->longitude, false); + $this->altitude = round($photo->altitude, 1) . 'm'; + $this->location = $photo->location; + $this->img_direction = $photo->img_direction; + } + } + + /** + * Render the view. + * + * @return View + * + * @throws BindingResolutionException + */ + public function render(): View + { + return view('livewire.modules.sidebar.photo'); + } + + /** + * Converts a decimal degree into integer degree, minutes and seconds. + * + * TODO: Consider to make this method part of `lychee.locale`. + * + * @param float $decimal + * @param bool $type - indicates if the passed decimal indicates a + * latitude (`true`) or a longitude (`false`) + * + * @returns string + */ + private function decimalToDegreeMinutesSeconds(float $decimal, bool $type): string + { + $d = abs($decimal); + + // absolute value of decimal must be smaller than 180; + if ($d > 180) { + return ''; + } + + // set direction; north assumed + if ($type && $decimal < 0) { + $direction = 'S'; + } elseif (!$type && $decimal < 0) { + $direction = 'W'; + } elseif (!$type) { + $direction = 'E'; + } else { + $direction = 'N'; + } + + // get degrees + $degrees = floor($d); + + // get seconds + $seconds = ($d - $degrees) * 3600; + + // get minutes + $minutes = floor($seconds / 60); + + // reset seconds + $seconds = floor($seconds - $minutes * 60); + + return $degrees . '° ' . $minutes . "' " . $seconds . '" ' . $direction; + } + + private function genExifHash(PhotoModel $photo): string + { + $exifHash = $photo->make; + $exifHash .= $photo->model; + $exifHash .= $photo->shutter; + if (!$photo->isVideo()) { + $exifHash .= $photo->aperture; + $exifHash .= $photo->focal; + } + $exifHash .= $photo->iso; + + return $exifHash; + } + + private function has_location(PhotoModel $photo): bool + { + return $photo->longitude !== null && $photo->latitude !== null && $photo->altitude !== null; + } +} diff --git a/app/Livewire/Components/Modules/Users/UserLine.php b/app/Livewire/Components/Modules/Users/UserLine.php new file mode 100644 index 00000000000..13ccef395bc --- /dev/null +++ b/app/Livewire/Components/Modules/Users/UserLine.php @@ -0,0 +1,100 @@ +user = $user; + $this->username = $user->username; + $this->may_edit_own_settings = $user->may_edit_own_settings; + $this->may_upload = $user->may_upload; + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.modules.users.user-line'); + } + + /** + * computed property to check if the state is dirty. + * TODO: See if the dirty state of Livewire is usable instead. + * + * @return bool + */ + public function getHasChangedProperty(): bool + { + return $this->user->username !== $this->username || + $this->user->may_upload !== $this->may_upload || + $this->user->may_edit_own_settings !== $this->may_edit_own_settings || + $this->password !== ''; + } + + /** + * Deletes a user. + * + * The albums and photos owned by the user are re-assigned to the + * admin user. + * + * @return void + */ + public function delete(): void + { + if ($this->user->id === Auth::id()) { + throw new UnauthorizedException('You are not allowed to delete yourself'); + } + $this->user->delete(); + $this->dispatch('loadUsers')->to(Users::class); + } + + /** + * Save modification done to a user. + * Note that an admin can change the password of a user at will. + * + * @param Save $save + * + * @return void + */ + public function save(Save $save): void + { + $save->do( + $this->user, + $this->username, + $this->password, + $this->may_upload, + $this->may_edit_own_settings + ); + } +} diff --git a/app/Livewire/Components/Pages/AllSettings.php b/app/Livewire/Components/Pages/AllSettings.php new file mode 100644 index 00000000000..4b3755b2e29 --- /dev/null +++ b/app/Livewire/Components/Pages/AllSettings.php @@ -0,0 +1,72 @@ +form->setConfigs(Configs::orderBy('cat', 'asc')->get()); + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.pages.all-settings'); + } + + /** + * Open Saving confirmation modal. + * + * @return void + */ + public function openConfirmSave(): void + { + $this->openModal('forms.confirms.save-all'); + } + + /** + * Save everything. + * + * @return void + */ + #[On('saveAll')] + public function saveAll(): void + { + Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]); + + $this->form->save(); + } + + public function back(): mixed + { + return $this->redirect(route('settings')); + } +} diff --git a/app/Livewire/Components/Pages/Diagnostics.php b/app/Livewire/Components/Pages/Diagnostics.php new file mode 100644 index 00000000000..196e43ec2bf --- /dev/null +++ b/app/Livewire/Components/Pages/Diagnostics.php @@ -0,0 +1,31 @@ +redirect(route('livewire-gallery')); + } + + #[On('reloadPage')] + public function reloadPage(): void + { + $this->render(); + } +} diff --git a/app/Livewire/Components/Pages/Gallery/Album.php b/app/Livewire/Components/Pages/Gallery/Album.php new file mode 100644 index 00000000000..b4a35f058d9 --- /dev/null +++ b/app/Livewire/Components/Pages/Gallery/Album.php @@ -0,0 +1,190 @@ +albumFactory = resolve(AlbumFactory::class); + $this->nsfwAlbumsVisible = Configs::getValueAsBool('nsfw_visible'); + } + + public function mount(string $albumId): void + { + $this->flags = new AlbumFlags(); + $this->albumId = $albumId; + $this->album = $this->albumFactory->findAbstractAlbumOrFail($this->albumId); + $this->flags->is_base_album = $this->album instanceof BaseAlbum; + $this->num_users = User::count(); + } + + /** + * Rendering of the blade template. + * + * @return View + */ + public function render(): View + { + $this->layout = Configs::getValueAsEnum('layout', AlbumMode::class); + $this->header_url ??= $this->fetchHeaderUrl()?->url; + + $this->num_children = $this->album instanceof ModelsAlbum ? $this->album->children->count() : 0; + $this->num_photos = $this->album->photos->count(); + + return view('livewire.pages.gallery.album'); + } + + /** + * Method call from the front-end to inform it is time to load the pictures given the width. + * + * @return void + */ + public function loadAlbum(int $width): void + { + $this->flags->is_ready_to_load = true; + $this->width = $width; + } + + /** + * Reload the data. + * + * @return void + */ + #[On('reloadPage')] + public function reloadPage(): void + { + if ($this->album instanceof ModelsAlbum) { + $this->album = $this->albumFactory->findBaseAlbumOrFail($this->album->id); + } + } + + /** + * Album property to support the multiple type. + * + * @return Geometry|null + */ + final public function getGeometryProperty(): ?Geometry + { + if ($this->layout !== AlbumMode::JUSTIFIED) { + return null; + } + + $justify = new LayoutJustify(); + $layoutConfig = new LayoutConfig( + containerWidth: $this->width, + containerPadding: 0, + ); + + return $justify->compute($this->getPhotosProperty(), $layoutConfig); + } + + /** + * Computable property to access the photos. + * If we are not ready to load, we return an empty array. + * + * @return Collection + */ + public function getPhotosProperty(): Collection + { + return $this->flags->is_ready_to_load ? $this->album->photos : collect([]); + } + + /** + * Fetch the header url + * TODO: Later this can be also a field from the album and if null we apply the rdm query. + * + * @return SizeVariant|null + * + * @throws QueryBuilderException + * @throws RelationNotFoundException + */ + private function fetchHeaderUrl(): SizeVariant|null + { + if ($this->album->photos->isEmpty()) { + return null; + } + + return SizeVariant::query() + ->where('type', '=', SizeVariantType::MEDIUM) + ->whereBelongsTo($this->album->photos) + ->where('ratio', '>', 1) + ->inRandomOrder() + ->first(); + } + + #[Renderless] + public function openSharingModal(): void + { + $this->openClosableModal('forms.album.share', __('lychee.CLOSE')); + } + + public function back(): void + { + if ($this->album instanceof ModelsAlbum && $this->album->parent_id !== null) { + $this->redirect(route('livewire-gallery-album', ['albumId' => $this->album->parent_id])); + + return; + } + + $this->redirect(route('livewire-gallery')); + } + + #[Renderless] + public function openContextMenu(): void + { + $this->dispatch('openContextMenu', 'menus.AlbumAdd', ['parentId' => $this->albumId])->to(ContextMenu::class); + } +} diff --git a/app/Livewire/Components/Pages/Gallery/Albums.php b/app/Livewire/Components/Pages/Gallery/Albums.php new file mode 100644 index 00000000000..0528634b54b --- /dev/null +++ b/app/Livewire/Components/Pages/Gallery/Albums.php @@ -0,0 +1,97 @@ +topAlbums = resolve(Top::class)->get(); + } + + public function boot(): void + { + $this->topAlbums = resolve(Top::class)->get(); + $this->title = Configs::getValueAsString('site_title'); + $this->nsfwAlbumsVisible = Configs::getValueAsBool('nsfw_visible'); + } + + public function getAlbumsProperty(): Collection + { + return $this->topAlbums->albums; + } + + public function getSmartAlbumsProperty(): Collection + { + return $this->topAlbums->smart_albums + ->concat($this->topAlbums->tag_albums) + ->reject(fn ($album) => $album === null); + } + + public function getSharedAlbumsProperty(): Collection + { + return $this->topAlbums->shared_albums; + } + + /** + * When no albums are present we simply open the login modal. + * [Renderless] indicates that we do not need to call render() on this component. + * + * @return void + */ + #[Renderless] + public function openLoginModal(): void + { + $this->openModal('modals.login'); + } + + /** + * Open the context menu. + * [Renderless] indicates that we do not need to call render() on this component. + * + * @return void + */ + #[Renderless] + public function openContextMenu(): void + { + $this->dispatch('openContextMenu', 'menus.AlbumAdd', ['parentId' => null])->to(ContextMenu::class); + } +} diff --git a/app/Livewire/Components/Pages/Gallery/Photo.php b/app/Livewire/Components/Pages/Gallery/Photo.php new file mode 100644 index 00000000000..3cc1f247d6a --- /dev/null +++ b/app/Livewire/Components/Pages/Gallery/Photo.php @@ -0,0 +1,123 @@ +albumFactory = resolve(AlbumFactory::class); + } + + public function mount(string $albumId, string $photoId): void + { + $this->albumId = $albumId; + $this->photoId = $photoId; + $this->album = $this->albumFactory->findAbstractAlbumOrFail($this->albumId); + + /** @var PhotoModel $photoItem */ + $photoItem = PhotoModel::with('album')->findOrFail($this->photoId); + $this->photo = $photoItem; + $this->overlayType = Configs::getValueAsEnum('image_overlay_type', PhotoOverlayMode::class)->value; + + $this->flags = new PhotoFlags( + can_autoplay: true, + can_rotate: Configs::getValueAsBool('editor_enabled'), + ); + + // $this->locked = Gate::check(AlbumPolicy::CAN_ACCESS, [AbstractAlbum::class, $this->album]); + } + + /** + * Render the associated view. + * + * @return View + * + * @throws BindingResolutionException + */ + public function render(): View + { + return view('livewire.pages.gallery.photo'); + } + + public function back(): mixed + { + return $this->redirect(route('livewire-gallery-album', ['albumId' => $this->albumId])); + } + + #[On('reloadPage')] + public function reloadPage(): void + { + } + + public function set_star(): void + { + Gate::check(PhotoPolicy::CAN_EDIT, $this->photo); + $this->photo->is_starred = !$this->photo->is_starred; + $this->photo->save(); + } + + public function rotate_ccw(): void + { + Gate::check(PhotoPolicy::CAN_EDIT, $this->photo); + $rotateStrategy = new RotateStrategy($this->photo, -1); + $this->photo = $rotateStrategy->do(); + $this->render(); + } + + public function rotate_cw(): void + { + Gate::check(PhotoPolicy::CAN_EDIT, $this->photo); + $rotateStrategy = new RotateStrategy($this->photo, 1); + $this->photo = $rotateStrategy->do(); + $this->render(); + } + + public function delete(): void + { + $this->openModal('forms.photo.delete', ['photoId' => $this->photo->id, 'albumId' => $this->albumId]); + + // Gate::check(PhotoPolicy::CAN_EDIT, $this->photo); + // $fileDeleter = $delete->do([$this->photo->id]); + // App::terminating(fn () => $fileDeleter->do()); + // $this->back(); + } +} diff --git a/app/Livewire/Components/Pages/Gallery/SensitiveWarning.php b/app/Livewire/Components/Pages/Gallery/SensitiveWarning.php new file mode 100644 index 00000000000..1df2c5a8b1e --- /dev/null +++ b/app/Livewire/Components/Pages/Gallery/SensitiveWarning.php @@ -0,0 +1,56 @@ +text = $override !== '' ? $override : __('lychee.NSFW_BANNER'); + + if ($album instanceof Album) { + $this->isOpen = $album->is_nsfw; + + if (Auth::user()?->may_administrate === true) { + $this->isOpen = $this->isOpen && Configs::getValueAsBool('nsfw_warning_admin'); + } else { + $this->isOpen = $this->isOpen && Configs::getValueAsBool('nsfw_warning'); + } + } + } + + /** + * Render the associated view. + * + * @return View + */ + public function render(): View + { + return view('livewire.modules.gallery.sensitive-warning'); + } +} diff --git a/app/Livewire/Components/Pages/Jobs.php b/app/Livewire/Components/Pages/Jobs.php new file mode 100644 index 00000000000..be1cdd2b1a7 --- /dev/null +++ b/app/Livewire/Components/Pages/Jobs.php @@ -0,0 +1,44 @@ +orderBy('id', 'desc') + ->limit(Configs::getValueAsInt('log_max_num_line')) + ->get(); + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.pages.jobs'); + } + + public function back(): mixed + { + return $this->redirect(route('livewire-gallery')); + } +} diff --git a/app/Livewire/Components/Pages/Landing.php b/app/Livewire/Components/Pages/Landing.php new file mode 100644 index 00000000000..3a82bcaffce --- /dev/null +++ b/app/Livewire/Components/Pages/Landing.php @@ -0,0 +1,40 @@ +title = Configs::getValueAsString('landing_title'); + $this->subtitle = Configs::getValueAsString('landing_subtitle'); + $background = Configs::getValueAsString('landing_background'); + if (!Str::startsWith($background, 'http')) { + $background = URL::asset($background); + } + $this->background = $background; + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.pages.landing'); + } +} diff --git a/app/Livewire/Components/Pages/Profile.php b/app/Livewire/Components/Pages/Profile.php new file mode 100644 index 00000000000..fe0f9c43789 --- /dev/null +++ b/app/Livewire/Components/Pages/Profile.php @@ -0,0 +1,55 @@ +are_notification_active = Configs::getValueAsBool('new_photos_notification'); + $this->is_token_auh_active = config('auth.guards.lychee.driver', 'session-or-token') === 'session-or-token'; + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.pages.profile'); + } + + public function back(): mixed + { + return $this->redirect(route('livewire-gallery')); + } +} diff --git a/app/Livewire/Components/Pages/Settings.php b/app/Livewire/Components/Pages/Settings.php new file mode 100644 index 00000000000..d2e01a1c2f3 --- /dev/null +++ b/app/Livewire/Components/Pages/Settings.php @@ -0,0 +1,43 @@ +redirect(route('livewire-gallery')); + } +} diff --git a/app/Livewire/Components/Pages/Sharing.php b/app/Livewire/Components/Pages/Sharing.php new file mode 100644 index 00000000000..df819465054 --- /dev/null +++ b/app/Livewire/Components/Pages/Sharing.php @@ -0,0 +1,73 @@ + + */ + public function getPermsProperty(): array + { + // This could be optimized, but whatever. + return + AccessPermission::with(['album', 'user']) + ->when(!Auth::user()->may_administrate, fn ($q) => $q->whereIn('base_album_id', BaseAlbumImpl::select('id')->where('owner_id', '=', Auth::id()))) + ->whereNotNull('user_id') + ->orderBy('base_album_id', 'asc') + ->get()->all(); + } + + /** + * Set up the profile page. + * + * @return void + * + * @throws ConfigurationKeyMissingException + */ + public function mount(): void + { + Gate::authorize(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, null]); + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.pages.sharing'); + } + + public function back(): mixed + { + return $this->redirect(route('livewire-gallery')); + } + + public function delete(int $id): void + { + AccessPermission::query()->where('id', '=', $id)->delete(); + + // $this->perms = AccessPermission::with(['album','user']) + // ->whereNotNull('user_id')->get()->all(); + } +} diff --git a/app/Livewire/Components/Pages/Users.php b/app/Livewire/Components/Pages/Users.php new file mode 100644 index 00000000000..7a873eb3890 --- /dev/null +++ b/app/Livewire/Components/Pages/Users.php @@ -0,0 +1,91 @@ +loadUsers(); + } + + /** + * Rendering of the front-end. + * + * @return View + */ + public function render(): View + { + return view('livewire.pages.users'); + } + + /** + * Refresh the user List. + * + * @return void + */ + public function loadUsers(): void + { + $this->users = User::orderBy('id', 'asc')->get(); + } + + /** + * Create a new user. + * + * @param Create $create + * + * @return void + */ + public function create(Create $create): void + { + // Create user + $create->do( + $this->username, + $this->password, + $this->may_upload, + $this->may_edit_own_settings); + + // reset attributes and reload user list (triggers refresh) + $this->username = ''; + $this->password = ''; + $this->may_upload = false; + $this->may_edit_own_settings = false; + $this->loadUsers(); + } + + public function back(): mixed + { + return $this->redirect(route('livewire-gallery')); + } +} diff --git a/app/Livewire/DTO/AlbumFlags.php b/app/Livewire/DTO/AlbumFlags.php new file mode 100644 index 00000000000..c4e04bc3591 --- /dev/null +++ b/app/Livewire/DTO/AlbumFlags.php @@ -0,0 +1,19 @@ + */ + #[Locked] + public Collection $configs; + + /** @var array */ + public array $values; + + /** + * This allows Livewire to know which values of the $configs we + * want to display in the wire:model. Sort of a white listing. + * + * @var array + */ + protected $rules = [ + 'values.*' => 'nullable', + ]; + + /** + * Initialize form data. + * + * @param Collection $configs + * + * @return void + */ + public function setConfigs(Collection $configs): void + { + $this->configs = $configs; + $this->values = $configs->map(fn (Configs $c, int $k) => $c->value)->all(); + } + + /** + * Save form data. + * + * @return void + * + * @throws ValidationException + */ + public function save(): void + { + $this->validate(); + $this->configs->each( + function (Configs $c, int $key) { + $candidateValue = $this->values[$key]; + $template = 'Error: Expected %s, got ' . ($candidateValue ?? 'NULL') . '.'; + + $error_msg = $c->sanity($candidateValue, $template); + if ($error_msg === '') { + $c->value = $candidateValue; + $c->save(); + } else { + $this->addError('values.' . $key, $error_msg); + } + } + ); + } +} \ No newline at end of file diff --git a/app/Livewire/Synth/AlbumSynth.php b/app/Livewire/Synth/AlbumSynth.php new file mode 100644 index 00000000000..d6a62f19094 --- /dev/null +++ b/app/Livewire/Synth/AlbumSynth.php @@ -0,0 +1,42 @@ +> + */ + public function dehydrate($target): array + { + return [[ + 'id' => $target->id, + ], []]; + } + + /** + * @param array $value + * + * @return AbstractAlbum + */ + public function hydrate($value): AbstractAlbum + { + /** @var AlbumFactory $albumFactory */ + $albumFactory = resolve(AlbumFactory::class); + + return $albumFactory->findAbstractAlbumOrFail($value['id']); + } +} \ No newline at end of file diff --git a/app/Livewire/Synth/PhotoSynth.php b/app/Livewire/Synth/PhotoSynth.php new file mode 100644 index 00000000000..d8e762cf9f3 --- /dev/null +++ b/app/Livewire/Synth/PhotoSynth.php @@ -0,0 +1,38 @@ +> + */ + public function dehydrate($target): array + { + return [[ + 'id' => $target->id, + ], []]; + } + + /** + * @param array $value + * + * @return Photo + */ + public function hydrate($value): Photo + { + return Photo::findOrFail($value['id']); + } +} \ No newline at end of file diff --git a/app/Livewire/Traits/InteractWithContextMenu.php b/app/Livewire/Traits/InteractWithContextMenu.php new file mode 100644 index 00000000000..8422a0d8482 --- /dev/null +++ b/app/Livewire/Traits/InteractWithContextMenu.php @@ -0,0 +1,31 @@ +dispatch('openContextMenu', $form, $params)->to(ContextMenu::class); + } + + /** + * Close the ContextMenu. + * + * @return void + */ + protected function closeContextMenu(): void + { + $this->dispatch('closeContextMenu')->to(ContextMenu::class); + } +} diff --git a/app/Livewire/Traits/InteractWithModal.php b/app/Livewire/Traits/InteractWithModal.php new file mode 100644 index 00000000000..6b98053546b --- /dev/null +++ b/app/Livewire/Traits/InteractWithModal.php @@ -0,0 +1,45 @@ +dispatch('openModal', $form, '', $params)->to(Modal::class); + } + + /** + * Open Modal with form and paramters. + * + * @param string $form Livewire component to include in the modal + * @param string $close_text text to put if we use a close button + * @param array $params Parameters for said component + * + * @return void + */ + protected function openClosableModal(string $form, string $close_text, array $params = []): void + { + $this->dispatch('openModal', $form, $close_text, $params)->to(Modal::class); + } + + /** + * Close the modal. + * + * @return void + */ + protected function closeModal(): void + { + $this->dispatch('closeModal')->to(Modal::class); + } +} diff --git a/app/Livewire/Traits/Notify.php b/app/Livewire/Traits/Notify.php new file mode 100644 index 00000000000..4b2a91ebe3f --- /dev/null +++ b/app/Livewire/Traits/Notify.php @@ -0,0 +1,24 @@ +dispatch('notify', ['msg' => $message, 'type' => $type->value]); + } +} \ No newline at end of file diff --git a/app/Livewire/Traits/UseOpenable.php b/app/Livewire/Traits/UseOpenable.php new file mode 100644 index 00000000000..eee2e1854df --- /dev/null +++ b/app/Livewire/Traits/UseOpenable.php @@ -0,0 +1,51 @@ +isOpen = true; + } + + /** + * Close the component. + * + * @return void + */ + #[On('close')] + public function close(): void + { + Debugbar::info('request to close.'); + $this->isOpen = false; + } + + /** + * Toggle the component. + * + * @return void + */ + #[On('toggle')] + public function toggle(): void + { + Debugbar::info('toggle.'); + $this->isOpen = !$this->isOpen; + } +} \ No newline at end of file diff --git a/app/Livewire/Traits/UseValidator.php b/app/Livewire/Traits/UseValidator.php new file mode 100644 index 00000000000..57225276714 --- /dev/null +++ b/app/Livewire/Traits/UseValidator.php @@ -0,0 +1,37 @@ +all(), $rules); + + if ($validator->fails()) { + $msg = ''; + foreach ($validator->getMessageBag()->messages() as $value) { + $msg .= ($msg !== '' ? '
' : '') . implode('
', $value); + } + $this->dispatch('notify', ['msg' => $msg, 'type' => 'error']); + + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/app/Livewire/Traits/UseWireable.php b/app/Livewire/Traits/UseWireable.php new file mode 100644 index 00000000000..b3b78eae13a --- /dev/null +++ b/app/Livewire/Traits/UseWireable.php @@ -0,0 +1,47 @@ +getProperties(\ReflectionProperty::IS_PUBLIC); + + foreach ($props as $prop) { + $propertyValue = $prop->getValue($this); + if (is_object($propertyValue)) { + throw new LycheeLogicException(sprintf('Convertion of %s is not supported', get_class($propertyValue))); + } + $result[$prop->getName()] = $propertyValue; + } + + return $result; + } + + /** + * @param mixed $data + * + * @return self + * + * @throws LycheeLogicException + * @throws \ReflectionException + */ + public static function fromLivewire(mixed $data) + { + if (!is_array($data)) { + throw new LycheeLogicException('data is not an array'); + } + + $cls = new \ReflectionClass(self::class); + + return $cls->newInstanceArgs($data); + } +} \ No newline at end of file diff --git a/app/Models/Album.php b/app/Models/Album.php index 5d7c7ed4aeb..2e3fe1d85b1 100644 --- a/app/Models/Album.php +++ b/app/Models/Album.php @@ -156,6 +156,11 @@ class Album extends BaseAlbum implements Node */ protected $with = ['cover', 'cover.size_variants', 'thumb']; + protected function _toArray(): array + { + return parent::toArray(); + } + /** * Return the relationship between this album and photos which are * direct children of this album. diff --git a/app/Models/BaseAlbumImpl.php b/app/Models/BaseAlbumImpl.php index 34bbfbcb3b5..2896d473423 100644 --- a/app/Models/BaseAlbumImpl.php +++ b/app/Models/BaseAlbumImpl.php @@ -194,6 +194,11 @@ class BaseAlbumImpl extends Model implements HasRandomID */ protected $with = ['owner', 'access_permissions']; + protected function _toArray(): array + { + return parent::toArray(); + } + /** * @param $query * diff --git a/app/Models/Configs.php b/app/Models/Configs.php index bdfdd814550..7fc1e15d442 100644 --- a/app/Models/Configs.php +++ b/app/Models/Configs.php @@ -95,10 +95,11 @@ public function newEloquentBuilder($query): ConfigsBuilder * Sanity check. * * @param string|null $candidateValue + * @param string|null $message_template * * @return string */ - public function sanity(?string $candidateValue): string + public function sanity(?string $candidateValue, ?string $message_template = null): string { $message = ''; $val_range = [ @@ -106,7 +107,7 @@ public function sanity(?string $candidateValue): string self::TERNARY => explode('|', self::TERNARY), ]; - $message_template_got = 'Error: Wrong property for ' . $this->key . ', expected %s, got ' . ($candidateValue ?? 'NULL') . '.'; + $message_template ??= 'Error: Wrong property for ' . $this->key . ', expected %s, got ' . ($candidateValue ?? 'NULL') . '.'; switch ($this->type_range) { case self::STRING: case self::DISABLED: @@ -119,24 +120,24 @@ public function sanity(?string $candidateValue): string case self::INT: // we make sure that we only have digits in the chosen value. if (!ctype_digit(strval($candidateValue))) { - $message = sprintf($message_template_got, 'positive integer'); + $message = sprintf($message_template, 'positive integer'); } break; case self::BOOL: case self::TERNARY: if (!in_array($candidateValue, $val_range[$this->type_range], true)) { // BOOL or TERNARY - $message = sprintf($message_template_got, implode(' or ', $val_range[$this->type_range])); + $message = sprintf($message_template, implode(' or ', $val_range[$this->type_range])); } break; case self::LICENSE: if (!in_array($candidateValue, Helpers::get_all_licenses(), true)) { - $message = sprintf($message_template_got, 'a valid license'); + $message = sprintf($message_template, 'a valid license'); } break; default: $values = explode('|', $this->type_range); if (!in_array($candidateValue, $values, true)) { - $message = sprintf($message_template_got, implode(' or ', $values)); + $message = sprintf($message_template, implode(' or ', $values)); } break; } diff --git a/app/Models/Extensions/SizeVariants.php b/app/Models/Extensions/SizeVariants.php index 1c94833a822..07c111869d6 100644 --- a/app/Models/Extensions/SizeVariants.php +++ b/app/Models/Extensions/SizeVariants.php @@ -131,11 +131,41 @@ public function getOriginal(): ?SizeVariant return $this->original; } + /** + * Get Medium2x or fallback to Medium. + * + * @return SizeVariant|null + */ + public function getMedium2x(): ?SizeVariant + { + return $this->medium2x; + } + + /** + * get Medium or fallback to Original. + * + * @return SizeVariant|null + */ public function getMedium(): ?SizeVariant { return $this->medium; } + /** + * Get Small2x or fallback to Small. + * + * @return SizeVariant|null + */ + public function getSmall2x(): ?SizeVariant + { + return $this->small2x; + } + + public function getSmall(): ?SizeVariant + { + return $this->small; + } + public function getThumb2x(): ?SizeVariant { return $this->thumb2x; @@ -258,6 +288,17 @@ private static function replicateSizeVariant(SizeVariants $duplicate, ?SizeVaria */ public function hasMedium(): bool { - return $this->medium2x !== null || $this->medium !== null; + return $this->medium !== null || $this->medium2x !== null; + } + + /** + * We don't need to check if small2x or medium2x exists. + * small2x implies small, and same for medium2x, but the opposite is not true! + * + * @return bool + */ + public function hasMediumOrSmall(): bool + { + return $this->small !== null || $this->medium !== null; } } diff --git a/app/Models/Extensions/ThrowsConsistentExceptions.php b/app/Models/Extensions/ThrowsConsistentExceptions.php index 662fba56ac8..3141865f87e 100644 --- a/app/Models/Extensions/ThrowsConsistentExceptions.php +++ b/app/Models/Extensions/ThrowsConsistentExceptions.php @@ -24,6 +24,7 @@ trait ThrowsConsistentExceptions protected function friendlyModelName(): string { $name = Str::snake(class_basename($this), ' '); + // Remove some typical, implementation-specific pre- and suffixes from the name return str_replace('/(^abstract )|( impl$)|( interface$)/', '', $name); } diff --git a/app/Models/Extensions/Thumb.php b/app/Models/Extensions/Thumb.php index 130fe55cdc2..408942873a0 100644 --- a/app/Models/Extensions/Thumb.php +++ b/app/Models/Extensions/Thumb.php @@ -15,10 +15,10 @@ class Thumb extends AbstractDTO { - protected string $id; - protected string $type; - protected string $thumbUrl; - protected ?string $thumb2xUrl; + public string $id; + public string $type; + public ?string $thumbUrl; + public ?string $thumb2xUrl; protected function __construct(string $id, string $type, string $thumbUrl, ?string $thumb2xUrl = null) { diff --git a/app/Models/Extensions/ToArrayThrowsNotImplemented.php b/app/Models/Extensions/ToArrayThrowsNotImplemented.php index 9511ebc4b51..400986775e0 100644 --- a/app/Models/Extensions/ToArrayThrowsNotImplemented.php +++ b/app/Models/Extensions/ToArrayThrowsNotImplemented.php @@ -3,17 +3,28 @@ namespace App\Models\Extensions; use App\Exceptions\Internal\NotImplementedException; +use Illuminate\Support\Facades\Route; /** * Trait ToArrayThrowsNotImplemented. * * Now that we use Resources toArray should no longer be used. * Throw an exception if we encounter this function in the code. + * + * Because Livewire uses toArray to serialize models when passing them to sub components, + * we still need to allow those cases. Those can be detected by the Route::is() call */ trait ToArrayThrowsNotImplemented { + abstract protected function _toArray(): array; + final public function toArray(): array { - throw new NotImplementedException('->toArray() is deprecated, use Resources instead.'); + if (Route::is('livewire_index') || Route::is('livewire.message')) { + return $this->_toArray(); + } + $details = Route::getCurrentRoute()?->getName() ?? ''; + $details .= ($details !== '' ? ':' : '') . get_called_class(); + throw new NotImplementedException($details . '->toArray() is deprecated, use Resources instead.'); } } \ No newline at end of file diff --git a/app/Models/Extensions/UTCBasedTimes.php b/app/Models/Extensions/UTCBasedTimes.php index 06ea608d4d2..89deeb9802a 100644 --- a/app/Models/Extensions/UTCBasedTimes.php +++ b/app/Models/Extensions/UTCBasedTimes.php @@ -200,7 +200,7 @@ public function asDateTime($value): ?Carbon } return $result; - } catch (InvalidArgumentException) { + } catch (\InvalidArgumentException) { // If the specified format did not mach, don't throw an exception, // but try to parse the value using a best-effort approach, see below } diff --git a/app/Models/JobHistory.php b/app/Models/JobHistory.php index e6103ddc55c..3846e18be81 100644 --- a/app/Models/JobHistory.php +++ b/app/Models/JobHistory.php @@ -9,8 +9,6 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; /** - * App\Models\JobHistory. - * * @property int $id * @property int $owner_id * @property User $owner diff --git a/app/Models/Photo.php b/app/Models/Photo.php index c42ccb52c8c..b8cf1fe768e 100644 --- a/app/Models/Photo.php +++ b/app/Models/Photo.php @@ -27,6 +27,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Storage; +use LycheeOrg\PhpFlickrJustifiedLayout\Contracts\AspectRatio; use function Safe\preg_match; /** @@ -119,7 +120,7 @@ * * @mixin \Eloquent */ -class Photo extends Model +class Photo extends Model implements AspectRatio { use UTCBasedTimes; use HasAttributesPatch; @@ -157,6 +158,18 @@ class Photo extends Model 'img_direction' => 'float', ]; + /** + * @var array The list of attributes which exist as columns of the DB + * relation but shall not be serialized to JSON + */ + protected $hidden = [ + RandomID::LEGACY_ID_NAME, + 'album', // do not serialize relation in order to avoid infinite loops + 'owner', // do not serialize relation + 'owner_id', + 'live_photo_short_path', // serialize live_photo_url instead + ]; + /** * @param $query * @@ -167,6 +180,11 @@ public function newEloquentBuilder($query): PhotoBuilder return new PhotoBuilder($query); } + protected function _toArray(): array + { + return parent::toArray(); + } + /** * Return the relationship between a Photo and its Album. * @@ -268,7 +286,8 @@ protected function getLicenseAttribute(?string $license): string if ($license !== 'none') { return $license; } - if ($this->album_id !== null) { + + if ($this->album_id !== null && $this->relationLoaded('album')) { return $this->album->license; } @@ -298,6 +317,7 @@ protected function getFocalAttribute(?string $focal): ?string if ($focal === null || $focal === '') { return null; } + // We need to format the framerate (stored as focal) -> max 2 decimal digits return $this->isVideo() ? (string) round(floatval($focal), 2) : $focal; } @@ -338,6 +358,29 @@ protected function getLivePhotoUrlAttribute(): ?string return ($path === null || $path === '') ? null : Storage::url($path); } + /** + * Accessor for the virtual attribute $aspect_ratio. + * + * Returns the correct aspect ratio for + * - photos + * - and videos where small or medium exists + * Otherwise returns 1 (square) + * + * @return float aspect ratio to use in display mode + */ + protected function getAspectRatioAttribute(): float + { + if ($this->isVideo() && + $this->size_variants->getSmall() === null && + $this->size_variants->getMedium() === null) { + return 1; + } + + return $this->size_variants->getOriginal()?->ratio ?? + $this->size_variants->getMedium()?->ratio ?? + $this->size_variants->getSmall()?->ratio ?? 1; + } + /** * Checks if the photo represents a (real) photo (as opposed to video or raw). * diff --git a/app/Models/SizeVariant.php b/app/Models/SizeVariant.php index df3e2852b03..3629337ecb0 100644 --- a/app/Models/SizeVariant.php +++ b/app/Models/SizeVariant.php @@ -50,6 +50,7 @@ * @property string $full_path * @property int $width * @property int $height + * @property float $ratio * @property int $filesize * @property Collection $sym_links * @@ -101,6 +102,28 @@ class SizeVariant extends Model 'width' => 'integer', 'height' => 'integer', 'filesize' => 'integer', + 'ratio' => 'float', + ]; + + /** + * @var array The list of attributes which exist as columns of the DB + * relation but shall not be serialized to JSON + */ + protected $hidden = [ + 'id', // irrelevant, because a size variant is always serialized as an embedded object of its photo + 'photo', // see above and otherwise infinite loops will occur + 'photo_id', // see above + 'short_path', // serialize url instead + 'sym_links', // don't serialize relation of symlinks + ]; + + /** + * @var string[] The list of "virtual" attributes which do not exist as + * columns of the DB relation but which shall be appended to + * JSON from accessors + */ + protected $appends = [ + 'url', ]; /** @@ -113,6 +136,11 @@ public function newEloquentBuilder($query): SizeVariantBuilder return new SizeVariantBuilder($query); } + protected function _toArray(): array + { + return parent::toArray(); + } + /** * Returns the association to the photo which this size variant belongs * to. diff --git a/app/Models/SymLink.php b/app/Models/SymLink.php index f285eec69aa..fd55ef29307 100644 --- a/app/Models/SymLink.php +++ b/app/Models/SymLink.php @@ -79,6 +79,11 @@ class SymLink extends Model 'size_variant_id', // see above ]; + final protected function _toArray(): array + { + return parent::toArray(); + } + /** * @param $query * diff --git a/app/Models/TagAlbum.php b/app/Models/TagAlbum.php index 447442d5dde..7cab4c2569a 100644 --- a/app/Models/TagAlbum.php +++ b/app/Models/TagAlbum.php @@ -75,6 +75,14 @@ class TagAlbum extends BaseAlbum 'show_tags' => ArrayCast::class, ]; + /** + * @var array The list of attributes which exist as columns of the DB + * relation but shall not be serialized to JSON + */ + protected $hidden = [ + 'base_class', // don't serialize base class as a relation, the attributes of the base class are flatly merged into the JSON result + ]; + /** * @var string[] The list of "virtual" attributes which do not exist as * columns of the DB relation but which shall be appended to @@ -84,6 +92,14 @@ class TagAlbum extends BaseAlbum 'thumb', ]; + protected function _toArray(): array + { + $result = parent::toArray(); + $result['is_tag_album'] = true; + + return $result; + } + public function photos(): HasManyPhotosByTag { return new HasManyPhotosByTag($this); diff --git a/app/Models/User.php b/app/Models/User.php index 30c62e84425..82cc19ad4b6 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -37,15 +37,11 @@ * @property bool $may_administrate * @property bool $may_upload * @property bool $may_edit_own_settings - * @property string $name * @property string|null $token * @property string|null $remember_token * @property Collection $albums - * @property int|null $albums_count * @property DatabaseNotificationCollection|DatabaseNotification[] $notifications - * @property int|null $notifications_count * @property Collection $shared - * @property int|null $shared_count * @property Collection $photos * @property int|null $photos_count * @property Collection $webAuthnCredentials @@ -107,6 +103,11 @@ class User extends Authenticatable implements WebAuthnAuthenticatable 'may_edit_own_settings' => 'boolean', ]; + protected function _toArray(): array + { + return parent::toArray(); + } + /** * Create a new Eloquent query builder for the model. * diff --git a/app/Policies/AlbumPolicy.php b/app/Policies/AlbumPolicy.php index 30f6b06b9b2..064de4e7e88 100644 --- a/app/Policies/AlbumPolicy.php +++ b/app/Policies/AlbumPolicy.php @@ -19,12 +19,14 @@ class AlbumPolicy extends BasePolicy { public const UNLOCKED_ALBUMS_SESSION_KEY = 'unlocked_albums'; + public const IS_OWNER = 'isOwner'; public const CAN_SEE = 'canSee'; public const CAN_ACCESS = 'canAccess'; public const CAN_DOWNLOAD = 'canDownload'; public const CAN_DELETE = 'canDelete'; public const CAN_UPLOAD = 'canUpload'; public const CAN_EDIT = 'canEdit'; + public const CAN_DELETE = 'canDelete'; public const CAN_EDIT_ID = 'canEditById'; public const CAN_SHARE_WITH_USERS = 'canShareWithUsers'; public const CAN_IMPORT_FROM_SERVER = 'canImportFromServer'; @@ -38,7 +40,7 @@ class AlbumPolicy extends BasePolicy * * @return bool */ - private function isOwner(?User $user, BaseAlbum $album): bool + public function isOwner(?User $user, BaseAlbum $album): bool { return $user !== null && $album->owner_id === $user->id; } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 6b8d462c61b..affc5391c9c 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -11,6 +11,8 @@ use App\Factories\AlbumFactory; use App\Image\SizeVariantDefaultFactory; use App\Image\StreamStatFilter; +use App\Livewire\Synth\AlbumSynth; +use App\Livewire\Synth\PhotoSynth; use App\Metadata\Json\CommitsRequest; use App\Metadata\Json\UpdateRequest; use App\Metadata\Versions\FileVersion; @@ -32,6 +34,7 @@ use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Str; +use Livewire\Livewire; use Opcodes\LogViewer\Facades\LogViewer; use Safe\Exceptions\StreamException; use function Safe\stream_filter_register; @@ -78,6 +81,12 @@ class AppServiceProvider extends ServiceProvider GitTags::class => GitTags::class, ]; + private array $livewireSynth = + [ + AlbumSynth::class, + PhotoSynth::class, + ]; + /** * Bootstrap any application services. * @@ -140,6 +149,10 @@ public function boot() // return true to allow viewing the Log Viewer. return Auth::authenticate() !== null && Gate::check(SettingsPolicy::CAN_SEE_LOGS, Configs::class); }); + + foreach ($this->livewireSynth as $synth) { + Livewire::propertySynthesizer($synth); + } } /** diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index d0ce993d6e3..e65f4f32dda 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -51,6 +51,9 @@ public function boot() Route::middleware('web-admin') ->group(base_path('routes/web-admin.php')); + Route::middleware('web') + ->group(base_path('routes/web-livewire.php')); + Route::middleware('web') ->group(base_path('routes/web.php')); }); diff --git a/app/Rules/CurrentPasswordRule.php b/app/Rules/CurrentPasswordRule.php new file mode 100644 index 00000000000..717300e7c03 --- /dev/null +++ b/app/Rules/CurrentPasswordRule.php @@ -0,0 +1,33 @@ +password); + } + + /** + * {@inheritDoc} + */ + public function message(): string + { + return ':attribute is invalid.'; + } +} diff --git a/app/SmartAlbums/BaseSmartAlbum.php b/app/SmartAlbums/BaseSmartAlbum.php index 1ddfc91a51e..b4e3b1f09ac 100644 --- a/app/SmartAlbums/BaseSmartAlbum.php +++ b/app/SmartAlbums/BaseSmartAlbum.php @@ -4,6 +4,7 @@ use App\Contracts\Exceptions\InternalLycheeException; use App\Contracts\Models\AbstractAlbum; +use App\DTO\AlbumProtectionPolicy; use App\DTO\PhotoSortingCriterion; use App\Enum\SmartAlbumType; use App\Exceptions\ConfigurationKeyMissingException; @@ -66,6 +67,36 @@ protected function __construct(SmartAlbumType $id, \Closure $smartCondition) } } + protected function _toArray(): array + { + // The properties `thumb` and `photos` are intentionally treated + // differently. + // + // 1. The result always includes `thumb`, hence we call the + // getter method to ensure that the property is initialized, if it + // has not already been accessed before. + // 2. The result only includes the collection `photos`, if it has + // already explicitly been accessed earlier and thus is initialized. + // + // Rationale: + // + // 1. This resembles the behaviour of a real Eloquent model, if the + // attribute `thumb` was part of the `append`-property of model. + // 2. This resembles the behaviour of a real Eloquent model for + // one-to-many relations. + // A relation is only included in the array representation, if the + // relation has been loaded. + // This avoids unnecessary hydration of photos if the album is + // only used within a listing of sub-albums. + return [ + 'id' => $this->id, + 'title' => $this->title, + 'thumb' => $this->getThumbAttribute(), + 'policy' => AlbumProtectionPolicy::ofSmartAlbum($this), + 'photos' => $this->photos?->toArray(), + ]; + } + /** * @throws InternalLycheeException */ diff --git a/app/View/Components/Footer.php b/app/View/Components/Footer.php new file mode 100644 index 00000000000..3775c337caf --- /dev/null +++ b/app/View/Components/Footer.php @@ -0,0 +1,66 @@ +show_socials = Configs::getValueAsBool('footer_show_social_media'); + $this->facebook = Configs::getValueAsString('sm_facebook_url'); + $this->flickr = Configs::getValueAsString('sm_flickr_url'); + $this->twitter = Configs::getValueAsString('sm_twitter_url'); + $this->instagram = Configs::getValueAsString('sm_instagram_url'); + $this->youtube = Configs::getValueAsString('sm_youtube_url'); + + $this->hosted_by = __('lychee.HOSTED_WITH_LYCHEE'); + + if (Configs::getValueAsBool('footer_show_copyright')) { + /** @var string $footer_text */ + $footer_text = __('lychee.FOOTER_COPYRIGHT'); + $this->copyright = sprintf( + $footer_text, + Configs::getValueAsString('site_owner'), + Configs::getValueAsInt('site_copyright_end')); + } + + $this->additional_footer_text = Configs::getValueAsString('footer_additional_text'); + } + + /** + * Render component. + * + * @return View + * + * @throws BindingResolutionException + */ + public function render(): View + { + return view('components.footer'); + } +} diff --git a/app/View/Components/Gallery/Album/Details.php b/app/View/Components/Gallery/Album/Details.php new file mode 100644 index 00000000000..cc27ba82e31 --- /dev/null +++ b/app/View/Components/Gallery/Album/Details.php @@ -0,0 +1,46 @@ +can_download = Gate::check(AlbumPolicy::CAN_DOWNLOAD, [AbstractAlbum::class, $album]); + $this->url = $url; + $this->title = $album->title; + $this->album_id = $album->id; + if ($album instanceof Album) { + $this->num_children = $album->num_children; + // TODO fix me later + $this->num_photos = $album->num_photos; + } + if ($album instanceof BaseAlbum) { + $this->created_at = $album->created_at->format($date_format); + $this->description = $album->description; + } + } + + public function render() + { + return view('components.gallery.album.details'); + } +} \ No newline at end of file diff --git a/app/View/Components/Gallery/Album/Hero.php b/app/View/Components/Gallery/Album/Hero.php new file mode 100644 index 00000000000..0540d77022c --- /dev/null +++ b/app/View/Components/Gallery/Album/Hero.php @@ -0,0 +1,34 @@ +url = $url; + $this->title = $album->title; + if ($album instanceof BaseAlbum) { + // Todo: add date format configuration + $this->min_taken_at = $album->min_taken_at?->format($date_format); + $this->max_taken_at = $album->max_taken_at?->format($date_format); + } + } + + public function render(): View + { + return view('components.gallery.album.hero'); + } +} \ No newline at end of file diff --git a/app/View/Components/Gallery/Album/SharingLinks.php b/app/View/Components/Gallery/Album/SharingLinks.php new file mode 100644 index 00000000000..065e5f8a740 --- /dev/null +++ b/app/View/Components/Gallery/Album/SharingLinks.php @@ -0,0 +1,31 @@ +url = route('livewire-gallery-album', ['albumId' => $album->id]); + $this->rawUrl = rawurlencode($this->url); + $raw_title = rawurlencode($album->title); + $this->twitter_link = 'https://twitter.com/share?url=' . $this->rawUrl; + $this->facebook_link = 'https://www.facebook.com/sharer.php?u=' . $this->rawUrl . '?t=' . $raw_title; + $this->mailTo_link = 'mailto:?subject=' . $raw_title . '&' . $this->rawUrl; + } + + public function render(): View + { + return view('components.gallery.album.sharing-links'); + } +} \ No newline at end of file diff --git a/app/View/Components/Gallery/Album/Thumbs/Album.php b/app/View/Components/Gallery/Album/Thumbs/Album.php new file mode 100644 index 00000000000..99b6db07b6c --- /dev/null +++ b/app/View/Components/Gallery/Album/Thumbs/Album.php @@ -0,0 +1,74 @@ +subType = Configs::getValueAsEnum('album_subtitle_type', ThumbAlbumSubtitleType::class)->value; + + $this->id = $data->id; + $this->thumb = $data->thumb; + $this->title = $data->title; + + if ($data instanceof BaseSmartAlbum) { + $policy = AlbumProtectionPolicy::ofSmartAlbum($data); + } else { + /** @var BaseAlbum $data */ + $this->max_taken_at = $data->max_taken_at?->format($date_format); + $this->min_taken_at = $data->min_taken_at?->format($date_format); + $this->created_at = $data->created_at->format($date_format); + $policy = AlbumProtectionPolicy::ofBaseAlbum($data); + } + + $this->is_nsfw = $policy->is_nsfw; + $this->is_nsfw_blurred = $this->is_nsfw && Configs::getValueAsBool('nsfw_blur'); + $this->is_public = $policy->is_public; + $this->is_link_required = $policy->is_link_required; + $this->is_password_required = $policy->is_password_required; + + $this->is_tag_album = $data instanceof TagAlbum; + // TODO : FIX ME This is incorrect. We should compare with the parent and not the current album. + // This aims to indicate whether the current thumb is used to determine the parent. + $this->has_cover_id = $data instanceof AlbumModel && $data->cover_id !== null && $data->cover_id === $data->thumb->id; + $this->has_subalbum = $data instanceof AlbumModel && !$data->isLeaf(); + } + + public function render() + { + return view('components.gallery.album.thumbs.album'); + } +} \ No newline at end of file diff --git a/app/View/Components/Gallery/Album/Thumbs/AlbumThumb.php b/app/View/Components/Gallery/Album/Thumbs/AlbumThumb.php new file mode 100644 index 00000000000..c0818a86beb --- /dev/null +++ b/app/View/Components/Gallery/Album/Thumbs/AlbumThumb.php @@ -0,0 +1,45 @@ +src = Str::contains($type, 'video') ? URL::asset('img/play-icon.png') : URL::asset('img/placeholder.png'); + $this->dataSrc = Str::contains($type, 'raw') ? URL::asset('img/no_images.svg') : ''; + } else { + $this->src = URL::asset('img/no_images.svg'); + + if ($thumb !== '') { + $this->dataSrc = URL::asset($thumb); + } + } + + $this->src = sprintf("src='%s'", $this->src); + if ($this->dataSrc !== '') { + $this->dataSrc = sprintf("data-src='%s'", $this->dataSrc); + } + + if ($thumb2x !== '') { + $this->dataSrcSet = sprintf("data-srcset='%s 2x'", URL::asset($thumb2x)); + } + } + + public function render() + { + return view('components.gallery.album.thumbs.album-thumb'); + } +} diff --git a/app/View/Components/Gallery/Album/Thumbs/Photo.php b/app/View/Components/Gallery/Album/Thumbs/Photo.php new file mode 100644 index 00000000000..3193ff2ef7f --- /dev/null +++ b/app/View/Components/Gallery/Album/Thumbs/Photo.php @@ -0,0 +1,246 @@ +layout = $layout; + $date_format = Configs::getValueAsString('date_format_photo_thumb'); + + $this->album_id = $albumId; + $this->photo_id = $data->id; + $this->title = $data->title; + $this->taken_at = $data->taken_at?->format($date_format) ?? ''; + $this->created_at = $data->created_at->format($date_format); + $this->is_starred = $data->is_starred; + $this->style = $geometry?->toCSS() ?? ''; + $this->is_video = $data->isVideo(); + + if ($this->layout === AlbumMode::SQUARE) { + $this->setSquareLayout($data); + + return; + } + + // Not squared layout: + // - justified + // - Masondry + // - grid + + $this->setOtherLayouts($data); + } + + /** + * Define src. + * + * this is what will be first deplayed before loading. + * + * @param SizeVariant|null $thumb + * @param bool $is_video + * @param bool $has_live_photo_url + * + * @return void + */ + private function set_src(?SizeVariant $thumb, bool $is_video, bool $has_live_photo_url): void + { + // default is place holder + $this->src = URL::asset('img/placeholder.png'); + + // if thumb is not null then directly return: + // it will be replaced later by src-set + if ($thumb !== null) { + $this->src = sprintf("src='%s'", $this->src); + + return; + } + + // TODO: Don't hardcode paths + // change the png in the other cases. + // no need to lazyload too. + $this->is_lazyload = false; + $this->src = $is_video ? URL::asset('img/play-icon.png') : $this->src; + $this->src = $has_live_photo_url ? URL::asset('img/live-photo-icon.png') : $this->src; + $this->src = sprintf("src='%s'", $this->src); + } + + /** + * Defines the thumbs if the layout is squared. + * + * @param ModelsPhoto $data + * + * @return void + * + * @throws IllegalOrderOfOperationException + * @throws InvalidSizeVariantException + */ + private function setSquareLayout(ModelsPhoto $data): void + { + $has_live_photo_url = $data->live_photo_url !== null; + + $thumb = $data->size_variants->getSizeVariant(SizeVariantType::THUMB); + $thumb2x = $data->size_variants->getSizeVariant(SizeVariantType::THUMB2X); + + $this->class_thumbs = ''; + $this->class_thumbs .= $this->is_video ? ' video' : ''; + $this->class_thumbs .= $has_live_photo_url ? ' livephoto' : ''; + + $thumbUrl = $thumb?->url; + $thumb2xUrl = $thumb2x?->url; + $this->set_src($thumb, $this->is_video, $has_live_photo_url); + + $this->srcset = sprintf("data-src='%s'", URL::asset($thumbUrl)); + $this->srcset2x = $thumb2xUrl !== null ? sprintf("data-srcset='%s 2x'", URL::asset($thumb2xUrl)) : ''; + } + + /** + * Not squared layout: + * - justified + * - Masondry + * - grid. + * + * @param ModelsPhoto $data + * + * @return void + * + * @throws IllegalOrderOfOperationException + * @throws InvalidSizeVariantException + */ + private function setOtherLayouts(ModelsPhoto $data): void + { + $is_video = $data->isVideo(); + $has_live_photo_url = $data->live_photo_url !== null; + + $thumb = $data->size_variants->getSizeVariant(SizeVariantType::THUMB); + $thumb2x = $data->size_variants->getSizeVariant(SizeVariantType::THUMB2X); + + $this->class_thumbs = ''; + $this->class_thumbs .= $is_video ? ' video' : ''; + $this->class_thumbs .= $has_live_photo_url ? ' livephoto' : ''; + + $this->set_src($thumb, $is_video, $has_live_photo_url); + + $dim = 200; + $dim2x = 400; + $thumbUrl = $thumb?->url; + $thumb2xUrl = $thumb2x?->url; + + // Probably this code needs some fix/refactoring, too. However, where is this method invoked and + // what is the structure of the passed `data` array? (Could find any invocation.) + + if ($data->size_variants->hasMediumOrSmall()) { + $thumbsUrls = $this->setThumbUrls($data->size_variants); + + $this->_w = $thumbsUrls['w']; + $this->_h = $thumbsUrls['h']; + $dim2x = $thumbsUrls['w2x']; + $thumbUrl = $thumbsUrls['thumbUrl']; + $thumb2xUrl = $thumbsUrls['thumb2xUrl']; + + $dim = $this->_w; + } elseif (!$data->isVideo()) { + $original = $data->size_variants->getSizeVariant(SizeVariantType::ORIGINAL); + + $this->_w ??= $original->width; + $this->_h ??= $original->height; + // Fallback for images with no small or medium. + $thumbUrl ??= $original->url; + } elseif ($thumbUrl === null) { + // Fallback for videos with no small (the case of no thumb is handled else where). + $this->class_thumbs = 'video'; + $dim = 200; + $dim2x = 200; + } + + $this->srcset = sprintf("data-src='%s'", URL::asset($thumbUrl)); + $this->srcset2x = $thumb2xUrl !== null ? sprintf("data-srcset='%s %dw, %s %dw'", URL::asset($thumbUrl), $dim, URL::asset($thumb2xUrl), $dim2x) : ''; + } + + /** + * Fetch the thumbs data. + * + * @param SizeVariants $sizeVariants + * + * @return array{w:int,w2x:int|null,h:int,thumbUrl:string,thumb2xUrl:string|null} + * + * @throws InvalidSizeVariantException + */ + private function setThumbUrls(SizeVariants $sizeVariants): array + { + $small = $sizeVariants->getSizeVariant(SizeVariantType::SMALL); + $small2x = $sizeVariants->getSizeVariant(SizeVariantType::SMALL2X); + $medium = $sizeVariants->getSizeVariant(SizeVariantType::MEDIUM); + $medium2x = $sizeVariants->getSizeVariant(SizeVariantType::MEDIUM2X); + + /** @var int $w */ + $w = $small?->width ?? $medium?->width; + $w2x = $small2x?->width ?? $medium2x?->width; + /** @var int $h */ + $h = $small?->height ?? $medium?->height; + + /** @var string $thumbUrl */ + $thumbUrl = $small?->url ?? $medium?->url; + $thumb2xUrl = $small2x?->url ?? $medium2x?->url; + + return ['w' => $w, 'w2x' => $w2x, 'h' => $h, 'thumbUrl' => $thumbUrl, 'thumb2xUrl' => $thumb2xUrl]; + } + + /** + * Get the view / contents that represent the component. + * + * @return \Illuminate\Contracts\View\View|\Closure|string + * + * @throws BindingResolutionException + */ + public function render() + { + return view('components.gallery.album.thumbs.photo'); + } +} diff --git a/app/View/Components/Gallery/Photo/Overlay.php b/app/View/Components/Gallery/Photo/Overlay.php new file mode 100644 index 00000000000..84382f6dfb2 --- /dev/null +++ b/app/View/Components/Gallery/Photo/Overlay.php @@ -0,0 +1,73 @@ +title = $photo->title ?? ''; + $this->description = $photo->description ?? ''; + $this->is_video = $photo->isVideo(); + $this->is_camera_date = $photo->taken_at !== null; + $this->date = ($photo->taken_at ?? $photo->created_at)->format($date_format) ?? ''; + + $this->make = $photo->make ?? ''; + $this->model = $photo->model ?? ''; + $this->shutter = str_replace('s', 'sec', $photo->shutter ?? ''); + $this->aperture = str_replace('f/', '', $photo->aperture ?? ''); + $this->focal = $photo->focal ?? ''; + $this->iso = $photo->iso ?? ''; + $this->lens = $photo->lens ?? ''; + + if ($this->is_video) { + $this->duration = Helpers::secondsToHMS(intval($photo->aperture)); + $this->fps = $photo->focal ?? ''; + } + } + + /** + * Render the component. + * + * @return View + */ + public function render(): View + { + return view('components.gallery.photo.overlay'); + } +} \ No newline at end of file diff --git a/app/View/Components/Meta.php b/app/View/Components/Meta.php new file mode 100644 index 00000000000..909abae6ef4 --- /dev/null +++ b/app/View/Components/Meta.php @@ -0,0 +1,75 @@ +photoId !== null) { + // $photo = Photo::findOrFail($this->photoId); + // $title = $photo->title; + // $description = $photo->description; + // $imageUrl = url()->to($photo->size_variants->getMedium()?->url ?? $photo->size_variants->getOriginal()->url); + // } elseif ($this->albumId !== null) { + // $albumFactory = resolve(AlbumFactory::class); + // $album = $albumFactory->findAbstractAlbumOrFail($this->albumId, false); + // $title = $album->title; + // $description = $album instanceof BaseAlbum ? $album->description : ''; + // $imageUrl = url()->to($album->thumb->thumbUrl ?? ''); + // } + + $this->pageTitle = $siteTitle . (!blank($siteTitle) && !blank($title) ? ' – ' : '') . $title; + $this->pageDescription = !blank($description) ? $description . ' – via Lychee' : ''; + $this->siteOwner = Configs::getValueAsString('site_owner'); + $this->imageUrl = $imageUrl; + $this->pageUrl = url()->current(); + $this->rssEnable = Configs::getValueAsBool('rss_enable'); + $this->userCssUrl = IndexController::getUserCustomFiles('user.css'); + $this->userJsUrl = IndexController::getUserCustomFiles('custom.js'); + $this->frame = ''; + } + + /** + * Render component. + * + * @return View + * + * @throws BindingResolutionException + */ + public function render(): View + { + return view('components.meta'); + } +} \ No newline at end of file diff --git a/composer.json b/composer.json index 7a963aa3d57..78c473ed38f 100644 --- a/composer.json +++ b/composer.json @@ -49,11 +49,14 @@ "doctrine/dbal": "^3.1", "geocoder-php/cache-provider": "^4.3", "geocoder-php/nominatim-provider": "^5.5", + "graham-campbell/markdown": "^15.0", "laminas/laminas-text": "^2.9", "laragear/webauthn": "^1.2.0", "laravel/framework": "^10.0", + "livewire/livewire": "^3.0", "lychee-org/nestedset": "^8.0", "lychee-org/php-exif": "^1.0.0", + "lychee-org/php-flickr-justified-layout": "^1.1", "maennchen/zipstream-php": "^2.1", "opcodesio/log-viewer": "dev-lycheeOrg", "php-ffmpeg/php-ffmpeg": "^1.0", diff --git a/composer.lock b/composer.lock index 3296ec4d213..d12704bb30c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "59942082cfd20b5aa671346f6d85f574", + "content-hash": "7615e683907220a774694c21da7f8c5c", "packages": [ { "name": "bepsvpt/secure-headers", @@ -375,16 +375,16 @@ }, { "name": "doctrine/dbal", - "version": "3.6.5", + "version": "3.6.6", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "96d5a70fd91efdcec81fc46316efc5bf3da17ddf" + "reference": "63646ffd71d1676d2f747f871be31b7e921c7864" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/96d5a70fd91efdcec81fc46316efc5bf3da17ddf", - "reference": "96d5a70fd91efdcec81fc46316efc5bf3da17ddf", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/63646ffd71d1676d2f747f871be31b7e921c7864", + "reference": "63646ffd71d1676d2f747f871be31b7e921c7864", "shasum": "" }, "require": { @@ -400,10 +400,11 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.21", + "phpstan/phpstan": "1.10.29", "phpstan/phpstan-strict-rules": "^1.5", "phpunit/phpunit": "9.6.9", "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0", @@ -467,7 +468,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.5" + "source": "https://github.com/doctrine/dbal/tree/3.6.6" }, "funding": [ { @@ -483,7 +484,7 @@ "type": "tidelift" } ], - "time": "2023-07-17T09:15:50+00:00" + "time": "2023-08-17T05:38:17+00:00" }, { "name": "doctrine/deprecations", @@ -793,16 +794,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.2", + "version": "v3.3.3", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8" + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/782ca5968ab8b954773518e9e49a6f892a34b2a8", - "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", "shasum": "" }, "require": { @@ -842,7 +843,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.2" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" }, "funding": [ { @@ -850,7 +851,7 @@ "type": "github" } ], - "time": "2022-09-10T18:51:20+00:00" + "time": "2023-08-10T19:36:49+00:00" }, { "name": "egulias/email-validator", @@ -921,28 +922,28 @@ }, { "name": "evenement/evenement", - "version": "v3.0.1", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", "shasum": "" }, "require": { "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9 || ^6" }, "type": "library", "autoload": { - "psr-0": { - "Evenement": "src" + "psr-4": { + "Evenement\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -962,9 +963,9 @@ ], "support": { "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/master" + "source": "https://github.com/igorw/evenement/tree/v3.0.2" }, - "time": "2017-07-23T21:35:13+00:00" + "time": "2023-08-08T05:53:35+00:00" }, { "name": "fruitcake/php-cors", @@ -1272,6 +1273,86 @@ }, "time": "2023-03-01T10:18:27+00:00" }, + { + "name": "graham-campbell/markdown", + "version": "v15.0.0", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Laravel-Markdown.git", + "reference": "3c0bcf904ec02acb1afd0e23e7c170ac5199fc14" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Markdown/zipball/3c0bcf904ec02acb1afd0e23e7c170ac5199fc14", + "reference": "3c0bcf904ec02acb1afd0e23e7c170ac5199fc14", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.75 || ^9.0 || ^10.0", + "illuminate/filesystem": "^8.75 || ^9.0 || ^10.0", + "illuminate/support": "^8.75 || ^9.0 || ^10.0", + "illuminate/view": "^8.75 || ^9.0 || ^10.0", + "league/commonmark": "^2.3.9", + "php": "^7.4.15 || ^8.0.2" + }, + "require-dev": { + "graham-campbell/analyzer": "^4.0", + "graham-campbell/testbench": "^6.0", + "mockery/mockery": "^1.5.1", + "phpunit/phpunit": "^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "GrahamCampbell\\Markdown\\MarkdownServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "GrahamCampbell\\Markdown\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Markdown Is A CommonMark Wrapper For Laravel", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Laravel Markdown", + "Laravel-Markdown", + "common mark", + "commonmark", + "framework", + "laravel", + "markdown" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Laravel-Markdown/issues", + "source": "https://github.com/GrahamCampbell/Laravel-Markdown/tree/v15.0.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/markdown", + "type": "tidelift" + } + ], + "time": "2023-02-26T14:22:13+00:00" + }, { "name": "graham-campbell/result-type", "version": "v1.1.1", @@ -1462,16 +1543,16 @@ }, { "name": "guzzlehttp/promises", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6" + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/3a494dc7dc1d7d12e511890177ae2d0e6c107da6", - "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d", + "reference": "111166291a0f8130081195ac4556a5587d7f1b5d", "shasum": "" }, "require": { @@ -1525,7 +1606,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.0" + "source": "https://github.com/guzzle/promises/tree/2.0.1" }, "funding": [ { @@ -1541,20 +1622,20 @@ "type": "tidelift" } ], - "time": "2023-05-21T13:50:22+00:00" + "time": "2023-08-03T15:11:55+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.5.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6" + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6", - "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", + "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", "shasum": "" }, "require": { @@ -1641,7 +1722,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.5.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.0" }, "funding": [ { @@ -1657,7 +1738,7 @@ "type": "tidelift" } ], - "time": "2023-04-17T16:11:26+00:00" + "time": "2023-08-03T15:06:02+00:00" }, { "name": "guzzlehttp/uri-template", @@ -1745,50 +1826,49 @@ }, { "name": "laminas/laminas-servicemanager", - "version": "3.21.0", + "version": "3.15.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-servicemanager.git", - "reference": "625f2aa3bc6dd02688b2da5155b3a69870812bda" + "reference": "65910ef6a8066b0369fab77fbec9e030be59c866" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/625f2aa3bc6dd02688b2da5155b3a69870812bda", - "reference": "625f2aa3bc6dd02688b2da5155b3a69870812bda", + "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/65910ef6a8066b0369fab77fbec9e030be59c866", + "reference": "65910ef6a8066b0369fab77fbec9e030be59c866", "shasum": "" }, "require": { - "laminas/laminas-stdlib": "^3.17", - "php": "~8.1.0 || ~8.2.0", - "psr/container": "^1.0" + "composer-plugin-api": "^2.0", + "laminas/laminas-stdlib": "^3.2.1", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0", + "psr/container": "^1.1 || ^2.0.2" }, "conflict": { "ext-psr": "*", - "laminas/laminas-code": "<4.10.0", + "laminas/laminas-code": "<3.3.1", "zendframework/zend-code": "<3.3.1", "zendframework/zend-servicemanager": "*" }, "provide": { - "psr/container-implementation": "^1.0" + "psr/container-implementation": "^1.1 || ^2.0" }, "replace": { "container-interop/container-interop": "^1.2.0" }, "require-dev": { - "composer/package-versions-deprecated": "^1.11.99.5", - "friendsofphp/proxy-manager-lts": "^1.0.14", - "laminas/laminas-code": "^4.10.0", - "laminas/laminas-coding-standard": "~2.5.0", - "laminas/laminas-container-config-test": "^0.8", - "laminas/laminas-dependency-plugin": "^2.2", - "mikey179/vfsstream": "^1.6.11", - "phpbench/phpbench": "^1.2.9", - "phpunit/phpunit": "^10.0.17", - "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.8.0" + "laminas/laminas-coding-standard": "~2.3.0", + "laminas/laminas-container-config-test": "^0.6", + "mikey179/vfsstream": "^1.6.10@alpha", + "ocramius/proxy-manager": "^2.11", + "phpbench/phpbench": "^1.1", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5.5", + "psalm/plugin-phpunit": "^0.17.0", + "vimeo/psalm": "^4.8" }, "suggest": { - "friendsofphp/proxy-manager-lts": "ProxyManager ^2.1.1 to handle lazy initialization of services" + "ocramius/proxy-manager": "ProxyManager ^2.1.1 to handle lazy initialization of services" }, "bin": [ "bin/generate-deps-for-config-factory", @@ -1832,7 +1912,7 @@ "type": "community_bridge" } ], - "time": "2023-05-14T12:24:54+00:00" + "time": "2022-07-18T21:18:56+00:00" }, { "name": "laminas/laminas-stdlib", @@ -1895,31 +1975,29 @@ }, { "name": "laminas/laminas-text", - "version": "2.10.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-text.git", - "reference": "40f7acdb284d41553d32db811e704d6e15e415b4" + "reference": "8879e75d03e09b0d6787e6680cfa255afd4645a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-text/zipball/40f7acdb284d41553d32db811e704d6e15e415b4", - "reference": "40f7acdb284d41553d32db811e704d6e15e415b4", + "url": "https://api.github.com/repos/laminas/laminas-text/zipball/8879e75d03e09b0d6787e6680cfa255afd4645a7", + "reference": "8879e75d03e09b0d6787e6680cfa255afd4645a7", "shasum": "" }, "require": { - "laminas/laminas-servicemanager": "^3.19.0", - "laminas/laminas-stdlib": "^3.7.1", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0" + "laminas/laminas-servicemanager": "^3.4", + "laminas/laminas-stdlib": "^3.6", + "php": "^7.3 || ~8.0.0 || ~8.1.0" }, "conflict": { "zendframework/zend-text": "*" }, "require-dev": { - "laminas/laminas-coding-standard": "~2.4.0", - "phpunit/phpunit": "^9.5", - "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.1" + "laminas/laminas-coding-standard": "~1.0.0", + "phpunit/phpunit": "^9.3" }, "type": "library", "autoload": { @@ -1951,7 +2029,7 @@ "type": "community_bridge" } ], - "time": "2022-12-11T15:36:27+00:00" + "time": "2021-09-02T16:50:53+00:00" }, { "name": "laragear/webauthn", @@ -2041,16 +2119,16 @@ }, { "name": "laravel/framework", - "version": "v10.17.0", + "version": "v10.19.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "a0e3f5ac5b6258f6ede9a2a2c5cc3820baea24a2" + "reference": "b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/a0e3f5ac5b6258f6ede9a2a2c5cc3820baea24a2", - "reference": "a0e3f5ac5b6258f6ede9a2a2c5cc3820baea24a2", + "url": "https://api.github.com/repos/laravel/framework/zipball/b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb", + "reference": "b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb", "shasum": "" }, "require": { @@ -2237,25 +2315,25 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-08-01T14:08:45+00:00" + "time": "2023-08-15T13:42:57+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.1", + "version": "v0.1.5", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "309b30157090a63c40152aa912d198d6aeb60ea6" + "reference": "d880a909df144a4bf5760ebd09aba114f79d9adc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/309b30157090a63c40152aa912d198d6aeb60ea6", - "reference": "309b30157090a63c40152aa912d198d6aeb60ea6", + "url": "https://api.github.com/repos/laravel/prompts/zipball/d880a909df144a4bf5760ebd09aba114f79d9adc", + "reference": "d880a909df144a4bf5760ebd09aba114f79d9adc", "shasum": "" }, "require": { "ext-mbstring": "*", - "illuminate/collections": "^10.0", + "illuminate/collections": "^10.0|^11.0", "php": "^8.1", "symfony/console": "^6.2" }, @@ -2283,9 +2361,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.1" + "source": "https://github.com/laravel/prompts/tree/v0.1.5" }, - "time": "2023-07-31T15:03:02+00:00" + "time": "2023-08-15T14:29:44+00:00" }, { "name": "laravel/serializable-closure", @@ -2685,26 +2763,26 @@ }, { "name": "league/mime-type-detection", - "version": "1.11.0", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", - "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/a6dfb1194a2946fcdc1f38219445234f65b35c96", + "reference": "a6dfb1194a2946fcdc1f38219445234f65b35c96", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3" + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" }, "type": "library", "autoload": { @@ -2725,7 +2803,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.13.0" }, "funding": [ { @@ -2737,7 +2815,80 @@ "type": "tidelift" } ], - "time": "2022-04-17T13:12:02+00:00" + "time": "2023-08-05T12:09:49+00:00" + }, + { + "name": "livewire/livewire", + "version": "v3.0.0-beta.10", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "526bda01304b16908d029f2010504957d8c46e05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/526bda01304b16908d029f2010504957d8c46e05", + "reference": "526bda01304b16908d029f2010504957d8c46e05", + "shasum": "" + }, + "require": { + "illuminate/database": "^10.0|^11.0", + "illuminate/support": "^10.0|^11.0", + "illuminate/validation": "^10.0|^11.0", + "league/mime-type-detection": "^1.9", + "php": "^8.1", + "symfony/http-kernel": "^5.0|^6.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^10.0|^11.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^7.0|^8.0", + "orchestra/testbench-dusk": "^7.0|^8.0", + "phpunit/phpunit": "^9.0", + "psy/psysh": "@stable" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v3.0.0-beta.10" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2023-08-19T04:25:59+00:00" }, { "name": "lychee-org/nestedset", @@ -2896,6 +3047,46 @@ }, "time": "2023-04-11T11:03:27+00:00" }, + { + "name": "lychee-org/php-flickr-justified-layout", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/LycheeOrg/php-flickr-justified-layout.git", + "reference": "aab36fcb3704e2f956fb232503a06223a85f76ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/LycheeOrg/php-flickr-justified-layout/zipball/aab36fcb3704e2f956fb232503a06223a85f76ae", + "reference": "aab36fcb3704e2f956fb232503a06223a85f76ae", + "shasum": "" + }, + "require": { + "illuminate/collections": "^10.10" + }, + "require-dev": { + "lychee-org/phpstan-lychee": "^v1.0.1", + "phpunit/phpunit": "^10.2@dev", + "symfony/var-dumper": "6.3.x-dev" + }, + "type": "library", + "autoload": { + "psr-4": { + "Tests\\": "tests/", + "LycheeOrg\\PhpFlickrJustifiedLayout\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Port of the famous flikr justified layout JS gallery to php for serverside computation", + "support": { + "issues": "https://github.com/LycheeOrg/php-flickr-justified-layout/issues", + "source": "https://github.com/LycheeOrg/php-flickr-justified-layout/tree/v1.1.0" + }, + "time": "2023-05-14T18:34:08+00:00" + }, { "name": "maennchen/zipstream-php", "version": "2.4.0", @@ -3140,25 +3331,29 @@ }, { "name": "nesbot/carbon", - "version": "2.68.1", + "version": "2.69.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da" + "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4f991ed2a403c85efbc4f23eb4030063fdbe01da", - "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4308217830e4ca445583a37d1bf4aff4153fa81c", + "reference": "4308217830e4ca445583a37d1bf4aff4153fa81c", "shasum": "" }, "require": { "ext-json": "*", "php": "^7.1.8 || ^8.0", + "psr/clock": "^1.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, + "provide": { + "psr/clock-implementation": "1.0" + }, "require-dev": { "doctrine/dbal": "^2.0 || ^3.1.4", "doctrine/orm": "^2.7", @@ -3238,25 +3433,25 @@ "type": "tidelift" } ], - "time": "2023-06-20T18:29:04+00:00" + "time": "2023-08-03T09:00:52+00:00" }, { "name": "nette/schema", - "version": "v1.2.3", + "version": "v1.2.4", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f" + "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", - "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "url": "https://api.github.com/repos/nette/schema/zipball/c9ff517a53903b3d4e29ec547fb20feecb05b8ab", + "reference": "c9ff517a53903b3d4e29ec547fb20feecb05b8ab", "shasum": "" }, "require": { "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", - "php": ">=7.1 <8.3" + "php": "7.1 - 8.3" }, "require-dev": { "nette/tester": "^2.3 || ^2.4", @@ -3298,9 +3493,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.2.3" + "source": "https://github.com/nette/schema/tree/v1.2.4" }, - "time": "2022-10-13T01:24:26+00:00" + "time": "2023-08-05T18:56:25+00:00" }, { "name": "nette/utils", @@ -4162,24 +4357,77 @@ }, "time": "2021-02-03T23:26:27+00:00" }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, { "name": "psr/container", - "version": "1.1.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -4206,9 +4454,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", @@ -4855,30 +5103,29 @@ }, { "name": "spatie/laravel-feed", - "version": "4.2.1", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-feed.git", - "reference": "0b9b7df3f716c6067b082cd6a985126c2189a6c4" + "reference": "1cf06a43b4ee0fdeb919983a76de68467ccdb844" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-feed/zipball/0b9b7df3f716c6067b082cd6a985126c2189a6c4", - "reference": "0b9b7df3f716c6067b082cd6a985126c2189a6c4", + "url": "https://api.github.com/repos/spatie/laravel-feed/zipball/1cf06a43b4ee0fdeb919983a76de68467ccdb844", + "reference": "1cf06a43b4ee0fdeb919983a76de68467ccdb844", "shasum": "" }, "require": { - "illuminate/contracts": "^8.0|^9.0|^10.0", - "illuminate/http": "^8.0|^9.0|^10.0", - "illuminate/support": "^8.0|^9.0|^10.0", + "illuminate/contracts": "^10.0", + "illuminate/http": "^10.0", + "illuminate/support": "^10.0", "php": "^8.0", - "spatie/laravel-package-tools": "^1.9" + "spatie/laravel-package-tools": "^1.15" }, "require-dev": { - "orchestra/testbench": "^6.23|^7.0|^8.0", - "pestphp/pest": "^1.22", - "phpunit/phpunit": "^9.5", - "spatie/pest-plugin-snapshots": "^1.1", + "orchestra/testbench": "^8.0", + "pestphp/pest": "^2.0", + "spatie/pest-plugin-snapshots": "^2.0", "spatie/test-time": "^1.2" }, "type": "library", @@ -4932,7 +5179,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-feed/tree/4.2.1" + "source": "https://github.com/spatie/laravel-feed/tree/4.3.0" }, "funding": [ { @@ -4944,7 +5191,7 @@ "type": "github" } ], - "time": "2023-01-25T09:39:38+00:00" + "time": "2023-08-07T14:46:53+00:00" }, { "name": "spatie/laravel-image-optimizer", @@ -5016,16 +5263,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.15.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "efab1844b8826443135201c4443690f032c3d533" + "reference": "38fe533e93f86a1b2fb1000bf7df09c4748e6458" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/efab1844b8826443135201c4443690f032c3d533", - "reference": "efab1844b8826443135201c4443690f032c3d533", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/38fe533e93f86a1b2fb1000bf7df09c4748e6458", + "reference": "38fe533e93f86a1b2fb1000bf7df09c4748e6458", "shasum": "" }, "require": { @@ -5064,7 +5311,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.15.0" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.0" }, "funding": [ { @@ -5072,7 +5319,7 @@ "type": "github" } ], - "time": "2023-04-27T08:09:01+00:00" + "time": "2023-08-09T14:08:04+00:00" }, { "name": "spatie/temporary-directory", @@ -7058,33 +7305,29 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.1", + "psr/container": "^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -7094,7 +7337,10 @@ "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7121,7 +7367,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -7137,7 +7383,7 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", @@ -8847,16 +9093,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.22.0", + "version": "v3.23.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3" + "reference": "35af3cbbacfa91e164b252a28ec0b644f1ed4e78" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/92b019f6c8d79aa26349d0db7671d37440dc0ff3", - "reference": "92b019f6c8d79aa26349d0db7671d37440dc0ff3", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/35af3cbbacfa91e164b252a28ec0b644f1ed4e78", + "reference": "35af3cbbacfa91e164b252a28ec0b644f1ed4e78", "shasum": "" }, "require": { @@ -8932,7 +9178,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.22.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.23.0" }, "funding": [ { @@ -8940,7 +9186,7 @@ "type": "github" } ], - "time": "2023-07-16T23:08:06+00:00" + "time": "2023-08-14T12:27:35+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -9178,31 +9424,31 @@ }, { "name": "mockery/mockery", - "version": "1.6.4", + "version": "1.6.6", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "d1413755e26fe56a63455f7753221c86cbb88f66" + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/d1413755e26fe56a63455f7753221c86cbb88f66", - "reference": "d1413755e26fe56a63455f7753221c86cbb88f66", + "url": "https://api.github.com/repos/mockery/mockery/zipball/b8e0bb7d8c604046539c1115994632c74dcb361e", + "reference": "b8e0bb7d8c604046539c1115994632c74dcb361e", "shasum": "" }, "require": { "hamcrest/hamcrest-php": "^2.0.1", "lib-pcre": ">=7.0", - "php": ">=7.4,<8.3" + "php": ">=7.3" }, "conflict": { "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.3", + "phpunit/phpunit": "^8.5 || ^9.6.10", "psalm/plugin-phpunit": "^0.18.4", "symplify/easy-coding-standard": "^11.5.0", - "vimeo/psalm": "^5.13.1" + "vimeo/psalm": "^4.30" }, "type": "library", "autoload": { @@ -9259,7 +9505,7 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2023-07-19T15:51:02+00:00" + "time": "2023-08-09T00:03:52+00:00" }, { "name": "myclabs/deep-copy", @@ -9322,16 +9568,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.16.0", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17", - "reference": "19526a33fb561ef417e822e85f08a00db4059c17", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -9372,9 +9618,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-06-25T14:52:30+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "nunomaduro/larastan", @@ -9695,16 +9941,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.2", + "version": "1.7.3", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d" + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b2fe4d22a5426f38e014855322200b97b5362c0d", - "reference": "b2fe4d22a5426f38e014855322200b97b5362c0d", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", "shasum": "" }, "require": { @@ -9747,9 +9993,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.2" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" }, - "time": "2023-05-30T18:13:47+00:00" + "time": "2023-08-12T11:01:26+00:00" }, { "name": "phpmyadmin/sql-parser", @@ -9840,16 +10086,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.23.0", + "version": "1.23.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "a2b24135c35852b348894320d47b3902a94bc494" + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a2b24135c35852b348894320d47b3902a94bc494", - "reference": "a2b24135c35852b348894320d47b3902a94bc494", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/846ae76eef31c6d7790fac9bc399ecee45160b26", + "reference": "846ae76eef31c6d7790fac9bc399ecee45160b26", "shasum": "" }, "require": { @@ -9881,22 +10127,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.23.1" }, - "time": "2023-07-23T22:17:56+00:00" + "time": "2023-08-03T16:32:59+00:00" }, { "name": "phpstan/phpstan", - "version": "1.10.26", + "version": "1.10.29", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5d660cbb7e1b89253a47147ae44044f49832351f" + "reference": "ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5d660cbb7e1b89253a47147ae44044f49832351f", - "reference": "5d660cbb7e1b89253a47147ae44044f49832351f", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1", + "reference": "ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1", "shasum": "" }, "require": { @@ -9945,25 +10191,25 @@ "type": "tidelift" } ], - "time": "2023-07-19T12:44:37+00:00" + "time": "2023-08-14T13:24:11+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319" + "reference": "089d8a8258ed0aeefdc7b68b6c3d25572ebfdbaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", - "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/089d8a8258ed0aeefdc7b68b6c3d25572ebfdbaa", + "reference": "089d8a8258ed0aeefdc7b68b6c3d25572ebfdbaa", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.10.3" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", @@ -9991,9 +10237,9 @@ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.3" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.4" }, - "time": "2023-03-17T07:50:08+00:00" + "time": "2023-08-05T09:02:04+00:00" }, { "name": "phpstan/phpstan-strict-rules", @@ -10366,16 +10612,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.2.6", + "version": "10.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd" + "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c17815c129f133f3019cc18e8d0c8622e6d9bcd", - "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0dafb1175c366dd274eaa9a625e914451506bcd1", + "reference": "0dafb1175c366dd274eaa9a625e914451506bcd1", "shasum": "" }, "require": { @@ -10400,7 +10646,7 @@ "sebastian/diff": "^5.0", "sebastian/environment": "^6.0", "sebastian/exporter": "^5.0", - "sebastian/global-state": "^6.0", + "sebastian/global-state": "^6.0.1", "sebastian/object-enumerator": "^5.0", "sebastian/recursion-context": "^5.0", "sebastian/type": "^4.0", @@ -10415,7 +10661,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.2-dev" + "dev-main": "10.3-dev" } }, "autoload": { @@ -10447,7 +10693,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.3.2" }, "funding": [ { @@ -10463,7 +10709,7 @@ "type": "tidelift" } ], - "time": "2023-07-17T12:08:28+00:00" + "time": "2023-08-15T05:34:23+00:00" }, { "name": "sebastian/cli-parser", @@ -10634,16 +10880,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c" + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c", - "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", "shasum": "" }, "require": { @@ -10654,7 +10900,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.0" + "phpunit/phpunit": "^10.3" }, "type": "library", "extra": { @@ -10698,7 +10944,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" }, "funding": [ { @@ -10706,7 +10953,7 @@ "type": "github" } ], - "time": "2023-02-03T07:07:16+00:00" + "time": "2023-08-14T13:18:12+00:00" }, { "name": "sebastian/complexity", diff --git a/config/app.php b/config/app.php index a9ad42350de..36f017bea11 100644 --- a/config/app.php +++ b/config/app.php @@ -30,6 +30,18 @@ 'env' => env('APP_ENV', 'production'), + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines whether livewire front-end is enabled as it is + | currently under development. + | + */ + + 'livewire' => (bool) env('LIVEWIRE_ENABLED', false), + /* |-------------------------------------------------------------------------- | Application Debug Mode @@ -243,5 +255,14 @@ 'aliases' => Facade::defaultAliases()->merge([ 'DebugBar' => Barryvdh\Debugbar\Facades\Debugbar::class, 'Helpers' => App\Facades\Helpers::class, + // Aliases for easier access in the blade templates + 'Configs' => App\Models\Configs::class, + 'AlbumPolicy' => App\Policies\AlbumPolicy::class, + 'PhotoPolicy' => App\Policies\PhotoPolicy::class, + 'SettingsPolicy' => App\Policies\SettingsPolicy::class, + 'UserPolicy' => App\Policies\UserPolicy::class, + 'User' => App\Models\User::class, + 'SizeVariantType' => App\Enum\SizeVariantType::class, + 'PageMode' => App\Enum\Livewire\PageMode::class, ])->toArray(), ]; diff --git a/config/livewire.php b/config/livewire.php new file mode 100644 index 00000000000..34c2550b9ec --- /dev/null +++ b/config/livewire.php @@ -0,0 +1,133 @@ + 'App\\Livewire\\Components', + + /* + |--------------------------------------------------------------------------- + | View Path + |--------------------------------------------------------------------------- + | + | This value is used to specify where Livewire component Blade templates are + | stored when running file creation commands like `artisan make:livewire`. + | It is also used if you choose to omit a component's render() method. + | + */ + + 'view_path' => resource_path('views/livewire'), + + /* + |--------------------------------------------------------------------------- + | Layout + |--------------------------------------------------------------------------- + | The view that will be used as the layout when rendering a single component + | as an entire page via `Route::get('/post/create', CreatePost::class);`. + | In this case, the view returned by CreatePost will render into $slot. + | + */ + + 'layout' => 'components.layouts.app', + + /* + |--------------------------------------------------------------------------- + | Temporary File Uploads + |--------------------------------------------------------------------------- + | + | Livewire handles file uploads by storing uploads in a temporary directory + | before the file is stored permanently. All file uploads are directed to + | a global endpoint for temporary storage. You may configure this below: + | + */ + + 'temporary_file_upload' => [ + 'disk' => null, // Example: 'local', 's3' | Default: 'default' + 'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB) + 'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp' + 'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1' + 'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs... + 'png', 'gif', 'bmp', 'svg', 'wav', 'mp4', + 'mov', 'avi', 'wmv', 'mp3', 'm4a', + 'jpg', 'jpeg', 'mpga', 'webp', 'wma', + ], + 'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated... + ], + + /* + |--------------------------------------------------------------------------- + | Render On Redirect + |--------------------------------------------------------------------------- + | + | This value determines if Livewire will run a component's `render()` method + | after a redirect has been triggered using something like `redirect(...)` + | Setting this to true will render the view once more before redirecting + | + */ + + 'render_on_redirect' => false, + + /* + |--------------------------------------------------------------------------- + | Eloquent Model Binding + |--------------------------------------------------------------------------- + | + | Previous versions of Livewire supported binding directly to eloquent model + | properties using wire:model by default. However, this behavior has been + | deemed too "magical" and has therefore been put under a feature flag. + | + */ + + 'legacy_model_binding' => false, + + /* + |--------------------------------------------------------------------------- + | Auto-inject Frontend Assets + |--------------------------------------------------------------------------- + | + | By default, Livewire automatically injects its JavaScript and CSS into the + | and of pages containing Livewire components. By disabling + | this behavior, you need to use @livewireStyles and @livewireScripts. + | + */ + + 'inject_assets' => true, + + /* + |--------------------------------------------------------------------------- + | Navigate (SPA mode) + |--------------------------------------------------------------------------- + | + | By adding `wire:navigate` to links in your Livewire application, Livewire + | will prevent the default link handling and instead request those pages + | via AJAX, creating an SPA-like effect. Configure this behavior here. + | + */ + + 'navigate' => [ + 'show_progress_bar' => true, + ], + + /* + |--------------------------------------------------------------------------- + | HTML Morph Markers + |--------------------------------------------------------------------------- + | + | Livewire intelligently "morphs" existing HTML into the newly rendered HTML + | after each update. To make this process more reliable, Livewire injects + | "markers" into the rendered Blade surrounding @if, @class & @foreach. + | + */ + + 'inject_morph_markers' => true, +]; diff --git a/config/markdown.php b/config/markdown.php index 48257c88511..a2f2a5de05f 100644 --- a/config/markdown.php +++ b/config/markdown.php @@ -5,7 +5,7 @@ /* * This file is part of Laravel Markdown. * - * (c) Graham Campbell + * (c) Graham Campbell * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -37,11 +37,17 @@ | This option specifies what extensions will be automatically enabled. | Simply provide your extension class names here. | - | Default: [] + | Default: [ + | League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension::class, + | League\CommonMark\Extension\Table\TableExtension::class, + | ] | */ - 'extensions' => [], + 'extensions' => [ + League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension::class, + League\CommonMark\Extension\Table\TableExtension::class, + ], /* |-------------------------------------------------------------------------- @@ -66,55 +72,28 @@ /* |-------------------------------------------------------------------------- - | Enable Em Tag Parsing - |-------------------------------------------------------------------------- - | - | This option specifies if `` parsing is enabled. - | - | Default: true - | - */ - - 'enable_em' => true, - - /* - |-------------------------------------------------------------------------- - | Enable Strong Tag Parsing + | Commonmark Configuration |-------------------------------------------------------------------------- | - | This option specifies if `` parsing is enabled. - | - | Default: true - | - */ - - 'enable_strong' => true, - - /* - |-------------------------------------------------------------------------- - | Enable Asterisk Parsing - |-------------------------------------------------------------------------- - | - | This option specifies if `*` should be parsed for emphasis. - | - | Default: true + | This option specifies an array of options for commonmark. | - */ - - 'use_asterisk' => true, - - /* - |-------------------------------------------------------------------------- - | Enable Underscore Parsing - |-------------------------------------------------------------------------- - | - | This option specifies if `_` should be parsed for emphasis. - | - | Default: true + | Default: [ + | 'enable_em' => true, + | 'enable_strong' => true, + | 'use_asterisk' => true, + | 'use_underscore' => true, + | 'unordered_list_markers' => ['-', '+', '*'], + | ] | */ - 'use_underscore' => true, + 'commonmark' => [ + 'enable_em' => true, + 'enable_strong' => true, + 'use_asterisk' => true, + 'use_underscore' => true, + 'unordered_list_markers' => ['-', '+', '*'], + ], /* |-------------------------------------------------------------------------- @@ -149,10 +128,29 @@ | | This option specifies the maximum permitted block nesting level. | - | Default: INF + | Default: PHP_INT_MAX | */ - 'max_nesting_level' => INF, + 'max_nesting_level' => PHP_INT_MAX, + + /* + |-------------------------------------------------------------------------- + | Slug Normalizer + |-------------------------------------------------------------------------- + | + | This option specifies an array of options for slug normalization. + | + | Default: [ + | 'max_length' => 255, + | 'unique' => 'document', + | ] + | + */ + + 'slug_normalizer' => [ + 'max_length' => 255, + 'unique' => 'document', + ], -]; +]; \ No newline at end of file diff --git a/database/migrations/2023_08_06_110932_add_date_display_configurations.php b/database/migrations/2023_08_06_110932_add_date_display_configurations.php new file mode 100644 index 00000000000..324ff456697 --- /dev/null +++ b/database/migrations/2023_08_06_110932_add_date_display_configurations.php @@ -0,0 +1,88 @@ + 'date_format_photo_thumb', + 'value' => 'M j, Y, g:i:s A e', + 'confidentiality' => '0', + 'cat' => self::GALLERY, + 'type_range' => self::STRING_REQ, + 'description' => 'Format the date for the photo thumbs. See https://www.php.net/manual/en/datetime.format.php', + ], + [ + 'key' => 'date_format_photo_overlay', + 'value' => 'M j, Y, g:i:s A e', + 'confidentiality' => '0', + 'cat' => self::GALLERY, + 'type_range' => self::STRING_REQ, + 'description' => 'Format the date for the photo overlay. See https://www.php.net/manual/en/datetime.format.php', + ], + [ + 'key' => 'date_format_sidebar_uploaded', + 'value' => 'M j, Y, g:i:s A e', + 'confidentiality' => '0', + 'cat' => self::GALLERY, + 'type_range' => self::STRING_REQ, + 'description' => 'Format the upload date for the photo sidebar. See https://www.php.net/manual/en/datetime.format.php', + ], + [ + 'key' => 'date_format_sidebar_taken_at', + 'value' => 'M j, Y, g:i:s A e', + 'confidentiality' => '0', + 'cat' => self::GALLERY, + 'type_range' => self::STRING_REQ, + 'description' => 'Format the capture date for the photo sidebar. See https://www.php.net/manual/en/datetime.format.php', + ], + [ + 'key' => 'date_format_hero_min_max', + 'value' => 'F Y', + 'confidentiality' => '0', + 'cat' => self::GALLERY, + 'type_range' => self::STRING_REQ, + 'description' => 'Format the date for the album hero. See https://www.php.net/manual/en/datetime.format.php', + ], + [ + 'key' => 'date_format_hero_created_at', + 'value' => 'M j, Y, g:i:s A T', + 'confidentiality' => '0', + 'cat' => self::GALLERY, + 'type_range' => self::STRING_REQ, + 'description' => 'Format the created date for the album details. See https://www.php.net/manual/en/datetime.format.php', + ], + [ + 'key' => 'date_format_album_thumb', + 'value' => 'M Y', + 'confidentiality' => '0', + 'cat' => self::GALLERY, + 'type_range' => self::STRING_REQ, + 'description' => 'Format the date for the album thumbs. See https://www.php.net/manual/en/datetime.format.php', + ], + ]; + + /** + * Run the migrations. + * + * @return void + */ + public function up(): void + { + DB::table('configs')->insert(self::CONFIGS); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + $keys = collect(self::CONFIGS)->map(fn ($v) => $v['key'])->all(); + + DB::table('configs')->whereIn('key', $keys)->delete(); + } +}; diff --git a/lang/cz/lychee.php b/lang/cz/lychee.php index c7ad4546bd3..00bc7ea0902 100644 --- a/lang/cz/lychee.php +++ b/lang/cz/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Heslo', 'ENTER' => 'Vložit', 'CANCEL' => 'Storno', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Příhlásit se', 'CLOSE' => 'Zavřít', 'SETTINGS' => 'Nastavení', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Uživatelé', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'O Lychee', 'DIAGNOSTICS' => 'Diagnostika', 'DIAGNOSTICS_GET_SIZE' => 'Request space usage', + 'JOBS' => 'Show job history', 'LOGS' => 'Protokoly', 'SIGN_OUT' => 'Odhlásit se', 'UPDATE_AVAILABLE' => 'Update je k dispozici!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Funkce Mapy byla v nastavení deaktivována.', 'ERROR_SEARCH_DEACTIVATED' => 'Funkce hledání byla v nastavení deaktivována.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Opakovat', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/de/lychee.php b/lang/de/lychee.php index 514bf4c18ab..86aafd0bf7a 100644 --- a/lang/de/lychee.php +++ b/lang/de/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Kennwort', 'ENTER' => 'Eingabe', 'CANCEL' => 'Abbrechen', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Anmelden', 'CLOSE' => 'Schließen', 'SETTINGS' => 'Einstellungen', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallerie', 'USERS' => 'Benutzer', + 'PROFILE' => 'Profile', 'CREATE' => 'Erstellen', 'REMOVE' => 'Entfernen', 'SHARE' => 'Freigeben', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Über Lychee', 'DIAGNOSTICS' => 'Diagnose', 'DIAGNOSTICS_GET_SIZE' => 'Speicherplatz-Nutzung abrufen', + 'JOBS' => 'Show job history', 'LOGS' => 'Logs anzeigen', 'SIGN_OUT' => 'Abmelden', 'UPDATE_AVAILABLE' => 'Update verfügbar!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Karten sind unter Einstellungen deaktiviert worden.', 'ERROR_SEARCH_DEACTIVATED' => 'Suchfunktion wurde unter Einstellungen deaktiviert.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Noch einmal versuchen', 'OVERRIDE' => 'Überschreiben', 'TAGS_OVERRIDE_INFO' => 'Wenn das nicht aktiviert ist, werden die Tags zu den vorhandenen Tags des Fotos hinzugefügt.', diff --git a/lang/el/lychee.php b/lang/el/lychee.php index 4c8b3b9b2cb..a79eb49a3cb 100644 --- a/lang/el/lychee.php +++ b/lang/el/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Κωδικός πρόσβασης', 'ENTER' => 'Είσοδος', 'CANCEL' => 'Άκυρο', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Συνδεθείτε', 'CLOSE' => 'Κλείσιμο', 'SETTINGS' => 'Ρυθμίσεις', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Χρήστες', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Περί Lychee', 'DIAGNOSTICS' => 'Διαγνωστικά', 'DIAGNOSTICS_GET_SIZE' => 'Request space usage', + 'JOBS' => 'Show job history', 'LOGS' => 'Εμφάνιση Καταγραφών', 'SIGN_OUT' => 'Αποσύνδεση', 'UPDATE_AVAILABLE' => 'Διαθέσιμη Ενημέρωση!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Map functionality has been deactivated under settings.', 'ERROR_SEARCH_DEACTIVATED' => 'Search functionality has been deactivated under settings.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Προσπάθεια ξανά', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/en/lychee.php b/lang/en/lychee.php index fe52f678577..2697b5cc9a8 100644 --- a/lang/en/lychee.php +++ b/lang/en/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Password', 'ENTER' => 'Enter', 'CANCEL' => 'Cancel', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Sign In', 'CLOSE' => 'Close', 'SETTINGS' => 'Settings', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Users', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'About Lychee', 'DIAGNOSTICS' => 'Diagnostics', 'DIAGNOSTICS_GET_SIZE' => 'Request space usage', + 'JOBS' => 'Show job history', 'LOGS' => 'Show Logs', 'SIGN_OUT' => 'Sign Out', 'UPDATE_AVAILABLE' => 'Update available!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Map functionality has been deactivated under settings.', 'ERROR_SEARCH_DEACTIVATED' => 'Search functionality has been deactivated under settings.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Retry', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/es/lychee.php b/lang/es/lychee.php index 40f2ed59af9..780aac4b38e 100644 --- a/lang/es/lychee.php +++ b/lang/es/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Contraseña', 'ENTER' => 'Entrar', 'CANCEL' => 'Cancelar', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Iniciar sesión', 'CLOSE' => 'Cerrar', 'SETTINGS' => 'Configuraciones', @@ -16,6 +17,7 @@ 'GALLERY' => 'Galería', 'USERS' => 'Usuarios', + 'PROFILE' => 'Profile', 'CREATE' => 'Crear', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Acerca de Lychee', 'DIAGNOSTICS' => 'Diagnóstico', 'DIAGNOSTICS_GET_SIZE' => 'Pedir uso de espacio', + 'JOBS' => 'Show job history', 'LOGS' => 'Mostrar Registros', 'SIGN_OUT' => 'Cerrar Sesión', 'UPDATE_AVAILABLE' => '¡Actualización disponible!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'La funcionalidad del mapa se ha desactivado en la configuración.', 'ERROR_SEARCH_DEACTIVATED' => 'La función de búsqueda se ha desactivado en la configuración.', 'SUCCESS' => 'Vale', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Procesar de nuevo', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/fr/lychee.php b/lang/fr/lychee.php index 413dab30ef6..8e6be9cde04 100644 --- a/lang/fr/lychee.php +++ b/lang/fr/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Mot de passe', 'ENTER' => 'OK', 'CANCEL' => 'Annuler', + 'CONFIRM' => 'Confirmer', 'SIGN_IN' => 'Connexion', 'CLOSE' => 'Fermer', 'SETTINGS' => 'Paramètres', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Utilisateurs', + 'PROFILE' => 'Profil', 'CREATE' => 'Créer', 'REMOVE' => 'Retirer', 'SHARE' => 'Partager', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'À propos de Lychee', 'DIAGNOSTICS' => 'Diagnostiques', 'DIAGNOSTICS_GET_SIZE' => 'Calculer l’espace utilisé', + 'JOBS' => 'Afficher l’historique des Jobs', 'LOGS' => 'Afficher les logs', 'SIGN_OUT' => 'Déconnexion', 'UPDATE_AVAILABLE' => 'Une mise-à-jour est disponible !', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'La carte a été désactivée dans les paramètres.', 'ERROR_SEARCH_DEACTIVATED' => 'La recherche a été désactivée dans les paramètres.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Changement réussi.', 'RETRY' => 'Réessayer', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/hu/lychee.php b/lang/hu/lychee.php index 7bd89d6bfa1..94211b65deb 100644 --- a/lang/hu/lychee.php +++ b/lang/hu/lychee.php @@ -5,6 +5,7 @@ 'PASSWORD' => 'Jelszó', 'ENTER' => 'Belépés', 'CANCEL' => 'Mégse', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Bejelentkezés', 'CLOSE' => 'Bezárás', 'SETTINGS' => 'Beállítások', @@ -14,6 +15,7 @@ 'GALLERY' => 'Galéria', 'USERS' => 'Felhasználók', + 'PROFILE' => 'Profile', 'CREATE' => 'Létrehozás', 'REMOVE' => 'Törlés', 'SHARE' => 'Megosztás', @@ -26,6 +28,7 @@ 'ABOUT_LYCHEE' => 'A Lychee-ről', 'DIAGNOSTICS' => 'Diagnosztika', 'DIAGNOSTICS_GET_SIZE' => 'Térhasználat lekérése', + 'JOBS' => 'Show job history', 'LOGS' => 'Naplók megtekintése', 'SIGN_OUT' => 'Kijelentkezés', 'UPDATE_AVAILABLE' => 'Frissítés elérhető!', @@ -278,6 +281,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Térkép funkció letiltva a beállításokban.', 'ERROR_SEARCH_DEACTIVATED' => 'Keresési funkció letiltva a beállításokban.', 'SUCCESS' => 'Rendben', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Újra', 'OVERRIDE' => 'Felülbírálás', 'TAGS_OVERRIDE_INFO' => 'Ha ez nincs bejelölve, a címkéket hozzáadják a fénykép meglévő címkéihez.', diff --git a/lang/it/lychee.php b/lang/it/lychee.php index a562eeb3a8d..462d7e5cc3c 100644 --- a/lang/it/lychee.php +++ b/lang/it/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Password', 'ENTER' => 'Invia', 'CANCEL' => 'Annulla', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Entra', 'CLOSE' => 'Chiudi', 'SETTINGS' => 'Impostazioni', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Utenti', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Informazioni su Lychee', 'DIAGNOSTICS' => 'Diagnostica', 'DIAGNOSTICS_GET_SIZE' => 'Request space usage', + 'JOBS' => 'Show job history', 'LOGS' => 'Visualizza Log', 'SIGN_OUT' => 'Esci', 'UPDATE_AVAILABLE' => 'Aggiornamento disponibile!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Map functionality has been deactivated under settings.', 'ERROR_SEARCH_DEACTIVATED' => 'Search functionality has been deactivated under settings.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Riprova', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/nl/lychee.php b/lang/nl/lychee.php index 92bfc89d8d6..b2e246afbbe 100644 --- a/lang/nl/lychee.php +++ b/lang/nl/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Wachtwoord', 'ENTER' => 'Enter', 'CANCEL' => 'Annuleer', + 'CONFIRM' => 'Doe maar', 'SIGN_IN' => 'Log in', 'CLOSE' => 'Sluit', 'SETTINGS' => 'Settings', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Users', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Over Lychee', 'DIAGNOSTICS' => 'Diagnostics', 'DIAGNOSTICS_GET_SIZE' => 'Request space usage', + 'JOBS' => 'Show job history', 'LOGS' => 'Laat logs zien', 'SIGN_OUT' => 'Log uit', 'UPDATE_AVAILABLE' => 'Update beschikbaar!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Map functionality has been deactivated under settings.', 'ERROR_SEARCH_DEACTIVATED' => 'Search functionality has been deactivated under settings.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Probeer opnieuw', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/no/lychee.php b/lang/no/lychee.php index 199338b4450..981635d64ed 100644 --- a/lang/no/lychee.php +++ b/lang/no/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Passord', 'ENTER' => 'Stig inn', 'CANCEL' => 'Avbryt', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Logg inn', 'CLOSE' => 'Lukk', 'SETTINGS' => 'Innstillinger', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Brukere', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Om Lychee', 'DIAGNOSTICS' => 'Diagnostikk', 'DIAGNOSTICS_GET_SIZE' => 'Hent diskbruk', + 'JOBS' => 'Show job history', 'LOGS' => 'Vis Logg', 'SIGN_OUT' => 'Logg Ut', 'UPDATE_AVAILABLE' => 'Oppdatering er tilgjengelig!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Kartfunksjoner har blitt deaktivert under innstillinger', 'ERROR_SEARCH_DEACTIVATED' => 'Søkefunksjoner har blitt deaktivert under innstillinger', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Prøv igjen', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/pl/lychee.php b/lang/pl/lychee.php index 2b58c23402c..2f228b7961b 100644 --- a/lang/pl/lychee.php +++ b/lang/pl/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Hasło', 'ENTER' => 'Potwierdź', 'CANCEL' => 'Anuluj', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Zaloguj', 'CLOSE' => 'Zamknij', 'SETTINGS' => 'Ustawienia', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Użytkownicy', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'O Lychee', 'DIAGNOSTICS' => 'Informacje techniczne', 'DIAGNOSTICS_GET_SIZE' => 'Analiza miejsca na dysku', + 'JOBS' => 'Show job history', 'LOGS' => 'Logi', 'SIGN_OUT' => 'Wyloguj', 'UPDATE_AVAILABLE' => 'Dostępna aktualizacja!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Funkcja mapy została wyłączona w ustawieniach.', 'ERROR_SEARCH_DEACTIVATED' => 'Funkcja wyszkukiwania została wyłączona w ustawieniach.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Ponów', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/pt/lychee.php b/lang/pt/lychee.php index a2f4e0ab5fc..bdd36c372c3 100644 --- a/lang/pt/lychee.php +++ b/lang/pt/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Password', 'ENTER' => 'Inserir', 'CANCEL' => 'Cancelar', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Iniciar Sessão', 'CLOSE' => 'Fechar', 'SETTINGS' => 'Configurações', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Utilizadores', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Acerca do Lychee', 'DIAGNOSTICS' => 'Diagnosticos', 'DIAGNOSTICS_GET_SIZE' => 'Pedir utilização de espaço', + 'JOBS' => 'Show job history', 'LOGS' => 'Mostrar Logs', 'SIGN_OUT' => 'Terminar Sessão', 'UPDATE_AVAILABLE' => 'Atualização disponível!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'A funcionalidade do mapa foi desativada nas configurações.', 'ERROR_SEARCH_DEACTIVATED' => 'A funcionalidade de procura foi desativada nas configurações.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Tentar de novo', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/ru/lychee.php b/lang/ru/lychee.php index 6621ff5e8af..e7265abd614 100644 --- a/lang/ru/lychee.php +++ b/lang/ru/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Пароль', 'ENTER' => 'Enter', 'CANCEL' => 'Отмена', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Вход', 'CLOSE' => 'Закрыть', 'SETTINGS' => 'Параметры', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Пользователи', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'О Lychee', 'DIAGNOSTICS' => 'Диагностика', 'DIAGNOSTICS_GET_SIZE' => 'Request space usage', + 'JOBS' => 'Show job history', 'LOGS' => 'Логи', 'SIGN_OUT' => 'Выход', 'UPDATE_AVAILABLE' => 'Доступно обновление!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Map functionality has been deactivated under settings.', 'ERROR_SEARCH_DEACTIVATED' => 'Search functionality has been deactivated under settings.', 'SUCCESS' => 'Ок', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Повторить', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/sk/lychee.php b/lang/sk/lychee.php index 197a412f091..3f190c263d0 100644 --- a/lang/sk/lychee.php +++ b/lang/sk/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Heslo', 'ENTER' => 'Zadať', 'CANCEL' => 'Prerušiť', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Prihlásiť', 'CLOSE' => 'Zatvoriť', 'SETTINGS' => 'Nastavenia', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Užívatelia', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'O Lychee', 'DIAGNOSTICS' => 'Diagnostika', 'DIAGNOSTICS_GET_SIZE' => 'Request space usage', + 'JOBS' => 'Show job history', 'LOGS' => 'Protokoly', 'SIGN_OUT' => 'Odhlásiť', 'UPDATE_AVAILABLE' => 'Update je k dispozícii!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Map functionality has been deactivated under settings.', 'ERROR_SEARCH_DEACTIVATED' => 'Search functionality has been deactivated under settings.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Opakovať', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/sv/lychee.php b/lang/sv/lychee.php index 8526f335299..92ede99b28a 100644 --- a/lang/sv/lychee.php +++ b/lang/sv/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Lösenord', 'ENTER' => 'Stig in', 'CANCEL' => 'Avbryt', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Logga in', 'CLOSE' => 'Stäng', 'SETTINGS' => 'Settings', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Users', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Om Lychee', 'DIAGNOSTICS' => 'Diagnostik', 'DIAGNOSTICS_GET_SIZE' => 'Request space usage', + 'JOBS' => 'Show job history', 'LOGS' => 'Visa logfilen', 'SIGN_OUT' => 'Logga ut', 'UPDATE_AVAILABLE' => 'En uppdatering finns!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Map functionality has been deactivated under settings.', 'ERROR_SEARCH_DEACTIVATED' => 'Search functionality has been deactivated under settings.', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Försök igen', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/vi/lychee.php b/lang/vi/lychee.php index 528d87d3263..384b6c74ab1 100644 --- a/lang/vi/lychee.php +++ b/lang/vi/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => 'Mật khẩu', 'ENTER' => 'Ok', 'CANCEL' => 'Bỏ', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => 'Đăng nhập', 'CLOSE' => 'Đóng', 'SETTINGS' => 'Cài đặt', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => 'Người dùng', + 'PROFILE' => 'Profile', 'CREATE' => 'Tạo', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => 'Giới thiệu Lychee', 'DIAGNOSTICS' => 'Thông tin hệ thống', 'DIAGNOSTICS_GET_SIZE' => 'Xem dung lượng đã dùng', + 'JOBS' => 'Show job history', 'LOGS' => 'Xem nhật ký thay đổi', 'SIGN_OUT' => 'Thoát', 'UPDATE_AVAILABLE' => 'Có phiên bản mới!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => 'Tính năng hiển thị bản đồ đã tắt trong phần cài đặt.', 'ERROR_SEARCH_DEACTIVATED' => 'Tính năng tìm kiếm đã tắt trong phần cài đặt', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => 'Thử lại', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/zh_CN/lychee.php b/lang/zh_CN/lychee.php index 8f016fab636..8299aeb33d4 100644 --- a/lang/zh_CN/lychee.php +++ b/lang/zh_CN/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => '密码', 'ENTER' => '确定', 'CANCEL' => '取消', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => '登录', 'CLOSE' => '关闭', 'SETTINGS' => '设置', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => '用户', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => '关于 Lychee', 'DIAGNOSTICS' => '诊断', 'DIAGNOSTICS_GET_SIZE' => '请求空间占用信息', + 'JOBS' => 'Show job history', 'LOGS' => '查看日志', 'SIGN_OUT' => '注销登录', 'UPDATE_AVAILABLE' => '可用更新!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => '地图功能已在设置中停用。', 'ERROR_SEARCH_DEACTIVATED' => '搜索功能已在设置中停用。', 'SUCCESS' => 'OK', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => '重试', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/lang/zh_TW/lychee.php b/lang/zh_TW/lychee.php index 1a794a6f1f5..ab8ae21526f 100644 --- a/lang/zh_TW/lychee.php +++ b/lang/zh_TW/lychee.php @@ -7,6 +7,7 @@ 'PASSWORD' => '密碼', 'ENTER' => '確定', 'CANCEL' => '取消', + 'CONFIRM' => 'Confirm', 'SIGN_IN' => '登入', 'CLOSE' => '關閉', 'SETTINGS' => '設定', @@ -16,6 +17,7 @@ 'GALLERY' => 'Gallery', 'USERS' => '使用者', + 'PROFILE' => 'Profile', 'CREATE' => 'Create', 'REMOVE' => 'Remove', 'SHARE' => 'Share', @@ -28,6 +30,7 @@ 'ABOUT_LYCHEE' => '關於Lychee', 'DIAGNOSTICS' => '診斷', 'DIAGNOSTICS_GET_SIZE' => '請求空間使用', + 'JOBS' => 'Show job history', 'LOGS' => '查看日誌', 'SIGN_OUT' => '登出', 'UPDATE_AVAILABLE' => '可用更新!', @@ -280,6 +283,7 @@ 'ERROR_MAP_DEACTIVATED' => '地圖功能已被設為停用。', 'ERROR_SEARCH_DEACTIVATED' => '搜索功能已在設為停用。', 'SUCCESS' => '好', + 'CHANGE_SUCCESS' => 'Change successful.', 'RETRY' => '重試', 'OVERRIDE' => 'Override', 'TAGS_OVERRIDE_INFO' => 'If this is unchecked, the tags will be added to the existing tags of the photo.', diff --git a/package-lock.json b/package-lock.json index 3c8e82806cf..c1a550a9056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15968 +1,1405 @@ { "name": "Lychee", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { - "devDependencies": { - "axios": "^0.27.2", - "laravel-mix": "^6.0.6", - "lodash": "^4.17.19", - "postcss": "^8.1.14", - "resolve-url-loader": "^5.0.0", - "sass": "^1.32.11", - "sass-loader": "^13.0.2" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "lazysizes": "^5.3.2", + "mousetrap": "^1.6.5", + "mousetrap-global-bind": "^1.1.0" }, - "engines": { - "node": ">=6.0.0" + "devDependencies": { + "autoprefixer": "^10.4.14", + "axios": "^1.1.2", + "laravel-vite-plugin": "^0.7.5", + "postcss": "^8.4.24", + "tailwindcss": "^3.3.2", + "vite": "^4.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==", + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, "engines": { - "node": ">=6.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", + "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": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=6.0.0" } }, - "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==", + "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, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", - "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", + "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, - "dependencies": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.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==", + "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.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "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" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, - "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==", + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@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": { - "@babel/types": "^7.18.6" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "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==", + "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, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 8" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "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": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 8" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 8" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=6.9.0" + "node": "^10 || ^12 || >=14" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "postcss": "^8.1.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dev": true, "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" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/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/@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==", + "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": ">=6.9.0" + "node": ">=8" } }, - "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==", + "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": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "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": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "fill-range": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "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==", + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "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": { - "@babel/types": "^7.18.6" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=6.9.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, - "dependencies": { - "@babel/types": "^7.18.9" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "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==", + "node_modules/caniuse-lite": { + "version": "1.0.30001509", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz", + "integrity": "sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==", + "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/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": { - "@babel/types": "^7.18.6" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "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, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "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==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.8" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "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, - "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/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/@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "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, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, "engines": { - "node": ">=6.9.0" + "node": ">=0.4.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true }, - "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "node_modules/electron-to-chromium": { + "version": "1.4.445", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.445.tgz", + "integrity": "sha512-++DB+9VK8SBJwC+X1zlMfJ1tMA3F0ipi39GdEp+x3cV2TyBihqAgad8cNMWtLDEkbH39nlDQP7PfGrDr3Dr7HA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "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.9.0" + "node": ">=6" } }, - "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==", + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "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, "dependencies": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 6" } }, - "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "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": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" + "reusify": "^1.0.4" } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "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": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "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, - "dependencies": { - "color-convert": "^1.9.0" - }, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">=4" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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, - "dependencies": { - "color-name": "1.1.3" + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" } }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "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/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } + "node_modules/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/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=4" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", + "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, - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "is-glob": "^4.0.3" }, "engines": { - "node": ">=6.0.0" + "node": ">=10.13.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==", + "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": { - "@babel/helper-plugin-utils": "^7.18.6" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 0.4.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "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": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-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": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "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==", + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "has": "^1.0.3" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "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, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "node": ">=0.10.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==", + "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": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.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==", + "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, - "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": ">=0.12.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==", + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "jiti": "bin/jiti.js" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "node_modules/laravel-vite-plugin": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-0.7.8.tgz", + "integrity": "sha512-HWYqpQYHR3kEQ1LsHX7gHJoNNf0bz5z5mDaHBLzS+PGLCTmYqlU5/SZyeEgObV7z7bC/cnStYcY9H1DI1D5Udg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "picocolors": "^1.0.0", + "vite-plugin-full-reload": "^1.0.5" }, "engines": { - "node": ">=6.9.0" + "node": ">=14" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "vite": "^3.0.0 || ^4.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==", + "node_modules/lazysizes": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.3.2.tgz", + "integrity": "sha512-22UzWP+Vedi/sMeOr8O7FWimRVtiNJV2HCa+V8+peZOw6QbswN9k58VUhd7i6iK5bw5QkYrF01LJbeJe0PV8jg==" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "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": ">=10" } }, - "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==", + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 8" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "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": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8.6" } }, - "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==", + "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, - "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": ">= 0.6" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "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": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "mime-db": "1.52.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 0.6" } }, - "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==", + "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": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" - }, + "node": "*" + } + }, + "node_modules/mousetrap": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", + "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" + }, + "node_modules/mousetrap-global-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mousetrap-global-bind/-/mousetrap-global-bind-1.1.0.tgz", + "integrity": "sha512-AfxKB0OYc/wU66E2n2HXcZmKHrd5O/6mEdtSrZAt3tsMqcpcpYAolQdj602L0SgrP38ncm/6iOpxr9SIGgxOpQ==", "peerDependencies": { - "@babel/core": "^7.0.0-0" + "mousetrap": "^1.6.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.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==", + "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, - "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, - "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" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" }, "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": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "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/node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.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==", + "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=0.10.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==", + "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==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=0.10.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==", + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 6" } }, - "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==", + "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": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "wrappy": "1" } }, - "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==", + "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=0.10.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/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/@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/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/@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==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">= 6" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, + "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": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.0.0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "camelcase-css": "^2.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4.21" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "postcss-selector-parser": "^6.0.11" }, "engines": { - "node": ">=6.9.0" + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.2.14" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "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": { - "@babel/helper-plugin-utils": "^7.18.9" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=4" } }, - "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==", + "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/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/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, - "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" - } + "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/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "pify": "^2.3.0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8.10.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==", + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "resolve": "bin/resolve" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "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" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/rollup": { + "version": "3.25.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.3.tgz", + "integrity": "sha512-ZT279hx8gszBj9uy5FfhoG4bZx8c+0A1sbqtr7Q3KNWIizpTdDEPZbV2xcbvHsnFp4MavCQYZyzApJ+virB8Yw==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.18.0", + "npm": ">=8.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "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, - "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.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "queue-microtask": "^1.2.2" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "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, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "engines": { - "node": ">=6.9.0" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" }, - "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, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "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, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "resolve": "^1.22.2", + "sucrase": "^3.32.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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=14.0.0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "any-promise": "^1.0.0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.8" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "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": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8.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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "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": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { - "semver": "bin/semver.js" - } - }, - "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, - "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.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - }, - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "update-browserslist-db": "cli.js" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "browserslist": ">= 4.21.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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.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/@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==", + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "bin": { + "vite": "bin/vite.js" }, "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, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "node": "^14.18.0 || >=16.0.0" }, - "engines": { - "node": ">=6.9.0" + "optionalDependencies": { + "fsevents": "~2.3.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-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.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.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, - "bin": { - "semver": "bin/semver.js" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "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==", + "node_modules/vite-plugin-full-reload": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz", + "integrity": "sha512-kVZFDFWr0DxiHn6MuDVTQf7gnWIdETGlZh0hvTiMXzRN80vgF4PKbONSq8U1d0WtHsKaFODTQgJeakLacoPZEQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "picocolors": "^1.0.0", + "picomatch": "^2.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" + "vite": "^2 || ^3 || ^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, - "engines": { - "node": ">=10.0.0" - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, - "node_modules/@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==", + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, "engines": { - "node": ">=6.0.0" + "node": ">= 14" } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/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, - "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, - "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 - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "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/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", - "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "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/clean-css": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.5.tgz", - "integrity": "sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "source-map": "^0.6.0" - } - }, - "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.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, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "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": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "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, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/imagemin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-8.0.0.tgz", - "integrity": "sha512-B9X2CUeDv/uUeY9CqkzSTfmsLkeJP6PkmXlh4lODBbf9SwpmNuLS30WzUOi863dgsjY3zt3gY5q2F+UdifRi1A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/imagemin-gifsicle": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/imagemin-gifsicle/-/imagemin-gifsicle-7.0.1.tgz", - "integrity": "sha512-kUz6sUh0P95JOS0RGEaaemWUrASuw+dLsWIveK2UZJx74id/B9epgblMkCk/r5MjUWbZ83wFvacG5Rb/f97gyA==", - "dev": true, - "dependencies": { - "@types/imagemin": "*" - } - }, - "node_modules/@types/imagemin-mozjpeg": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@types/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.1.tgz", - "integrity": "sha512-kMQWEoKxxhlnH4POI3qfW9DjXlQfi80ux3l2b3j5R3eudSCoUIzKQLkfMjNJ6eMYnMWBcB+rfQOWqIzdIwFGKw==", - "dev": true, - "dependencies": { - "@types/imagemin": "*" - } - }, - "node_modules/@types/imagemin-optipng": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@types/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", - "integrity": "sha512-XCM/3q+HUL7v4zOqMI+dJ5dTxT+MUukY9KU49DSnYb/4yWtSMHJyADP+WHSMVzTR63J2ZvfUOzSilzBNEQW78g==", - "dev": true, - "dependencies": { - "@types/imagemin": "*" - } - }, - "node_modules/@types/imagemin-svgo": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@types/imagemin-svgo/-/imagemin-svgo-8.0.1.tgz", - "integrity": "sha512-YafkdrVAcr38U0Ln1C+L1n4SIZqC47VBHTyxCq7gTUSd1R9MdIvMcrljWlgU1M9O68WZDeQWUrKipKYfEOCOvQ==", - "dev": true, - "dependencies": { - "@types/imagemin": "*", - "@types/svgo": "^1" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.4.tgz", - "integrity": "sha512-I4BD3L+6AWiUobfxZ49DlU43gtI+FTHSv9pE2Zekg6KjMpre4ByusaljW3vYSLJrvQ1ck1hUaeVu8HVlY3vzHg==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "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/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.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "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, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/svgo": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.6.tgz", - "integrity": "sha512-AZU7vQcy/4WFEuwnwsNsJnFwupIpbllH1++LXScN6uxT1Z4zPzdrWG97w4/I7eFKFTvfy/bHFStWjdBAg2Vjug==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "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, - "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 - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@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 - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.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 - }, - "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.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "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==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "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.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "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/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/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": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "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 - }, - "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/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", - "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/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "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-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", - "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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2" - }, - "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 - }, - "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/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/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "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.10.3", - "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.0.13", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", - "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", - "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/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/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/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, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-sign/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/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true - }, - "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-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001374", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz", - "integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "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/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/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/collect.js": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.34.3.tgz", - "integrity": "sha512-aFr67xDazPwthsGm729mnClgNuh15JEagU6McKBKqxuHOkWL7vMFzGbhsXDdPZ+H6ia5QKIMGYuGOMENBHnVpg==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", - "dev": true - }, - "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 - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/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/concat": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/concat/-/concat-1.0.3.tgz", - "integrity": "sha512-f/ZaH1aLe64qHgTILdldbvyfGiGF4uzeo9IuXUloIOLQzFmIPloy9QbZadNsuVv0j5qbKQvQb/H/UYf2UsKTpw==", - "dev": true, - "dependencies": { - "commander": "^2.9.0" - }, - "bin": { - "concat": "bin/concat" - }, - "engines": { - "node": ">=6" - } - }, - "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/concat/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/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/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 - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "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" - } - ] - }, - "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, - "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, - "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, - "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/core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.3", - "semver": "7.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.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": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "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/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "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/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, - "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-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-select/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/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "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, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.12.tgz", - "integrity": "sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "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/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "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.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "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-serializer/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/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "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": "3.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", - "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1" - }, - "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/domutils/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/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": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "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.211", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz", - "integrity": "sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/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.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "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.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "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": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/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==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "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/express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "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.10.3", - "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/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" - } - ] - }, - "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/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "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.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "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/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "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/file-loader/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, - "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/file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "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.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "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/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "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/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": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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 - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true - }, - "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": "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/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "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/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/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, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash-base/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/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "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/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "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/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "node_modules/html-loader": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", - "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", - "dev": true, - "dependencies": { - "html-minifier-terser": "^5.1.1", - "htmlparser2": "^4.1.0", - "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/html-loader/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, - "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/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html-minifier-terser/node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/html-minifier-terser/node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/html-minifier-terser/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/htmlparser2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", - "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "domutils": "^2.0.0", - "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/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/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.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/imagemin": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", - "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", - "dev": true, - "dependencies": { - "file-type": "^12.0.0", - "globby": "^10.0.0", - "graceful-fs": "^4.2.2", - "junk": "^3.1.0", - "make-dir": "^3.0.0", - "p-pipe": "^3.0.0", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/img-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-4.0.0.tgz", - "integrity": "sha512-UwRcPQdwdOyEHyCxe1V9s9YFwInwEWCpoO+kJGfIqDrBDqA8jZUsEZTxQ0JteNPGw/Gupmwesk2OhLTcnw6tnQ==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "imagemin": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/img-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/img-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "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/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": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "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, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "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-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-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-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/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/junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/laravel-mix": { - "version": "6.0.49", - "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-6.0.49.tgz", - "integrity": "sha512-bBMFpFjp26XfijPvY5y9zGKud7VqlyOE0OWUcPo3vTBY5asw8LTjafAbee1dhfLz6PWNqDziz69CP78ELSpfKw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.15.8", - "@babel/plugin-proposal-object-rest-spread": "^7.15.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.15.8", - "@babel/preset-env": "^7.15.8", - "@babel/runtime": "^7.15.4", - "@types/babel__core": "^7.1.16", - "@types/clean-css": "^4.2.5", - "@types/imagemin-gifsicle": "^7.0.1", - "@types/imagemin-mozjpeg": "^8.0.1", - "@types/imagemin-optipng": "^5.2.1", - "@types/imagemin-svgo": "^8.0.0", - "autoprefixer": "^10.4.0", - "babel-loader": "^8.2.3", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "clean-css": "^5.2.4", - "cli-table3": "^0.6.0", - "collect.js": "^4.28.5", - "commander": "^7.2.0", - "concat": "^1.0.3", - "css-loader": "^5.2.6", - "cssnano": "^5.0.8", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "glob": "^7.2.0", - "html-loader": "^1.3.2", - "imagemin": "^7.0.1", - "img-loader": "^4.0.0", - "lodash": "^4.17.21", - "md5": "^2.3.0", - "mini-css-extract-plugin": "^1.6.2", - "node-libs-browser": "^2.2.1", - "postcss-load-config": "^3.1.0", - "postcss-loader": "^6.2.0", - "semver": "^7.3.5", - "strip-ansi": "^6.0.0", - "style-loader": "^2.0.0", - "terser": "^5.9.0", - "terser-webpack-plugin": "^5.2.4", - "vue-style-loader": "^4.1.3", - "webpack": "^5.60.0", - "webpack-cli": "^4.9.1", - "webpack-dev-server": "^4.7.3", - "webpack-merge": "^5.8.0", - "webpack-notifier": "^1.14.1", - "webpackbar": "^5.0.0-3", - "yargs": "^17.2.1" - }, - "bin": { - "laravel-mix": "bin/cli.js", - "mix": "bin/cli.js" - }, - "engines": { - "node": ">=12.14.0" - }, - "peerDependencies": { - "@babel/core": "^7.15.8", - "@babel/plugin-proposal-object-rest-spread": "^7.15.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.15.8", - "@babel/preset-env": "^7.15.8", - "postcss": "^8.3.11", - "webpack": "^5.60.0", - "webpack-cli": "^4.9.1" - } - }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "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/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==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "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": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-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, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "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.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", - "dev": true, - "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": "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/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "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-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/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.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "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/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "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/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "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/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "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, - "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-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-notifier": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", - "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", - "dev": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "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/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "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-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "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 - }, - "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.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "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/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true - }, - "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-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-pipe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "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-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/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "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-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "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": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "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/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "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.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "dependencies": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "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.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, - "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-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "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, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "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/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "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/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/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/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/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "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": "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, - "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/readable-stream/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/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.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "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.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "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 - }, - "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "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/replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-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/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/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/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": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.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/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.54.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.3.tgz", - "integrity": "sha512-fLodey5Qd41Pxp/Tk7Al97sViYwF/TazRc5t6E65O7JOk4XF8pzwIW7CvCxYVOfJFFI/1x5+elDyBIixrp+zrw==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/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.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "dev": true, - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "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/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "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/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/spdy-transport/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, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "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/std-env": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.1.1.tgz", - "integrity": "sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw==", - "dev": true - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.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/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-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.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "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/stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "dependencies": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "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.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" - }, - "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.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/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/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", - "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.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", - "dev": true - }, - "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/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.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, - "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, - "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.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/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/uri-js/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "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/util/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/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/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", - "dev": true, - "dependencies": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "node_modules/vue-style-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/vue-style-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "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": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "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.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "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/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.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "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/webpack-dev-server": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", - "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.0.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/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "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-server/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-server/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.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "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/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, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-notifier": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.15.0.tgz", - "integrity": "sha512-N2V8UMgRB5komdXQRavBsRpw0hPhJq2/SWNOGuhrXpIgRhcMexzkGQysUyGStHLV5hkUlgpRiF7IUXoBqyMmzQ==", - "dev": true, - "dependencies": { - "node-notifier": "^9.0.0", - "strip-ansi": "^6.0.0" - }, - "peerDependencies": { - "@types/webpack": ">4.41.31" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": 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==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "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, - "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/webpack/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "webpack": "3 || 4 || 5" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "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 - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", - "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", - "dev": true - }, - "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.10.tgz", - "integrity": "sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.10", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", - "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/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 - }, - "@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, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", - "dev": true - }, - "@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, - "requires": { - "@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": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", - "dev": true - }, - "@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 - }, - "@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" - } - }, - "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "dev": true, - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.11.tgz", - "integrity": "sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==", - "dev": true - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", - "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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, - "requires": { - "@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": { - "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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@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, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@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, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-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.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.11.tgz", - "integrity": "sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.11", - "@babel/types": "^7.18.10", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.10.tgz", - "integrity": "sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@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 - }, - "@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, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@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 - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", - "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/clean-css": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.5.tgz", - "integrity": "sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==", - "dev": true, - "requires": { - "@types/node": "*", - "source-map": "^0.6.0" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/connect-history-api-fallback": { - "version": "1.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, - "requires": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.30", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.30.tgz", - "integrity": "sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@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, - "requires": { - "@types/node": "*" - } - }, - "@types/imagemin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-8.0.0.tgz", - "integrity": "sha512-B9X2CUeDv/uUeY9CqkzSTfmsLkeJP6PkmXlh4lODBbf9SwpmNuLS30WzUOi863dgsjY3zt3gY5q2F+UdifRi1A==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/imagemin-gifsicle": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/imagemin-gifsicle/-/imagemin-gifsicle-7.0.1.tgz", - "integrity": "sha512-kUz6sUh0P95JOS0RGEaaemWUrASuw+dLsWIveK2UZJx74id/B9epgblMkCk/r5MjUWbZ83wFvacG5Rb/f97gyA==", - "dev": true, - "requires": { - "@types/imagemin": "*" - } - }, - "@types/imagemin-mozjpeg": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@types/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.1.tgz", - "integrity": "sha512-kMQWEoKxxhlnH4POI3qfW9DjXlQfi80ux3l2b3j5R3eudSCoUIzKQLkfMjNJ6eMYnMWBcB+rfQOWqIzdIwFGKw==", - "dev": true, - "requires": { - "@types/imagemin": "*" - } - }, - "@types/imagemin-optipng": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@types/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", - "integrity": "sha512-XCM/3q+HUL7v4zOqMI+dJ5dTxT+MUukY9KU49DSnYb/4yWtSMHJyADP+WHSMVzTR63J2ZvfUOzSilzBNEQW78g==", - "dev": true, - "requires": { - "@types/imagemin": "*" - } - }, - "@types/imagemin-svgo": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@types/imagemin-svgo/-/imagemin-svgo-8.0.1.tgz", - "integrity": "sha512-YafkdrVAcr38U0Ln1C+L1n4SIZqC47VBHTyxCq7gTUSd1R9MdIvMcrljWlgU1M9O68WZDeQWUrKipKYfEOCOvQ==", - "dev": true, - "requires": { - "@types/imagemin": "*", - "@types/svgo": "^1" - } - }, - "@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 - }, - "@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 - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/node": { - "version": "18.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.4.tgz", - "integrity": "sha512-I4BD3L+6AWiUobfxZ49DlU43gtI+FTHSv9pE2Zekg6KjMpre4ByusaljW3vYSLJrvQ1ck1hUaeVu8HVlY3vzHg==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", - "dev": true, - "requires": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/svgo": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.6.tgz", - "integrity": "sha512-AZU7vQcy/4WFEuwnwsNsJnFwupIpbllH1++LXScN6uxT1Z4zPzdrWG97w4/I7eFKFTvfy/bHFStWjdBAg2Vjug==", - "dev": true - }, - "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@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 - }, - "@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 - }, - "@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 - }, - "@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, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@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 - }, - "@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, - "requires": { - "@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": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@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, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@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 - }, - "@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, - "requires": { - "@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": { - "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, - "requires": { - "@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": { - "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, - "requires": { - "@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": { - "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, - "requires": { - "@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": { - "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, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "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==", - "dev": true, - "requires": {} - }, - "adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "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 - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "autoprefixer": { - "version": "10.4.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.8.tgz", - "integrity": "sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==", - "dev": true, - "requires": { - "browserslist": "^4.21.3", - "caniuse-lite": "^1.0.30001373", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - } - }, - "axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2" - } - }, - "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 - }, - "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 - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "dev": true - }, - "body-parser": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", - "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.10.3", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "bonjour-service": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", - "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", - "dev": true, - "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "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, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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 - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "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 - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "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, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001374", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz", - "integrity": "sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "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 - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "clean-css": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz", - "integrity": "sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "cli-table3": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", - "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "collect.js": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.34.3.tgz", - "integrity": "sha512-aFr67xDazPwthsGm729mnClgNuh15JEagU6McKBKqxuHOkWL7vMFzGbhsXDdPZ+H6ia5QKIMGYuGOMENBHnVpg==", - "dev": true - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "colord": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz", - "integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==", - "dev": true - }, - "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 - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "concat": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/concat/-/concat-1.0.3.tgz", - "integrity": "sha512-f/ZaH1aLe64qHgTILdldbvyfGiGF4uzeo9IuXUloIOLQzFmIPloy9QbZadNsuVv0j5qbKQvQb/H/UYf2UsKTpw==", - "dev": true, - "requires": { - "commander": "^2.9.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "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 - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "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 - }, - "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, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "core-js-compat": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.24.1.tgz", - "integrity": "sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==", - "dev": true, - "requires": { - "browserslist": "^4.21.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css-declaration-sorter": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz", - "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==", - "dev": true, - "requires": {} - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "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, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "dependencies": { - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - } - } - }, - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssnano": { - "version": "5.1.12", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.12.tgz", - "integrity": "sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==", - "dev": true, - "requires": { - "cssnano-preset-default": "^5.2.12", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - } - }, - "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", - "dev": true, - "requires": { - "css-declaration-sorter": "^6.3.0", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - } - }, - "cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "requires": {} - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - } - }, - "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 - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "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 - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, - "requires": { - "@leichtgewicht/ip-codec": "^2.0.1" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "dependencies": { - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", - "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "dependencies": { - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - } - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.211", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz", - "integrity": "sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "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 - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "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 - }, - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "express": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", - "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dev": true, - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.0", - "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.10.3", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "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 - } - } - }, - "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 - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "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 - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "dev": true - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-extra": { - "version": "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, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "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 - }, - "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 - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "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 - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "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 - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", - "dev": true - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "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 - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "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 - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "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, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "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 - } - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "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 - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "html-loader": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", - "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", - "dev": true, - "requires": { - "html-minifier-terser": "^5.1.1", - "htmlparser2": "^4.1.0", - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - } - } - }, - "htmlparser2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", - "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^3.0.0", - "domutils": "^2.0.0", - "entities": "^2.0.0" - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "requires": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "imagemin": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", - "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", - "dev": true, - "requires": { - "file-type": "^12.0.0", - "globby": "^10.0.0", - "graceful-fs": "^4.2.2", - "junk": "^3.1.0", - "make-dir": "^3.0.0", - "p-pipe": "^3.0.0", - "replace-ext": "^1.0.0" - } - }, - "img-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-4.0.0.tgz", - "integrity": "sha512-UwRcPQdwdOyEHyCxe1V9s9YFwInwEWCpoO+kJGfIqDrBDqA8jZUsEZTxQ0JteNPGw/Gupmwesk2OhLTcnw6tnQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "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, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "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 - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-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 - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "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 - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "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 - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true - }, - "laravel-mix": { - "version": "6.0.49", - "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-6.0.49.tgz", - "integrity": "sha512-bBMFpFjp26XfijPvY5y9zGKud7VqlyOE0OWUcPo3vTBY5asw8LTjafAbee1dhfLz6PWNqDziz69CP78ELSpfKw==", - "dev": true, - "requires": { - "@babel/core": "^7.15.8", - "@babel/plugin-proposal-object-rest-spread": "^7.15.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.15.8", - "@babel/preset-env": "^7.15.8", - "@babel/runtime": "^7.15.4", - "@types/babel__core": "^7.1.16", - "@types/clean-css": "^4.2.5", - "@types/imagemin-gifsicle": "^7.0.1", - "@types/imagemin-mozjpeg": "^8.0.1", - "@types/imagemin-optipng": "^5.2.1", - "@types/imagemin-svgo": "^8.0.0", - "autoprefixer": "^10.4.0", - "babel-loader": "^8.2.3", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "clean-css": "^5.2.4", - "cli-table3": "^0.6.0", - "collect.js": "^4.28.5", - "commander": "^7.2.0", - "concat": "^1.0.3", - "css-loader": "^5.2.6", - "cssnano": "^5.0.8", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "glob": "^7.2.0", - "html-loader": "^1.3.2", - "imagemin": "^7.0.1", - "img-loader": "^4.0.0", - "lodash": "^4.17.21", - "md5": "^2.3.0", - "mini-css-extract-plugin": "^1.6.2", - "node-libs-browser": "^2.2.1", - "postcss-load-config": "^3.1.0", - "postcss-loader": "^6.2.0", - "semver": "^7.3.5", - "strip-ansi": "^6.0.0", - "style-loader": "^2.0.0", - "terser": "^5.9.0", - "terser-webpack-plugin": "^5.2.4", - "vue-style-loader": "^4.1.3", - "webpack": "^5.60.0", - "webpack-cli": "^4.9.1", - "webpack-dev-server": "^4.7.3", - "webpack-merge": "^5.8.0", - "webpack-notifier": "^1.14.1", - "webpackbar": "^5.0.0-3", - "yargs": "^17.2.1" - } - }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "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, - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", - "dev": true, - "requires": { - "fs-monkey": "^1.0.3" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "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, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "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, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "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 - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "requires": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - } - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "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 - }, - "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 - }, - "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, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "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 - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node-notifier": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", - "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - } - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true - }, - "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 - }, - "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 - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-pipe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, - "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 - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "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, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "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 - }, - "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 - }, - "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 - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-colormin": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", - "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", - "dev": true, - "requires": { - "browserslist": "^4.20.3", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "requires": {} - }, - "postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "requires": {} - }, - "postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "requires": {} - }, - "postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "requires": {} - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - } - }, - "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" - } - }, - "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "requires": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.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, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "requires": {} - }, - "postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "requires": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "requires": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "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, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - } - }, - "postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.5" - } - }, - "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 - }, - "pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "qs": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", - "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true - }, - "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 - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "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 - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - } - } - }, - "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, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "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 - }, - "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "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 - }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", - "dev": true - }, - "regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - } - }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, - "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "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 - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-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 - }, - "resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dev": true, - "requires": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass": { - "version": "1.54.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.3.tgz", - "integrity": "sha512-fLodey5Qd41Pxp/Tk7Al97sViYwF/TazRc5t6E65O7JOk4XF8pzwIW7CvCxYVOfJFFI/1x5+elDyBIixrp+zrw==", - "dev": true, - "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - } - }, - "sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", - "dev": true, - "requires": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - } - }, - "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, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "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 - }, - "selfsigned": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", - "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "dev": true, - "requires": { - "node-forge": "^1" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } - } - }, - "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, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "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 - }, - "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 - }, - "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 - }, - "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, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "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, - "requires": { - "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" - }, - "dependencies": { - "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, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - }, - "std-env": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.1.1.tgz", - "integrity": "sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw==", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "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, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "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 - }, - "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, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "postcss-selector-parser": "^6.0.4" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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 - }, - "svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "requires": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.7", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" - }, - "dependencies": { - "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, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", - "dev": true - }, - "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 - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", - "dev": true - }, - "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, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "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 - }, - "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, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true - }, - "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 - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "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 - } - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - } - } - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true - }, - "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 - }, - "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 - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", - "dev": true, - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, - "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, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" - } - }, - "webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "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, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "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 - } - } - }, - "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - } - }, - "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "requires": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "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, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "webpack-dev-server": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.3.tgz", - "integrity": "sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==", - "dev": true, - "requires": { - "@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.0.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "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, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - } - } - }, - "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, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-notifier": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.15.0.tgz", - "integrity": "sha512-N2V8UMgRB5komdXQRavBsRpw0hPhJq2/SWNOGuhrXpIgRhcMexzkGQysUyGStHLV5hkUlgpRiF7IUXoBqyMmzQ==", - "dev": true, - "requires": { - "node-notifier": "^9.0.0", - "strip-ansi": "^6.0.0" - } - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" - } - }, - "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, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "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 - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "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, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "requires": {} - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true } } } diff --git a/package.json b/package.json index 4681e0b6388..2e95c0b7c2c 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,21 @@ { "private": true, + "type": "module", "scripts": { - "dev": "npm run development", - "development": "mix", - "watch": "mix watch", - "watch-poll": "mix watch -- --watch-options-poll=1000", - "hot": "mix watch --hot", - "prod": "npm run production", - "production": "mix --production" + "dev": "vite", + "build": "vite build" }, "devDependencies": { - "axios": "^0.27.2", - "laravel-mix": "^6.0.6", - "lodash": "^4.17.19", - "postcss": "^8.1.14", - "resolve-url-loader": "^5.0.0", - "sass": "^1.32.11", - "sass-loader": "^13.0.2" + "autoprefixer": "^10.4.14", + "axios": "^1.1.2", + "laravel-vite-plugin": "^0.7.5", + "postcss": "^8.4.24", + "tailwindcss": "^3.3.2", + "vite": "^4.0.0" + }, + "dependencies": { + "lazysizes": "^5.3.2", + "mousetrap": "^1.6.5", + "mousetrap-global-bind": "^1.1.0" } } diff --git a/phpstan.neon b/phpstan.neon index 2966c786216..a7bd522e7eb 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -9,15 +9,13 @@ parameters: - app - scripts - lang - - database + - database/migrations - tests excludePaths: - - app/View/* - - app/Http/Livewire/* - - database/factories/* - database/migrations/2021_12_04_181200_refactor_models.php stubFiles: # these can be removed after https://github.com/thecodingmachine/safe/issues/283 has been merged + - phpstan/stubs/Wireable.stub - phpstan/stubs/image.stub - phpstan/stubs/imageexception.stub ignoreErrors: @@ -33,8 +31,10 @@ parameters: - '#Dynamic call to static method (Illuminate\\Database\\Query\\Builder|Illuminate\\Database\\Eloquent\\(Builder|Relations\\.*)|App\\Models\\Builders\\.*|App\\Eloquent\\FixedQueryBuilder)(<.*>)?::where(Not)?(Null|In|Between|Exists|Column|Year|Month|Day)?\(\).#' - '#Dynamic call to static method (Illuminate\\Database\\Query\\Builder|Illuminate\\Database\\Eloquent\\(Builder|Relations\\.*)|App\\Models\\Builders\\.*|App\\Eloquent\\FixedQueryBuilder)(<.*>)?::delete\(\)#' - '#Dynamic call to static method (Illuminate\\Database\\Query\\Builder|Illuminate\\Database\\Eloquent\\(Builder|Relations\\.*)|App\\Models\\Builders\\.*|App\\Eloquent\\FixedQueryBuilder)(<.*>)?::without\(\)#' + - '#Dynamic call to static method (Illuminate\\Database\\Query\\Builder|Illuminate\\Database\\Eloquent\\(Builder|Relations\\.*)|App\\Models\\Builders\\.*|App\\Eloquent\\FixedQueryBuilder)(<.*>)?::with\(\)#' - '#Dynamic call to static method (Illuminate\\Database\\Query\\Builder|Illuminate\\Database\\Eloquent\\(Builder|Relations\\.*)|App\\Models\\Builders\\.*|App\\Eloquent\\FixedQueryBuilder)(<.*>)?::count\(\).#' - '#Dynamic call to static method (Illuminate\\Database\\Query\\Builder|Illuminate\\Database\\Eloquent\\(Builder|Relations\\.*)|App\\Models\\Builders\\.*|App\\Eloquent\\FixedQueryBuilder)(<.*>)?::update\(\).#' + - '#Dynamic call to static method (Illuminate\\Database\\Query\\Builder|Illuminate\\Database\\Eloquent\\(Builder|Relations\\.*)|App\\Models\\Builders\\.*|App\\Eloquent\\FixedQueryBuilder)(<.*>)?::inRandomOrder\(\).#' - '#Dynamic call to static method App\\Models\\Builders\\.*::orderByDesc\(\).#' - '#Call to an undefined method Illuminate\\Database\\Eloquent\\.*::update\(\)#' - '#Call to an undefined method Illuminate\\Database\\Eloquent\\.*::with(Only)?\(\)#' @@ -79,15 +79,15 @@ parameters: - message: '#Function define is unsafe to use.#' paths: - - database + - database/migrations - message: '#Variable property access on (mixed|object).#' paths: - - database + - database/migrations - message: '#Access to an undefined property object::\$value.#' paths: - - database + - database/migrations # TESTS - @@ -111,10 +111,11 @@ parameters: paths: - tests - - message: '#Access to private property App\\Models\\Extensions\\SizeVariants::\$(original|thumb|small|medium)(2x)?#' + message: '#Cannot call method .* on Illuminate\\Testing\\PendingCommand\|int.#' paths: - tests + - - message: '#Cannot call method .* on Illuminate\\Testing\\PendingCommand\|int.#' + message: '#Access to private property App\\Models\\Extensions\\SizeVariants::\$(original|small(2x)?|thumb(2x)?|medium(2x)?)#' paths: - - tests + - tests \ No newline at end of file diff --git a/phpstan/stubs/Wireable.stub b/phpstan/stubs/Wireable.stub new file mode 100644 index 00000000000..a4dad489674 --- /dev/null +++ b/phpstan/stubs/Wireable.stub @@ -0,0 +1,22 @@ + legend { + position: absolute; + overflow: hidden; + height: 1px; + width: 1px; + padding: 0; + border: 0; + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + white-space: nowrap; +} +.filepond--file { + position: static; + display: flex; + height: 100%; + align-items: flex-start; + + padding: 0.5625em 0.5625em; + + color: #fff; + border-radius: 0.5em; + + /* control positions */ +} +.filepond--file .filepond--file-status { + margin-left: auto; + margin-right: 2.25em; +} +.filepond--file .filepond--processing-complete-indicator { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + z-index: 3; +} +.filepond--file .filepond--processing-complete-indicator, +.filepond--file .filepond--progress-indicator, +.filepond--file .filepond--file-action-button { + position: absolute; +} +.filepond--file { + /* .filepond--file-action-button */ +} +.filepond--file [data-align*='left'] { + left: 0.5625em; +} +.filepond--file [data-align*='right'] { + right: 0.5625em; +} +.filepond--file [data-align*='center'] { + left: calc(50% - 0.8125em); /* .8125 is half of button width */ +} +.filepond--file [data-align*='bottom'] { + bottom: 1.125em; +} +.filepond--file [data-align='center'] { + top: calc(50% - 0.8125em); +} +.filepond--file .filepond--progress-indicator { + margin-top: 0.1875em; +} +.filepond--file .filepond--progress-indicator[data-align*='right'] { + margin-right: 0.1875em; +} +.filepond--file .filepond--progress-indicator[data-align*='left'] { + margin-left: 0.1875em; +} +/* make sure text does not overlap */ +[data-filepond-item-state='cancelled'] .filepond--file-info, +[data-filepond-item-state*='invalid'] .filepond--file-info, +[data-filepond-item-state*='error'] .filepond--file-info { + margin-right: 2.25em; +} +[data-filepond-item-state~='processing'] .filepond--file-status-sub { + opacity: 0; +} +[data-filepond-item-state~='processing'] + .filepond--action-abort-item-processing + ~ .filepond--file-status + .filepond--file-status-sub { + opacity: 0.5; +} +[data-filepond-item-state='processing-error'] .filepond--file-status-sub { + opacity: 0; +} +[data-filepond-item-state='processing-error'] + .filepond--action-retry-item-processing + ~ .filepond--file-status + .filepond--file-status-sub { + opacity: 0.5; +} +[data-filepond-item-state='processing-complete'] { + /* busy state */ +} +[data-filepond-item-state='processing-complete'] .filepond--action-revert-item-processing svg { + animation: fall 0.5s 0.125s linear both; +} +[data-filepond-item-state='processing-complete'] { + /* hide details by default, only show when can revert */ +} +[data-filepond-item-state='processing-complete'] .filepond--file-status-sub { + opacity: 0.5; +} +[data-filepond-item-state='processing-complete'] + .filepond--processing-complete-indicator:not([style*='hidden']) + ~ .filepond--file-status + .filepond--file-status-sub { + opacity: 0; +} +[data-filepond-item-state='processing-complete'] .filepond--file-info-sub { + opacity: 0; +} +[data-filepond-item-state='processing-complete'] + .filepond--action-revert-item-processing + ~ .filepond--file-info + .filepond--file-info-sub { + opacity: 0.5; +} +/* file state can be invalid or error, both are visually similar but */ +/* having them as separate states might be useful */ +[data-filepond-item-state*='invalid'] .filepond--panel, +[data-filepond-item-state*='invalid'] .filepond--file-wrapper, +[data-filepond-item-state*='error'] .filepond--panel, +[data-filepond-item-state*='error'] .filepond--file-wrapper { + animation: shake 0.65s linear both; +} +/* spins progress indicator when file is marked as busy */ +[data-filepond-item-state*='busy'] .filepond--progress-indicator svg { + animation: spin 1s linear infinite; +} +/** + * States + */ +@keyframes spin { + 0% { + transform: rotateZ(0deg); + } + + 100% { + transform: rotateZ(360deg); + } +} +@keyframes shake { + 10%, + 90% { + transform: translateX(-0.0625em); + } + + 20%, + 80% { + transform: translateX(0.125em); + } + + 30%, + 50%, + 70% { + transform: translateX(-0.25em); + } + + 40%, + 60% { + transform: translateX(0.25em); + } +} +@keyframes fall { + 0% { + opacity: 0; + transform: scale(0.5); + animation-timing-function: ease-out; + } + + 70% { + opacity: 1; + transform: scale(1.1); + animation-timing-function: ease-in-out; + } + + 100% { + transform: scale(1); + animation-timing-function: ease-out; + } +} +/* ignore all other interaction elements while dragging a file */ +.filepond--hopper[data-hopper-state='drag-over'] > * { + pointer-events: none; +} +/* capture all hit tests using a hidden layer, this speeds up the event flow */ +.filepond--hopper[data-hopper-state='drag-over']::after { + content: ''; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 100; +} +.filepond--progress-indicator { + z-index: 103; +} +.filepond--file-action-button { + z-index: 102; +} +.filepond--file-status { + z-index: 101; +} +.filepond--file-info { + z-index: 100; +} +.filepond--item { + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: 1; + + padding: 0; + margin: 0.25em; + + will-change: transform, opacity; + + /* item children order */ +} +.filepond--item > .filepond--panel { + z-index: -1; +} +/* has a slight shadow */ +.filepond--item > .filepond--panel .filepond--panel-bottom { + box-shadow: 0 0.0625em 0.125em -0.0625em rgba(0, 0, 0, 0.25); +} +.filepond--item { + /* drag related */ +} +.filepond--item > .filepond--file-wrapper, +.filepond--item > .filepond--panel { + transition: opacity 0.15s ease-out; +} +.filepond--item[data-drag-state] { + cursor: grab; +} +.filepond--item[data-drag-state] > .filepond--panel { + transition: box-shadow 0.125s ease-in-out; + box-shadow: 0 0 0 rgba(0, 0, 0, 0); +} +.filepond--item[data-drag-state='drag'] { + cursor: grabbing; +} +.filepond--item[data-drag-state='drag'] > .filepond--panel { + box-shadow: 0 0.125em 0.3125em rgba(0, 0, 0, 0.325); +} +.filepond--item[data-drag-state]:not([data-drag-state='idle']) { + z-index: 2; +} +/* states */ +.filepond--item-panel { + background-color: #64605e; +} +[data-filepond-item-state='processing-complete'] .filepond--item-panel { + background-color: #369763; +} +[data-filepond-item-state*='invalid'] .filepond--item-panel, +[data-filepond-item-state*='error'] .filepond--item-panel { + background-color: #c44e47; +} +/* style of item panel */ +.filepond--item-panel { + border-radius: 0.5em; + transition: background-color 0.25s; +} +/* normal mode */ +.filepond--list-scroller { + position: absolute; + top: 0; + left: 0; + right: 0; + margin: 0; + will-change: transform; +} +/* scroll mode */ +.filepond--list-scroller[data-state='overflow'] .filepond--list { + bottom: 0; + right: 0; +} +.filepond--list-scroller[data-state='overflow'] { + overflow-y: scroll; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; + -webkit-mask: linear-gradient(to bottom, #000 calc(100% - 0.5em), transparent 100%); + mask: linear-gradient(to bottom, #000 calc(100% - 0.5em), transparent 100%); +} +/* style scrollbar */ +.filepond--list-scroller::-webkit-scrollbar { + background: transparent; +} +.filepond--list-scroller::-webkit-scrollbar:vertical { + width: 1em; +} +.filepond--list-scroller::-webkit-scrollbar:horizontal { + height: 0; +} +.filepond--list-scroller::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.3); + border-radius: 99999px; + border: 0.3125em solid transparent; + background-clip: content-box; +} +/* hard to overide styles on purpose */ +.filepond--list.filepond--list { + position: absolute; + top: 0; + margin: 0; + padding: 0; + list-style-type: none; + + /* prevents endless paint calls on filepond--list-scroller */ + will-change: transform; +} +/* used for padding so allowed to be restyled */ +.filepond--list { + left: 0.75em; + right: 0.75em; +} +.filepond--root[data-style-panel-layout~='integrated'] { + width: 100%; + height: 100%; + max-width: none; + margin: 0; +} +.filepond--root[data-style-panel-layout~='circle'] .filepond--panel-root, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--panel-root { + border-radius: 0; +} +.filepond--root[data-style-panel-layout~='circle'] .filepond--panel-root > *, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--panel-root > * { + display: none; +} +.filepond--root[data-style-panel-layout~='circle'] .filepond--drop-label, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--drop-label { + bottom: 0; + height: auto; + display: flex; + justify-content: center; + align-items: center; + z-index: 7; +} +.filepond--root[data-style-panel-layout~='circle'], +.filepond--root[data-style-panel-layout~='integrated'] { + /* we're only loading one item, this makes the intro animation a bit nicer */ +} +.filepond--root[data-style-panel-layout~='circle'] .filepond--item-panel, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--item-panel { + display: none; +} +.filepond--root[data-style-panel-layout~='compact'] .filepond--list-scroller, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--list-scroller { + overflow: hidden; + height: 100%; + margin-top: 0; + margin-bottom: 0; +} +.filepond--root[data-style-panel-layout~='compact'] .filepond--list, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--list { + left: 0; + right: 0; + height: 100%; +} +.filepond--root[data-style-panel-layout~='compact'] .filepond--item, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--item { + margin: 0; +} +.filepond--root[data-style-panel-layout~='compact'] .filepond--file-wrapper, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--file-wrapper { + height: 100%; +} +.filepond--root[data-style-panel-layout~='compact'] .filepond--drop-label, +.filepond--root[data-style-panel-layout~='integrated'] .filepond--drop-label { + z-index: 7; +} +.filepond--root[data-style-panel-layout~='circle'] { + border-radius: 99999rem; + overflow: hidden; +} +.filepond--root[data-style-panel-layout~='circle'] > .filepond--panel { + border-radius: inherit; +} +.filepond--root[data-style-panel-layout~='circle'] > .filepond--panel > * { + display: none; +} +.filepond--root[data-style-panel-layout~='circle'] { + /* circle cuts of this info, so best to hide it */ +} +.filepond--root[data-style-panel-layout~='circle'] .filepond--file-info { + display: none; +} +.filepond--root[data-style-panel-layout~='circle'] .filepond--file-status { + display: none; +} +.filepond--root[data-style-panel-layout~='circle'] .filepond--action-edit-item { + opacity: 1 !important; + visibility: visible !important; +} +/* dirfty way to fix circular overflow issue on safari 11+ */ +@media not all and (-webkit-min-device-pixel-ratio: 0), not all and (min-resolution: 0.001dpcm) { + @supports (-webkit-appearance: none) and (stroke-color: transparent) { + .filepond--root[data-style-panel-layout~='circle'] { + will-change: transform; + } + } +} +.filepond--panel-root { + border-radius: 0.5em; + background-color: #f1f0ef; +} +.filepond--panel { + position: absolute; + left: 0; + top: 0; + right: 0; + margin: 0; + + /* defaults to 100% height (fixed height mode) this fixes problem with panel height in IE11 */ + height: 100% !important; + + /* no interaction possible with panel */ + pointer-events: none; +} +.filepond-panel:not([data-scalable='false']) { + height: auto !important; +} +.filepond--panel[data-scalable='false'] > div { + display: none; +} +.filepond--panel[data-scalable='true'] { + /* this seems to fix Chrome performance issues */ + /* - when box-shadow is enabled */ + /* - when multiple ponds are active on the same page */ + transform-style: preserve-3d; + + /* prevent borders and backgrounds */ + background-color: transparent !important; + border: none !important; +} +.filepond--panel-top, +.filepond--panel-bottom, +.filepond--panel-center { + position: absolute; + left: 0; + top: 0; + right: 0; + margin: 0; + padding: 0; +} +.filepond--panel-top, +.filepond--panel-bottom { + height: 0.5em; +} +.filepond--panel-top { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; + border-bottom: none !important; + + /* fixes tiny transparant line between top and center panel */ +} +.filepond--panel-top::after { + content: ''; + position: absolute; + height: 2px; + left: 0; + right: 0; + bottom: -1px; + background-color: inherit; +} +.filepond--panel-center, +.filepond--panel-bottom { + will-change: transform; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transform-origin: left top; + transform: translate3d(0, 0.5em, 0); +} +.filepond--panel-bottom { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + border-top: none !important; + + /* fixes tiny transparant line between bottom and center of panel */ +} +.filepond--panel-bottom::before { + content: ''; + position: absolute; + height: 2px; + left: 0; + right: 0; + top: -1px; + background-color: inherit; +} +.filepond--panel-center { + /* the center panel is scaled using scale3d to fit the correct height */ + /* we use 100px instead of 1px as scaling 1px to a huge height is really laggy on chrome */ + height: 100px !important; + border-top: none !important; + border-bottom: none !important; + border-radius: 0 !important; + + /* hide if not transformed, prevents a little flash when the panel is at 100px height while attached for first time */ +} +.filepond--panel-center:not([style]) { + visibility: hidden; +} +.filepond--progress-indicator { + position: static; + width: 1.25em; + height: 1.25em; + + color: #fff; + + /* can't have margins */ + margin: 0; + + /* no interaction possible with progress indicator */ + pointer-events: none; + + /* will be animated */ + will-change: transform, opacity; +} +.filepond--progress-indicator svg { + width: 100%; + height: 100%; + vertical-align: top; + transform-box: fill-box; /* should center the animation correctly when zoomed in */ +} +.filepond--progress-indicator path { + fill: none; + stroke: currentColor; +} +.filepond--list-scroller { + z-index: 6; +} +.filepond--drop-label { + z-index: 5; +} +.filepond--drip { + z-index: 3; +} +.filepond--root > .filepond--panel { + z-index: 2; +} +.filepond--browser { + z-index: 1; +} +.filepond--root { + /* layout*/ + box-sizing: border-box; + position: relative; + margin-bottom: 1em; + + /* base font size for whole component */ + font-size: 1rem; + + /* base line height */ + line-height: normal; + + /* up uses default system font family */ + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, + 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; + + /* will increase font weight a bit on Safari */ + font-weight: 450; + + /* default text alignment */ + text-align: left; + + /* better text rendering on Safari */ + text-rendering: optimizeLegibility; + + /* text direction is ltr for now */ + direction: ltr; + + /* optimize rendering */ + /* https://developer.mozilla.org/en-US/docs/Web/CSS/contain */ + contain: layout style size; + + /* correct box sizing, line-height and positioning on child elements */ +} +.filepond--root * { + box-sizing: inherit; + line-height: inherit; +} +.filepond--root *:not(text) { + font-size: inherit; +} +.filepond--root { + /* block everything */ +} +.filepond--root[data-disabled] { + pointer-events: none; +} +.filepond--root[data-disabled] .filepond--list-scroller { + pointer-events: all; +} +.filepond--root[data-disabled] .filepond--list { + pointer-events: none; +} +/** + * Root element children layout + */ +.filepond--root .filepond--drop-label { + min-height: 4.75em; +} +.filepond--root .filepond--list-scroller { + margin-top: 1em; + margin-bottom: 1em; +} +.filepond--root .filepond--credits { + position: absolute; + right: 0; + opacity: 0.175; + line-height: 0.85; + font-size: 11px; + color: inherit; + text-decoration: none; + z-index: 3; + bottom: -14px; +} +.filepond--root .filepond--credits[style] { + top: 0; + bottom: auto; + margin-top: 14px; +} + diff --git a/public/js/alpine.min.js b/public/js/alpine.min.js new file mode 100644 index 00000000000..a5c58b64b22 --- /dev/null +++ b/public/js/alpine.min.js @@ -0,0 +1,5 @@ +(()=>{var Xe=!1,Ze=!1,V=[],Qe=-1;function Kt(e){En(e)}function En(e){V.includes(e)||V.push(e),Sn()}function ye(e){let t=V.indexOf(e);t!==-1&&t>Qe&&V.splice(t,1)}function Sn(){!Ze&&!Xe&&(Xe=!0,queueMicrotask(An))}function An(){Xe=!1,Ze=!0;for(let e=0;ee.effect(t,{scheduler:r=>{tt?Kt(r):r()}}),et=e.raw}function rt(e){D=e}function Ht(e){let t=()=>{};return[n=>{let i=D(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),$(i))},i},()=>{t()}]}var qt=[],Ut=[],Wt=[];function Gt(e){Wt.push(e)}function be(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Ut.push(t))}function Jt(e){qt.push(e)}function Yt(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function nt(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}var ot=new MutationObserver(it),st=!1;function se(){ot.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),st=!0}function at(){On(),ot.disconnect(),st=!1}var ae=[],ct=!1;function On(){ae=ae.concat(ot.takeRecords()),ae.length&&!ct&&(ct=!0,queueMicrotask(()=>{Tn(),ct=!1}))}function Tn(){it(ae),ae.length=0}function h(e){if(!st)return e();at();let t=e();return se(),t}var lt=!1,ve=[];function Xt(){lt=!0}function Zt(){lt=!1,it(ve),ve=[]}function it(e){if(lt){ve=ve.concat(e);return}let t=[],r=[],n=new Map,i=new Map;for(let o=0;os.nodeType===1&&t.push(s)),e[o].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{nt(s,o)}),n.forEach((o,s)=>{qt.forEach(a=>a(s,o))});for(let o of r)if(!t.includes(o)&&(Ut.forEach(s=>s(o)),o._x_cleanups))for(;o._x_cleanups.length;)o._x_cleanups.pop()();t.forEach(o=>{o._x_ignoreSelf=!0,o._x_ignore=!0});for(let o of t)r.includes(o)||!o.isConnected||(delete o._x_ignoreSelf,delete o._x_ignore,Wt.forEach(s=>s(o)),o._x_ignore=!0,o._x_ignoreSelf=!0);t.forEach(o=>{delete o._x_ignoreSelf,delete o._x_ignore}),t=null,r=null,n=null,i=null}function we(e){return F(L(e))}function N(e,t,r){return e._x_dataStack=[t,...L(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function L(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?L(e.host):e.parentNode?L(e.parentNode):[]}function F(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,n)=>e.some(i=>i.hasOwnProperty(n)),get:(r,n)=>(e.find(i=>{if(i.hasOwnProperty(n)){let o=Object.getOwnPropertyDescriptor(i,n);if(o.get&&o.get._x_alreadyBound||o.set&&o.set._x_alreadyBound)return!0;if((o.get||o.set)&&o.enumerable){let s=o.get,a=o.set,c=o;s=s&&s.bind(t),a=a&&a.bind(t),s&&(s._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(i,n,{...c,get:s,set:a})}return!0}return!1})||{})[n],set:(r,n,i)=>{let o=e.find(s=>s.hasOwnProperty(n));return o?o[n]=i:e[e.length-1][n]=i,!0}});return t}function Ee(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0)return;let c=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,c,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,c)})};return r(e)}function Se(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>Cn(n,i),s=>ut(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function Cn(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function ut(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),ut(e[t[0]],t.slice(1),r)}}var Qt={};function y(e,t){Qt[e]=t}function ce(e,t){return Object.entries(Qt).forEach(([r,n])=>{let i=null;function o(){if(i)return i;{let[s,a]=ft(t);return i={interceptor:Se,...s},be(t,a),i}}Object.defineProperty(e,`$${r}`,{get(){return n(t,o())},enumerable:!1})}),e}function er(e,t,r,...n){try{return r(...n)}catch(i){X(i,e,t)}}function X(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} + +${r?'Expression: "'+r+`" + +`:""}`,t),setTimeout(()=>{throw e},0)}var Ae=!0;function Oe(e){let t=Ae;Ae=!1;let r=e();return Ae=t,r}function R(e,t,r={}){let n;return x(e,t)(i=>n=i,r),n}function x(...e){return tr(...e)}var tr=dt;function rr(e){tr=e}function dt(e,t){let r={};ce(r,e);let n=[r,...L(e)],i=typeof t=="function"?Rn(n,t):Mn(n,t,e);return er.bind(null,e,t,i)}function Rn(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(F([n,...e]),i);Te(r,o)}}var pt={};function Nn(e,t){if(pt[e])return pt[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(async()=>{ ${e} })()`:e,o=(()=>{try{return new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`)}catch(s){return X(s,t,e),Promise.resolve()}})();return pt[e]=o,o}function Mn(e,t,r){let n=Nn(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=F([o,...e]);if(typeof n=="function"){let c=n(n,a).catch(l=>X(l,r,t));n.finished?(Te(i,n.result,a,s,r),n.result=void 0):c.then(l=>{Te(i,l,a,s,r)}).catch(l=>X(l,r,t)).finally(()=>n.result=void 0)}}}function Te(e,t,r,n,i){if(Ae&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>Te(e,s,r,n)).catch(s=>X(s,i,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var mt="x-";function O(e=""){return mt+e}function nr(e){mt=e}var ht={};function p(e,t){return ht[e]=t,{before(r){if(!ht[r]){console.warn("Cannot find directive `${directive}`. `${name}` will use the default order of execution");return}let n=H.indexOf(r);H.splice(n>=0?n:H.indexOf("DEFAULT"),0,e)}}}function le(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([a,c])=>({name:a,value:c})),s=_t(o);o=o.map(a=>s.find(c=>c.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(o)}let n={};return t.map(ir((o,s)=>n[o]=s)).filter(or).map(In(n,r)).sort(Dn).map(o=>Pn(e,o))}function _t(e){return Array.from(e).map(ir()).filter(t=>!or(t))}var gt=!1,ue=new Map,sr=Symbol();function ar(e){gt=!0;let t=Symbol();sr=t,ue.set(t,[]);let r=()=>{for(;ue.get(t).length;)ue.get(t).shift()();ue.delete(t)},n=()=>{gt=!1,r()};e(r),n()}function ft(e){let t=[],r=a=>t.push(a),[n,i]=Ht(e);return t.push(i),[{Alpine:j,effect:n,cleanup:r,evaluateLater:x.bind(x,e),evaluate:R.bind(R,e)},()=>t.forEach(a=>a())]}function Pn(e,t){let r=()=>{},n=ht[t.type]||r,[i,o]=ft(e);Yt(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),gt?ue.get(sr).push(n):n())};return s.runCleanups=o,s}var Ce=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Re=e=>e;function ir(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=cr.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var cr=[];function Z(e){cr.push(e)}function or({name:e}){return lr().test(e)}var lr=()=>new RegExp(`^${mt}([^:^.]+)\\b`);function In(e,t){return({name:r,value:n})=>{let i=r.match(lr()),o=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var xt="DEFAULT",H=["ignore","ref","data","id","bind","init","for","model","modelable","transition","show","if",xt,"teleport"];function Dn(e,t){let r=H.indexOf(e.type)===-1?xt:e.type,n=H.indexOf(t.type)===-1?xt:t.type;return H.indexOf(r)-H.indexOf(n)}function q(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}function T(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>T(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)T(n,t,!1),n=n.nextElementSibling}function S(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var ur=!1;function dr(){ur&&S("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),ur=!0,document.body||S("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` --}} + {{-- --}} + {{-- --}} + {{-- --}} + {{-- --}} + + @vite(['resources/css/app.css','resources/js/app.js']) + + + @include('includes.svg') + + @persist('left-menu') + + @endpersist('left-menu') + {{ $slot }} + + + + + diff --git a/resources/views/components/leftbar/leftbar-item.blade.php b/resources/views/components/leftbar/leftbar-item.blade.php new file mode 100644 index 00000000000..07fad4be12c --- /dev/null +++ b/resources/views/components/leftbar/leftbar-item.blade.php @@ -0,0 +1,11 @@ +@props(['icon']) +
  • + + + + {{ $slot }} + + +
  • diff --git a/resources/views/components/meta.blade.php b/resources/views/components/meta.blade.php new file mode 100644 index 00000000000..e700181018f --- /dev/null +++ b/resources/views/components/meta.blade.php @@ -0,0 +1,24 @@ + + + + + + +{{ $pageTitle }} + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/views/components/notifications.blade.php b/resources/views/components/notifications.blade.php new file mode 100644 index 00000000000..de1b4143b5f --- /dev/null +++ b/resources/views/components/notifications.blade.php @@ -0,0 +1,71 @@ +
    + +
    \ No newline at end of file diff --git a/resources/views/components/shortcuts.blade.php b/resources/views/components/shortcuts.blade.php new file mode 100644 index 00000000000..25b487cb1a5 --- /dev/null +++ b/resources/views/components/shortcuts.blade.php @@ -0,0 +1,115 @@ +
    + +
    diff --git a/resources/views/components/update-status.blade.php b/resources/views/components/update-status.blade.php new file mode 100644 index 00000000000..b3322884934 --- /dev/null +++ b/resources/views/components/update-status.blade.php @@ -0,0 +1,3 @@ + + – {{ __('lychee.UPDATE_AVAILABLE') }} + diff --git a/resources/views/components/webauthn/login.blade.php b/resources/views/components/webauthn/login.blade.php new file mode 100644 index 00000000000..2639300744f --- /dev/null +++ b/resources/views/components/webauthn/login.blade.php @@ -0,0 +1,27 @@ +
    + +
    diff --git a/resources/views/includes/svg.blade.php b/resources/views/includes/svg.blade.php index 5a39e4aee90..735e9070773 100644 --- a/resources/views/includes/svg.blade.php +++ b/resources/views/includes/svg.blade.php @@ -1,13 +1,237 @@ - - - - - - - - - - + + + - diff --git a/resources/views/jobs/list.blade.php b/resources/views/jobs.blade.php similarity index 100% rename from resources/views/jobs/list.blade.php rename to resources/views/jobs.blade.php diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index cf46e6ee108..386cc87569e 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -1,13 +1,9 @@ - - - {{ App\Models\Configs::getValueAsString('site_title') }} - - - - - + + + + @include('components.meta.index') @@ -27,11 +23,9 @@ @endif --}} @yield('head-meta') -@livewireStyles - {{ $slot }} @include('includes.svg') - @livewireScripts + {{ $slot }} \ No newline at end of file diff --git a/resources/views/layouts/livewire.blade.php.delete b/resources/views/layouts/livewire.blade.php.delete new file mode 100644 index 00000000000..d2ffef45f40 --- /dev/null +++ b/resources/views/layouts/livewire.blade.php.delete @@ -0,0 +1,37 @@ + + + + + @include('components.meta.index') + + {{-- --}} + {{-- --}} + {{-- --}} + {{-- --}} + {{-- --}} + + @vite(['resources/css/app.css','resources/js/app.js']) + @livewireStyles(['nonce' => csp_nonce('script')]) + + + @include('includes.svg-livewire') + + + + {{ $fullpage }} + + + + @livewireScripts(['nonce' => csp_nonce('script')]) + + {{-- --}} + + {{-- --}} + + \ No newline at end of file diff --git a/resources/views/livewire/components/context-menu.blade.php b/resources/views/livewire/components/context-menu.blade.php new file mode 100644 index 00000000000..ebf8fcfbbc6 --- /dev/null +++ b/resources/views/livewire/components/context-menu.blade.php @@ -0,0 +1,12 @@ +
    +@if($isOpen) +
    + +
    +@endif +
    \ No newline at end of file diff --git a/resources/views/livewire/components/header.blade.php.remove.me b/resources/views/livewire/components/header.blade.php.remove.me new file mode 100644 index 00000000000..27360f251fb --- /dev/null +++ b/resources/views/livewire/components/header.blade.php.remove.me @@ -0,0 +1,91 @@ +
    + @if ($gallery_mode === App\Enum\Livewire\GalleryMode::ALBUMS) + @guest + + + {{ $title }} + + {{-- --}} + + @endguest + @auth + + + {{ $title }} + + {{-- --}} + {{-- --}} + @can(App\Policies\AlbumPolicy::CAN_UPLOAD, [App\Contracts\Models\AbstractAlbum::class, null]) + + @endcan + + @endauth + @elseif ($gallery_mode === App\Enum\Livewire\GalleryMode::ALBUM) + + + {{ $title }} + {{-- @can(App\Policies\AlbumPolicy::CAN_EDIT, [App\Contracts\Models\AbstractAlbum::class], $this->album) + + @endcan + @can(App\Policies\AlbumPolicy::CAN_SHARE_WITH_USERS, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + + @endcan + @can(App\Policies\AlbumPolicy::CAN_EDIT, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + + @endcan + + @can(App\Policies\AlbumPolicy::CAN_DOWNLOAD, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + + @endcan + @if($baseAlbum !== null) + + @endif + + @can(App\Policies\AlbumPolicy::CAN_EDIT, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + + + @endcan --}} + {{-- + --}} + {{-- --}} + @can(App\Policies\AlbumPolicy::CAN_EDIT, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + @if($album instanceof BaseAlbum) + + @endif + @endcan + @can(App\Policies\AlbumPolicy::CAN_UPLOAD, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + + @endcan + + @elseif ($gallery_mode === App\Enum\Livewire\GalleryMode::PHOTO) + + + {{ $title }} + {{-- + + + + + + + + + + + --}} + + + @elseif ($gallery_mode === App\Enum\Livewire\GalleryMode::MAP) + + + {{ $title }} + + @else + + + {{ $title }} + + @endif +
    \ No newline at end of file diff --git a/resources/views/livewire/components/left-menu.blade.php b/resources/views/livewire/components/left-menu.blade.php new file mode 100644 index 00000000000..60fa00811ac --- /dev/null +++ b/resources/views/livewire/components/left-menu.blade.php @@ -0,0 +1,54 @@ + diff --git a/resources/views/livewire/components/modal.blade.php b/resources/views/livewire/components/modal.blade.php new file mode 100644 index 00000000000..ba9a8435dda --- /dev/null +++ b/resources/views/livewire/components/modal.blade.php @@ -0,0 +1,18 @@ +
    +@if($isOpen) +
    + +
    +@endif +
    diff --git a/resources/views/livewire/components/sidebar.blade.php b/resources/views/livewire/components/sidebar.blade.php new file mode 100644 index 00000000000..073fdfdbacd --- /dev/null +++ b/resources/views/livewire/components/sidebar.blade.php @@ -0,0 +1,4 @@ +
    $isOpen])> +@livewire('modules.sidebar.' . $mode) +
    \ No newline at end of file diff --git a/resources/views/livewire/context-menus/album-add.blade.php b/resources/views/livewire/context-menus/album-add.blade.php new file mode 100644 index 00000000000..09ad50c5685 --- /dev/null +++ b/resources/views/livewire/context-menus/album-add.blade.php @@ -0,0 +1,16 @@ +
    + {{ __('lychee.UPLOAD_PHOTO') }} + + {{ __('lychee.IMPORT_LINK') }} + @can(AlbumPolicy::CAN_IMPORT_FROM_SERVER, [App\Contracts\Models\AbstractAlbum::class]) + @if(Configs::getValueAsString('dropbox_key') !== '') + {{ __('lychee.IMPORT_DROPBOX') }} + @endif + {{ __('lychee.IMPORT_SERVER') }} + @endcan + + {{ __('lychee.NEW_ALBUM') }} + @if($params['parentId'] === null) + {{ __('lychee.NEW_TAG_ALBUM') }} + @endif +
    \ No newline at end of file diff --git a/resources/views/livewire/context-menus/move.blade.php b/resources/views/livewire/context-menus/move.blade.php new file mode 100644 index 00000000000..e02058b5722 --- /dev/null +++ b/resources/views/livewire/context-menus/move.blade.php @@ -0,0 +1,27 @@ +
    + {{-- Refactor me later to not use table --}}> + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/resources/views/livewire/context-menus/photos-add.blade.php b/resources/views/livewire/context-menus/photos-add.blade.php new file mode 100644 index 00000000000..63e4868bf34 --- /dev/null +++ b/resources/views/livewire/context-menus/photos-add.blade.php @@ -0,0 +1,15 @@ +
    + {{-- Refactor me later to not use table --}}> + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/add/import-from-server.blade.php b/resources/views/livewire/forms/add/import-from-server.blade.php new file mode 100644 index 00000000000..ba4ef8e90f1 --- /dev/null +++ b/resources/views/livewire/forms/add/import-from-server.blade.php @@ -0,0 +1,44 @@ +
    +
    +

    {{ __('lychee.UPLOAD_IMPORT_SERVER_INSTR') }}

    +
    +
    + +
    +
    $form['import_via_symlink'] === true, + 'text-neutral-200' => $form['import_via_symlink'] === false ])> + + +

    {{ __('lychee.UPLOAD_IMPORT_DELETE_ORIGINALS_EXPL') }}

    +
    +
    $form['delete_imported'] == true, + 'text-neutral-200' => $form['delete_imported'] === false ])> + + +

    {{ __('lychee.UPLOAD_IMPORT_VIA_SYMLINK_EXPL') }}

    +
    +
    + + +

    {{ __('lychee.UPLOAD_IMPORT_SKIP_DUPLICATES_EXPL') }}

    +
    +
    $form['skip_duplicates'] == false, + 'text-neutral-200' => $form['skip_duplicates'] === true ])> + + +

    {{ __('lychee.UPLOAD_IMPORT_RESYNC_METADATA_EXPL') }}

    +
    +
    +
    +
    + {{ __('lychee.CANCEL') }} + {{ __('lychee.UPLOAD_IMPORT') }} +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/add/multiple-file-uploader-chunk.blade.php b/resources/views/livewire/forms/add/multiple-file-uploader-chunk.blade.php new file mode 100644 index 00000000000..5957449e5b3 --- /dev/null +++ b/resources/views/livewire/forms/add/multiple-file-uploader-chunk.blade.php @@ -0,0 +1,48 @@ +
    + + @foreach( $uploads as $i=>$upl ) +
    + + +
    + @endforeach + +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/add/multiple-file-uploader.blade.php b/resources/views/livewire/forms/add/multiple-file-uploader.blade.php new file mode 100644 index 00000000000..baf90b7958f --- /dev/null +++ b/resources/views/livewire/forms/add/multiple-file-uploader.blade.php @@ -0,0 +1,58 @@ +
    +
    + Release file to upload! +
    + +
    +
    +
    +
    + + @if (count($files) > 0) +
      + @for ($i = 0; $i < count($files); $i ++) +
    • thumb{{ $files[$i]->getClientOriginalName() }}
    • + @endfor +
    + @endif + + +
    diff --git a/resources/views/livewire/forms/add/upload.blade.php b/resources/views/livewire/forms/add/upload.blade.php new file mode 100644 index 00000000000..f0cdc7e35fd --- /dev/null +++ b/resources/views/livewire/forms/add/upload.blade.php @@ -0,0 +1,10 @@ +
    +
    + @foreach ($uploadedThumbs as $uploadedThumb) + thumb + @endforeach +
    +
    + +
    +
    diff --git a/resources/views/livewire/forms/album/delete.blade.php b/resources/views/livewire/forms/album/delete.blade.php new file mode 100644 index 00000000000..07560cbab17 --- /dev/null +++ b/resources/views/livewire/forms/album/delete.blade.php @@ -0,0 +1,5 @@ +
    +

    {{ sprintf(__('lychee.DELETE_ALBUM_CONFIRMATION'), $title) }}

    + {{-- TODO add confirmation by typing album name? --}} + {{ __('lychee.DELETE_ALBUM_QUESTION') }} +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/album/move.blade.php b/resources/views/livewire/forms/album/move.blade.php new file mode 100644 index 00000000000..71181a0d2c0 --- /dev/null +++ b/resources/views/livewire/forms/album/move.blade.php @@ -0,0 +1,61 @@ +
    + @if ($title !== null && $title !== '') +

    {{ sprintf(__('lychee.ALBUM_MOVE'), $titleMoved, $title) }}

    + {{ __('lychee.MOVE_ALBUM') }} + @else +
    +
    + {{ "Move to" }} +
    +
    + +
    + + + +
    + +
    + +
    + @if ($this->albumList->count() > 0) + + @else +
    No results for "{{ $search }}"
    + @endif +
    +
    +
    + @endif +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/album/properties.blade.php b/resources/views/livewire/forms/album/properties.blade.php new file mode 100644 index 00000000000..b05ef4805ba --- /dev/null +++ b/resources/views/livewire/forms/album/properties.blade.php @@ -0,0 +1,20 @@ +
    +
    +
    +

    {{ __('lychee.ALBUM_TITLE') }}:

    + + +
    +
    +

    {{ __('lychee.ALBUM_DESCRIPTION') }}:

    + + +
    +
    + {{ __('lychee.ALBUM_ORDERING') }} + + +
    + {{ __('lychee.SAVE') }} +
    +
    diff --git a/resources/views/livewire/forms/album/share-with-line.blade.php b/resources/views/livewire/forms/album/share-with-line.blade.php new file mode 100644 index 00000000000..a42fb0438ad --- /dev/null +++ b/resources/views/livewire/forms/album/share-with-line.blade.php @@ -0,0 +1,18 @@ +
    +

    + @if($album_title !== '') + {{ $album_title }} + @endif + {{ $username }} + + + + + + + + {{ __('lychee.DELETE') }} +

    +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/album/share-with.blade.php b/resources/views/livewire/forms/album/share-with.blade.php new file mode 100644 index 00000000000..3c8a4b7781a --- /dev/null +++ b/resources/views/livewire/forms/album/share-with.blade.php @@ -0,0 +1,93 @@ +
    +
    + @if(count($perms) > 0) +
    +

    + {{ __('lychee.USERNAME') }} + + + + + + + +

    +
    + @endif + @foreach ($perms as $perm) + + @endforeach +
    +
    +
    + @if($username !== null) +

    Select the rights granted: full photo access, download, upload, edit, and delete.

    +
    +

    + + + + + + + + +

    +
    + {{ $username }} + + + + + + + + + + {{ __('lychee.ADD') }} + @else +

    Select the users to share this album with:

    + +
    + + + +
    +
    +
    + @if (count($this->userList) > 0) + + @else +
    No results for "{{ $search }}"
    + @endif +
    + @endif + +
    + + {{-- {{ __('lychee.SAVE') }} --}} +
    diff --git a/resources/views/livewire/forms/album/transfer.blade.php b/resources/views/livewire/forms/album/transfer.blade.php new file mode 100644 index 00000000000..d3d3b8c47bc --- /dev/null +++ b/resources/views/livewire/forms/album/transfer.blade.php @@ -0,0 +1,9 @@ +
    +

    {{ sprintf("Are you sure you want to transfer the ownership of album “%s” and all the photos in contains? + You access to this album and will be lost.", $title) }}
    {{ "This action can’t be undone!" }}

    +
    + {{ "Transfer to" }} + +
    + {{ "Transfer ownership of album and photos" }} +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/album/visibility.blade.php b/resources/views/livewire/forms/album/visibility.blade.php new file mode 100644 index 00000000000..30dfbd2fe38 --- /dev/null +++ b/resources/views/livewire/forms/album/visibility.blade.php @@ -0,0 +1,48 @@ +
    +
    +
    + + +

    {{ __('lychee.ALBUM_PUBLIC_EXPL') }}

    +
    +
    !$is_public, + 'text-neutral-200' => $is_public ])> + + +

    {{ __('lychee.ALBUM_FULL_EXPL') }}

    +
    +
    !$is_public, + 'text-neutral-200' => $is_public ])> + + +

    {{ __('lychee.ALBUM_HIDDEN_EXPL') }}

    +
    +
    !$is_public, + 'text-neutral-200' => $is_public ])> + + +

    {{ __('lychee.ALBUM_DOWNLOADABLE_EXPL') }}

    +
    +
    !$is_public, + 'text-neutral-200' => $is_public ])> + + +

    {{ __('lychee.ALBUM_PASSWORD_PROT_EXPL') }}

    +
    !$is_password_required])> + +
    +
    +
    +
    +
    +
    + + +

    {{ __('lychee.ALBUM_NSFW_EXPL') }}

    +
    +
    +
    diff --git a/resources/views/livewire/forms/confirms/save-all.blade.php b/resources/views/livewire/forms/confirms/save-all.blade.php new file mode 100644 index 00000000000..3a0406da873 --- /dev/null +++ b/resources/views/livewire/forms/confirms/save-all.blade.php @@ -0,0 +1,11 @@ +
    +
    +

    + {{ __('lychee.SETTINGS_ADVANCED_SAVE') }} +

    +
    +
    + {{ __('lychee.CANCEL') }} + {{ __('lychee.CONFIRM') }} +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/default.blade.php b/resources/views/livewire/forms/default.blade.php new file mode 100644 index 00000000000..1db8032017d --- /dev/null +++ b/resources/views/livewire/forms/default.blade.php @@ -0,0 +1,30 @@ +
    +
    +

    {{ $title }}

    +
    + @foreach($form as $f => $v) + {{-- Only display the allowed forms --}} + @if(!in_array($f, $formHidden, true)) + @if (is_string($f)) +
    + + +
    + @else + {{ $f }} not supported yet. + @endif + @endif + @endforeach +
    +
    +
    + {{ $cancel }} + {{ $validate }} +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/photo/delete.blade.php b/resources/views/livewire/forms/photo/delete.blade.php new file mode 100644 index 00000000000..606434fc331 --- /dev/null +++ b/resources/views/livewire/forms/photo/delete.blade.php @@ -0,0 +1,9 @@ +
    +
    +

    {{ sprintf(__('lychee.PHOTO_DELETE_CONFIRMATION'), $title) }}

    +
    +
    + {{ __('lychee.PHOTO_KEEP' ) }} + {{ __('lychee.PHOTO_DELETE') }} +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/photo/download.blade.php b/resources/views/livewire/forms/photo/download.blade.php new file mode 100644 index 00000000000..c3fc7b89ce7 --- /dev/null +++ b/resources/views/livewire/forms/photo/download.blade.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/resources/views/livewire/forms/photo/visibility.blade.php b/resources/views/livewire/forms/photo/visibility.blade.php new file mode 100644 index 00000000000..ae62f68638d --- /dev/null +++ b/resources/views/livewire/forms/photo/visibility.blade.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/resources/views/livewire/forms/profile/get-api-token.blade.php b/resources/views/livewire/forms/profile/get-api-token.blade.php new file mode 100644 index 00000000000..6ee92c81026 --- /dev/null +++ b/resources/views/livewire/forms/profile/get-api-token.blade.php @@ -0,0 +1,22 @@ + diff --git a/resources/views/livewire/forms/profile/manage-second-factor.blade.php b/resources/views/livewire/forms/profile/manage-second-factor.blade.php new file mode 100644 index 00000000000..e58122947f2 --- /dev/null +++ b/resources/views/livewire/forms/profile/manage-second-factor.blade.php @@ -0,0 +1,4 @@ +
    + + {{ __('lychee.DELETE') }} +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/profile/set-login.blade.php b/resources/views/livewire/forms/profile/set-login.blade.php new file mode 100644 index 00000000000..725e8ea1e80 --- /dev/null +++ b/resources/views/livewire/forms/profile/set-login.blade.php @@ -0,0 +1,27 @@ +
    +
    +

    + {{ __('lychee.PASSWORD_TITLE') }} + + +

    +

    + {{ __('lychee.PASSWORD_TEXT') }} + + + + + + +

    +
    + + {{ __('lychee.PASSWORD_CHANGE') }} + + + {{ __('lychee.TOKEN_BUTTON') }} + +
    +
    +
    diff --git a/resources/views/livewire/forms/settings/double-drop-down.blade.php b/resources/views/livewire/forms/settings/double-drop-down.blade.php new file mode 100644 index 00000000000..52232dad7e2 --- /dev/null +++ b/resources/views/livewire/forms/settings/double-drop-down.blade.php @@ -0,0 +1,9 @@ +
    +

    + {{ $begin }} + + {{ $middle }} + + {{ $end }} +

    +
    diff --git a/resources/views/livewire/forms/settings/drop-down.blade.php b/resources/views/livewire/forms/settings/drop-down.blade.php new file mode 100644 index 00000000000..9a50da7b86f --- /dev/null +++ b/resources/views/livewire/forms/settings/drop-down.blade.php @@ -0,0 +1,6 @@ +
    +

    + {{ $description }} + +

    +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/settings/input.blade.php b/resources/views/livewire/forms/settings/input.blade.php new file mode 100644 index 00000000000..1d5388010fc --- /dev/null +++ b/resources/views/livewire/forms/settings/input.blade.php @@ -0,0 +1,9 @@ +
    +

    + {!! $description !!} + +

    +
    + {{ $action }} +
    +
    diff --git a/resources/views/livewire/forms/settings/toggle.blade.php b/resources/views/livewire/forms/settings/toggle.blade.php new file mode 100644 index 00000000000..4a1bcbaac84 --- /dev/null +++ b/resources/views/livewire/forms/settings/toggle.blade.php @@ -0,0 +1,11 @@ +
    +

    + {{ $description }} + +

    + @if($footer !== '') +

    + {!! $footer !!} +

    + @endif +
    diff --git a/resources/views/livewire/modals/about.blade.php b/resources/views/livewire/modals/about.blade.php new file mode 100644 index 00000000000..d1ff17d4d18 --- /dev/null +++ b/resources/views/livewire/modals/about.blade.php @@ -0,0 +1,27 @@ +
    +

    + Lychee + {{ $version }} + @if($is_new_release_available) + + – {{ __('lychee.UPDATE_AVAILABLE') }} + + @elseif($is_git_update_available) + + – {{ __('lychee.UPDATE_AVAILABLE') }} + + @endif +

    +

    {{__("lychee.ABOUT_SUBTITLE") }}

    +

    + {!! sprintf(__("lychee.ABOUT_DESCRIPTION"), "https://LycheeOrg.github.io") !!} +

    +
    diff --git a/resources/views/livewire/modals/login.blade.php b/resources/views/livewire/modals/login.blade.php new file mode 100644 index 00000000000..a6e34a35d57 --- /dev/null +++ b/resources/views/livewire/modals/login.blade.php @@ -0,0 +1,32 @@ +
    +
    + +
    +
    + +
    +
    + +
    +
    +

    + Lychee + @if($version !== null) {{ $version }} @endif + @if($is_new_release_available) + @elseif($is_git_update_available) + @endif +

    +
    +
    + {{ __('lychee.CANCEL') }} + {{ __('lychee.SIGN_IN') }} +
    +
    diff --git a/resources/views/livewire/modules/diagnostics/pre-colored.blade.php b/resources/views/livewire/modules/diagnostics/pre-colored.blade.php new file mode 100644 index 00000000000..4d7f7a21cd0 --- /dev/null +++ b/resources/views/livewire/modules/diagnostics/pre-colored.blade.php @@ -0,0 +1,9 @@ +

    + {{ $title }} + {{ str_repeat('-', Str::length($title)) }} + @forelse($this->data as $line) + {{ $line['type'] }} {{ $line['line'] }} + @empty + {{ $error_msg }} + @endforelse +

    \ No newline at end of file diff --git a/resources/views/livewire/modules/diagnostics/pre.blade.php b/resources/views/livewire/modules/diagnostics/pre.blade.php new file mode 100644 index 00000000000..5dcae84ac0c --- /dev/null +++ b/resources/views/livewire/modules/diagnostics/pre.blade.php @@ -0,0 +1,9 @@ +

    + {{ $title }} + {{ str_repeat('-', Str::length($title)) }} + @forelse($this->data as $line) + {{ $line }} + @empty + {{ $error_msg }} + @endforelse +

    \ No newline at end of file diff --git a/resources/views/livewire/modules/diagnostics/space.blade.php b/resources/views/livewire/modules/diagnostics/space.blade.php new file mode 100644 index 00000000000..7becd6d8795 --- /dev/null +++ b/resources/views/livewire/modules/diagnostics/space.blade.php @@ -0,0 +1,16 @@ +

    + {{ $title }} + {{ str_repeat('-', Str::length($title)) }} +@if(count($space) > 0)@foreach ($space as $spaceLine) + {{ $spaceLine }} +@endforeach +@else + {{ __('lychee.DIAGNOSTICS_GET_SIZE') }}{{ __('lychee.LOADING') }} ... +@endif +

    +
    \ No newline at end of file diff --git a/resources/views/livewire/modules/gallery/sensitive-warning.blade.php b/resources/views/livewire/modules/gallery/sensitive-warning.blade.php new file mode 100644 index 00000000000..c0ba925fcf1 --- /dev/null +++ b/resources/views/livewire/modules/gallery/sensitive-warning.blade.php @@ -0,0 +1,3 @@ +
    $isOpen]) wire:click="close"> + {!! $text !!} +
    \ No newline at end of file diff --git a/resources/views/livewire/modules/profile/second-factor.blade.php b/resources/views/livewire/modules/profile/second-factor.blade.php new file mode 100644 index 00000000000..67f8348d940 --- /dev/null +++ b/resources/views/livewire/modules/profile/second-factor.blade.php @@ -0,0 +1,26 @@ +
    + {{-- 'U2F_NOT_SUPPORTED' => 'U2F not supported. Sorry.', + 'U2F_NOT_SECURE' => 'Environment not secured. U2F not available.', + 'U2F_REGISTER_KEY' => 'Register new device.', + 'U2F_REGISTRATION_SUCCESS' => 'Registration successful!', + 'U2F_AUTHENTIFICATION_SUCCESS' => 'Authentication successful!', + 'U2F_CREDENTIALS' => 'Credentials', + 'U2F_CREDENTIALS_DELETED' => 'Credentials deleted!', --}} +
    +

    + + {{ __('lychee.U2F_CREDENTIALS') }} + +

    +
    + @forelse ($credentials as $credential) + + @empty +
    +

    Credentials list is empty!

    +
    + @endforelse +
    + Register new device. +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/modules/sidebar/album.blade.php b/resources/views/livewire/modules/sidebar/album.blade.php new file mode 100644 index 00000000000..75b926b31af --- /dev/null +++ b/resources/views/livewire/modules/sidebar/album.blade.php @@ -0,0 +1,91 @@ +
    +
    +

    {{ __("lychee.ALBUM_ABOUT") }}

    +
    +
    + + {{-- Refactor me later to not use table --}} + + + {{ $title }} + + + {{ $description }} + + @if ($is_tag_album) + + {!! + implode( + ', ', + array_map( + fn($v) => '' . htmlspecialchars($v) . '', + $showtags + ) + ) + !!} + + @endif + + + + {{-- Refactor me later to not use table --}} + + + {{ $created_at }} + + @if ($children_count > 0) + + {{ $children_count }} + + @endif + @if ($photo_count > 0) + + {{ $photo_count }} + + @endif + @if ($video_count > 0) + + {{ $video_count }} + + @endif + + {{ $sorting_col === '' || $sorting_col === null ? __("lychee.DEFAULT") : ($sorting_col . ' ' . $sorting_order) }} + + + + @if (!$is_tag_album) + + {{-- Refactor me later to not use table --}} + + + + + @endif + @if(Auth::check()) + + {{-- Refactor me later to not use table --}} + + + + + + + {{ $owner_name }} + + + + @endif +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/modules/sidebar/photo.blade.php b/resources/views/livewire/modules/sidebar/photo.blade.php new file mode 100644 index 00000000000..54241e7fc59 --- /dev/null +++ b/resources/views/livewire/modules/sidebar/photo.blade.php @@ -0,0 +1,116 @@ +
    +
    +

    {{ __('lychee.ALBUM_ABOUT') }}

    +

    {{ __('lychee.PHOTO_BASICS') }}

    + {{ __('lychee.PHOTO_TITLE') }} + {{ $title }} + {{ __('lychee.PHOTO_UPLOADED') }} + {{ $created_at }} + @if ($description !== '') + {{ __('lychee.PHOTO_DESCRIPTION') }} +
    + @markdown{{ $description }}@endmarkdown +
    + @endif +

    + {{ $is_video ? __('lychee.PHOTO_VIDEO') : __('lychee.PHOTO_IMAGE') }}

    + {{ __('lychee.PHOTO_SIZE') }} + {{ $filesize }} + @if ($type !== '') + {{ __('lychee.PHOTO_FORMAT') }} + {{ $type }} + @endif + @if ($resolution !== '') + {{ __('lychee.PHOTO_RESOLUTION') }} + {{ $resolution }} + @endif + @if ($duration !== '') + {{ __('lychee.PHOTO_DURATION') }} + {{ $duration }} + @endif + @if ($fps !== '') + {{ __('lychee.PHOTO_FPS') }} + {{ $fps }} fps + @endif + @if (count($tags) > 0) +

    {{ __('lychee.PHOTO_TAGS') }}

    +

    + @foreach ($tags as $tag) + + {{ $tag }} + + @endforeach +

    + @endif + @if ($has_exif) +

    {{ __('lychee.PHOTO_CAMERA') }}

    + @if ($taken_at !== '') + {{ __('lychee.PHOTO_CAPTURED') }} + {{ $taken_at }} + @endif + @if ($make !== '') + {{ __('lychee.PHOTO_MAKE') }} + {{ $make }} + @endif + @if ($model !== '') + {{ __('lychee.PHOTO_TYPE') }} + {{ $model }} + @endif + @if ($lens !== '') + {{ __('lychee.PHOTO_LENS') }} + {{ $lens }} + @endif + @if ($shutter !== '') + {{ __('lychee.PHOTO_SHUTTER') }} + {{ $shutter }} + @endif + @if ($aperture !== '') + {{ __('lychee.PHOTO_APERTURE') }} + ƒ / {{ $aperture }} + @endif + @if ($focal !== '') + {{ __('lychee.PHOTO_FOCAL') }} + {{ $focal }} + @endif + @if ($iso !== '') + {{ sprintf(__('lychee.PHOTO_ISO'), '') }} + {{ $iso }} + @endif + @endif + @if ($has_location) +

    {{ __('lychee.PHOTO_LOCATION') }} +

    + {{ __('lychee.PHOTO_LATITUDE') }} + {{ $latitude }} + {{ __('lychee.PHOTO_LONGITUDE') }} + {{ $longitude }} + {{ __('lychee.PHOTO_ALTITUDE') }} + {{ $altitude }} + @if ($location != null) + {{ __('lychee.PHOTO_LOCATION') }} + {{ $location }} + @endif + @if ($img_direction != null) + {{ __('lychee.PHOTO_IMGDIRECTION') }} + {{ $img_direction }} + @endif + @endif + {{-- + structure.license = { + title: lychee.locale["PHOTO_REUSE"], + type: sidebar.types.DEFAULT, + rows: [{ title: lychee.locale["PHOTO_LICENSE"], kind: "license", value: license, editable: editable }], + }; + --}} + + + {{-- @if (Auth::check()) --}} + {{-- structure.sharing = { + title: lychee.locale["PHOTO_SHARING"], + type: sidebar.types.DEFAULT, + rows: [{ title: lychee.locale["PHOTO_SHR_PLUBLIC"], kind: "public", value: isPublic }], + }; + --}} + {{-- @endif --}} +
    +
    diff --git a/resources/views/livewire/modules/users/user-line.blade.php b/resources/views/livewire/modules/users/user-line.blade.php new file mode 100644 index 00000000000..bba41ab1b16 --- /dev/null +++ b/resources/views/livewire/modules/users/user-line.blade.php @@ -0,0 +1,15 @@ +
    +

    + + + + +

    + @if($this->hasChanged) + {{ __('lychee.SAVE') }} + @elseif($user->may_administrate !== true) + {{ __('lychee.DELETE') }} + @else + + @endif +
    \ No newline at end of file diff --git a/resources/views/livewire/pages/all-settings.blade.php b/resources/views/livewire/pages/all-settings.blade.php new file mode 100644 index 00000000000..379ae014384 --- /dev/null +++ b/resources/views/livewire/pages/all-settings.blade.php @@ -0,0 +1,49 @@ +
    + + + {{ __('lychee.SETTINGS') }} + +
    +
    +
    +

    + {{ __("lychee.SETTINGS_ADVANCED_WARNING_EXPL") }} +

    +
    + @php + $previousCategory = ''; + @endphp + @foreach ($form->configs as $idx => $config) + @if($config->cat !== $previousCategory) +
    +

    {{ $config->cat }}

    +
    + @php + $previousCategory = $config->cat; + @endphp + @endif +
    +

    + {{ $config->key }} + + @foreach ($errors->get('form.values.' . $idx) as $err) + {{ $err }} + @endforeach + @if($config->description !== '') + {{ $config->description }} + @endif +

    +
    + @endforeach + {{ __("lychee.SETTINGS_ADVANCED_SAVE") }} +
    + +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/pages/diagnostics.blade.php b/resources/views/livewire/pages/diagnostics.blade.php new file mode 100644 index 00000000000..2f6548df9c1 --- /dev/null +++ b/resources/views/livewire/pages/diagnostics.blade.php @@ -0,0 +1,14 @@ +
    + + + {{ __('lychee.DIAGNOSTICS') }} + +
    +
    +
    +
    +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/pages/frame.blade.php b/resources/views/livewire/pages/frame.blade.php new file mode 100644 index 00000000000..712de223bdb --- /dev/null +++ b/resources/views/livewire/pages/frame.blade.php @@ -0,0 +1,7 @@ +
    + image background + +
    +
    Random Image
    +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/pages/gallery.blade.php b/resources/views/livewire/pages/gallery.blade.php new file mode 100644 index 00000000000..58c99610ec1 --- /dev/null +++ b/resources/views/livewire/pages/gallery.blade.php @@ -0,0 +1,42 @@ +
    + + + @if($mode === App\Enum\Livewire\GalleryMode::ALBUMS) + + @elseif($mode === App\Enum\Livewire\GalleryMode::ALBUM) + + {{-- @elseif($mode === App\Enum\Livewire\GalleryMode::MAP) + --}} + @endif + @if($mode === App\Enum\Livewire\GalleryMode::PHOTO) + + @endif + + {{-- --}} + + + + + {{-- --}} +
    diff --git a/resources/views/livewire/pages/gallery/album.blade.php b/resources/views/livewire/pages/gallery/album.blade.php new file mode 100644 index 00000000000..d53b86622d4 --- /dev/null +++ b/resources/views/livewire/pages/gallery/album.blade.php @@ -0,0 +1,85 @@ +
    + + + + {{ $album->title }} + {{-- --}} + {{-- --}} + {{-- --}} + {{-- --}} + @can(App\Policies\AlbumPolicy::CAN_EDIT, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + @if ($flags->is_base_album) + + + @endif + @endcan + @can(App\Policies\AlbumPolicy::CAN_UPLOAD, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + + @endcan + +
    + @if ($flags->is_base_album) + @can(App\Policies\AlbumPolicy::CAN_EDIT, [App\Contracts\Models\AbstractAlbum::class, $this->album]) + + @endcan + @endif + @if($num_children > 0 || $num_photos > 0) + + + @endif + @if($num_children === 0 && $num_photos === 0) + + Nothing to see here + + @endif + @if($num_children > 0 && $num_photos > 0)@endif + @if($num_children > 0) + @foreach ($this->album->children as $data)@endforeach + @endif + @if($num_children > 0 && $num_photos > 0)@endif + @if ($flags->is_ready_to_load || $layout !== \App\Enum\Livewire\AlbumMode::JUSTIFIED) +
    $layout === \App\Enum\Livewire\AlbumMode::SQUARE, + 'm-7' => $layout === \App\Enum\Livewire\AlbumMode::JUSTIFIED, + 'masondry' => $layout === \App\Enum\Livewire\AlbumMode::MASONRY, + 'grid' => $layout === \App\Enum\Livewire\AlbumMode::GRID, + ]) + @if ($layout === \App\Enum\Livewire\AlbumMode::JUSTIFIED) + style="height:{{ $this->geometry->containerHeight }}px;" + @endif + > + @for ($i = 0; $i < $num_photos; $i++) + + @endfor +
    + @else + + Loading... + + @endif +
    + +
    diff --git a/resources/views/livewire/pages/gallery/albums.blade.php b/resources/views/livewire/pages/gallery/albums.blade.php new file mode 100644 index 00000000000..cd914d1041f --- /dev/null +++ b/resources/views/livewire/pages/gallery/albums.blade.php @@ -0,0 +1,77 @@ +
    + + + + @guest + + + @endguest + @auth + + @endauth + {{ $title }} + + {{-- --}} + @can(App\Policies\AlbumPolicy::CAN_UPLOAD, [App\Contracts\Models\AbstractAlbum::class, null]) + + @endcan + + +
    + @if ($this->smartAlbums->isEmpty() && $this->albums->isEmpty() && $this->sharedAlbums->isEmpty()) +
    +
    + +

    {{ __('lychee.VIEW_NO_PUBLIC_ALBUMS') }}

    +
    +
    + @else +
    + @if ($this->smartAlbums->count() > 0) + + @foreach ($this->smartAlbums as $album) + + @endforeach + @if ($this->albums->count() > 0) + + @endif + @endif + + @if ($this->albums->count() > 0) + @foreach ($this->albums as $album) + + @endforeach + @endif + + @if ($this->sharedAlbums->count() > 0) + + @foreach ($this->sharedAlbums as $album) + + @endforeach + @endif +
    + @endif + +
    + @guest +
    + +
    + @endguest + +
    diff --git a/resources/views/livewire/pages/gallery/photo.blade.php b/resources/views/livewire/pages/gallery/photo.blade.php new file mode 100644 index 00000000000..40ab04b367e --- /dev/null +++ b/resources/views/livewire/pages/gallery/photo.blade.php @@ -0,0 +1,129 @@ +
    + + + + {{ $photo->title }} + {{-- + + + + + + + + + + + --}} + {{-- --}} + + + + +
    +
    +
    + @if ($photo->isVideo()) + {{-- This is a video file: put html5 player --}} + + @elseif($photo->isRaw()) + {{-- This is a raw file: put a place holder --}} + big + @elseif ($photo->live_photo_short_path === null) + {{-- This is a normal image: medium or original --}} + @if ($photo->size_variants->getMedium() !== null) + mediumsize_variants->getMedium2x() !== null) srcset='{{ URL::asset($photo->size_variants->getMedium()->url) }} {{ $photo->size_variants->getMedium()->width }}w, + {{ URL::asset($photo->size_variants->getMedium2x()->url) }} {{ $photo->size_variants->getMedium2x()->width }}w' @endif + data-tabindex='{{ Helpers::data_index() }}' /> + @else + big + @endif + @elseif ($photo->size_variants->getMedium() !== null) + {{-- This is a livephoto : medium --}} +
    +
    + @else + {{-- This is a livephoto : full --}} +
    +
    + @endif + + {{-- --}} + {{-- --}} + {{-- --}} +
    + @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) +
    + + + @if($flags->can_rotate) + + + @endif + + +
    + @endcan +
    + +
    +
    diff --git a/resources/views/livewire/pages/jobs.blade.php b/resources/views/livewire/pages/jobs.blade.php new file mode 100644 index 00000000000..743db966693 --- /dev/null +++ b/resources/views/livewire/pages/jobs.blade.php @@ -0,0 +1,24 @@ +
    + + + {{ __('lychee.JOBS') }} + +
    +
    + @forelse($this->jobs as $job) + {{ $job->created_at }} + @if($job->status->name() === 'success') +
    {{ str_pad($job->status->name(), 7) }}
    + @else +
    {{ str_pad($job->status->name(), 7) }}
    + @endif + {{ $job->owner->name }} + {{ $job->title ?? __('lychee.UNSORTED') }} + {{ $job->job }} +
    + @empty + No Jobs have been executed yet. + @endforelse +
    +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/pages/landing.blade.php b/resources/views/livewire/pages/landing.blade.php new file mode 100644 index 00000000000..387eafa0ae5 --- /dev/null +++ b/resources/views/livewire/pages/landing.blade.php @@ -0,0 +1,44 @@ +
    + @once + + + @endonce + + + + + +
    +
    +

    {{ $title }}

    +

    {{ $subtitle }}

    +
    +
    + +
    +
    +
      +
    • +
      + +
    • +
    +
    +
    + + + {{-- --}} + diff --git a/resources/views/livewire/pages/profile.blade.php b/resources/views/livewire/pages/profile.blade.php new file mode 100644 index 00000000000..386eea773cc --- /dev/null +++ b/resources/views/livewire/pages/profile.blade.php @@ -0,0 +1,22 @@ +
    + + + {{ __('lychee.PROFILE') }} + +
    +
    + + @if($are_notification_active) +
    +

    + {{ __('lychee.USER_EMAIL_INSTRUCTION') }} +

    +
    + + @endif + @can(App\Policies\UserPolicy::CAN_USE_2FA, [App\Models\User::class, null]) + + @endcan +
    +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/pages/settings.blade.php b/resources/views/livewire/pages/settings.blade.php new file mode 100644 index 00000000000..52132fc4d00 --- /dev/null +++ b/resources/views/livewire/pages/settings.blade.php @@ -0,0 +1,55 @@ +
    + + + {{ __('lychee.SETTINGS') }} + +
    +
    + + + + + + + + + + + + + + + + + + + + +
    +

    {{ __('lychee.CSS_TEXT') }}

    + +
    + Change CSS +
    +
    + +
    + {{ __('lychee.MORE') }} +
    +
    + +
    +
    \ No newline at end of file diff --git a/resources/views/livewire/pages/sharing.blade.php b/resources/views/livewire/pages/sharing.blade.php new file mode 100644 index 00000000000..149392b11f3 --- /dev/null +++ b/resources/views/livewire/pages/sharing.blade.php @@ -0,0 +1,51 @@ +
    + + + {{ __('lychee.SHARING') }} + +
    +
    +
    +

    + This page allows to have an overview and edit the sharing rights associated with albums. +

      +
    • : grants full photo access
    • +
    • : grants download
    • +
    • : grants upload
    • +
    • + : grants edit
    • +
    • + : grants delete
    • +
    +

    +
    +
    +
    +

    + {{ __('lychee.ALBUM_TITLE') }} + {{ __('lychee.USERNAME') }} + + + + + + + +

    +
    + @forelse ($this->perms as $perm) + + @empty +

    + Sharing list is empty +

    + @endforelse +
    +
    +
    +
    diff --git a/resources/views/livewire/pages/users.blade.php b/resources/views/livewire/pages/users.blade.php new file mode 100644 index 00000000000..b8f88ddbca5 --- /dev/null +++ b/resources/views/livewire/pages/users.blade.php @@ -0,0 +1,55 @@ +
    + + + {{ __('lychee.USERS') }} + +
    +
    +
    +

    + This pages allows you to manage users. +

      +
    • + : When selected, the user can upload content.
    • +
    • + : When selected, the user can modify their profile (username, password).
    • +
    +

    + +
    +
    +

    + {{ __('lychee.USERNAME') }} + {{ __('lychee.LOGIN_PASSWORD') }} + + + + + + +

    + +
    + @foreach ($this->users as $user) + + @endforeach + +
    +

    + + + + +

    + {{ __('lychee.CREATE') }} +
    +
    +
    +
    diff --git a/resources/views/vendor/livewire/simple-tailwind.blade.php b/resources/views/vendor/livewire/simple-tailwind.blade.php new file mode 100644 index 00000000000..e4c0c63bcc5 --- /dev/null +++ b/resources/views/vendor/livewire/simple-tailwind.blade.php @@ -0,0 +1,45 @@ +
    + @if ($paginator->hasPages()) + + @endif +
    diff --git a/resources/views/vendor/livewire/tailwind.blade.php b/resources/views/vendor/livewire/tailwind.blade.php new file mode 100644 index 00000000000..47b06ce901f --- /dev/null +++ b/resources/views/vendor/livewire/tailwind.blade.php @@ -0,0 +1,114 @@ +
    + @if ($paginator->hasPages()) + + @endif +
    diff --git a/routes/api.php b/routes/api.php index 433760831e8..1c3347e19b9 100644 --- a/routes/api.php +++ b/routes/api.php @@ -47,6 +47,7 @@ Route::post('/Album::setLicense', [AlbumController::class, 'setLicense']); Route::post('/Album::setSorting', [AlbumController::class, 'setSorting']); Route::get('/Album::getArchive', [AlbumController::class, 'getArchive']) + ->name('download') ->withoutMiddleware(['content_type:json', 'accept_content_type:json']) ->middleware(['local_storage', 'accept_content_type:any']); Route::post('/Album::setTrack', [AlbumController::class, 'setTrack']) diff --git a/routes/web-livewire.php b/routes/web-livewire.php new file mode 100644 index 00000000000..c55eb6bd1ac --- /dev/null +++ b/routes/web-livewire.php @@ -0,0 +1,54 @@ +group(function () { + Route::get('/livewire/landing', Landing::class)->name('landing'); + Route::get('/livewire/all-settings', AllSettings::class)->name('all-settings'); + Route::get('/livewire/settings', Settings::class)->name('settings'); + Route::get('/livewire/profile', Profile::class)->name('profile'); + Route::get('/livewire/users', Users::class)->name('users'); + Route::get('/livewire/sharing', Sharing::class)->name('sharing'); + Route::get('/livewire/jobs', Jobs::class)->name('jobs'); + Route::get('/livewire/diagnostics', Diagnostics::class)->name('diagnostics'); + Route::get('/livewire/gallery/', Albums::class)->name('livewire-gallery'); + Route::get('/livewire/gallery/{albumId}/', Album::class)->name('livewire-gallery-album'); + Route::get('/livewire/gallery/{albumId}/{photoId}', Photo::class)->name('livewire-gallery-photo'); + // Route::get('/livewire/{page?}/{albumId?}/{photoId?}', Index::class) + + Route::get('/livewire', function () { + return redirect(Configs::getValueAsBool('landing_page_enable') ? route('landing') : route('livewire-gallery')); + }); + }); +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000000..ecf481f203d --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,92 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./resources/**/*.blade.php", + "./resources/**/*.js", + "./resources/**/*.vue", + ], + theme: { + extend: {}, + }, + plugins: [], +}/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./resources/**/*.blade.php", + "./resources/**/*.js", + "./resources/**/*.vue", + ], + theme: { + extend: { + colors: { + dark: { + // 50: '#fdf8f6', + // 100: '#f2e8e5', + // 200: '#eaddd7', + // 300: '#e0cec7', + // 400: '#d2bab0', + // 500: '#bfa094', + // 600: '#a18072', + 200: '#c0c0c0', + 300: '#404040', + 400: '#303030', + 500: '#252525', + 600: '#202020', + 700: '#1d1d1d', + 800: '#1a1a1a', + 850: '#101010', + 900: '#0f0f0f', + }, + }, + flexShrink: { + 2: '2' + }, + keyframes: { + fadeIn: { + '0%': { 'opacity': '0' }, + '100%': { 'opacity': '1' } + }, + fadeOut: { + '0%': { 'opacity': '1' }, + '100%': { 'opacity': '0' } + }, + moveBackground: { + '0%': { 'background-position-x': '0px' }, + '100%': { 'background-position-x': '-100px' } + }, + moveUp: { + '0%': {'transform': 'translateY(80px)'}, + '100%': {'transform': 'translateY(0)'} + }, + zoomIn: { + '0%': { + 'opacity': '0', + 'transform': 'scale(0.8)' + }, + '100%': { + 'opacity': '1', + 'transform': 'scale(1)' + } + }, + zoomOut: { + '0%': { + 'opacity': '1', + 'transform': 'scale(1)' + }, + '100%': { + 'opacity': '0', + 'transform': 'scale(0.8)' + } + } + }, + animation: { + 'fadeIn': 'fadeIn 0.3s forwards cubic-bezier(0.51, 0.92, 0.24, 1)', + 'fadeOut': 'fadeOut 0.3s forwards cubic-bezier(0.51, 0.92, 0.24, 1)', + 'zoomIn': 'zoomIn 0.2s forwards cubic-bezier(0.51, 0.92, 0.24, 1)', + 'zoomOut': 'zoomOut 0.2s forwards cubic-bezier(0.51, 0.92, 0.24, 1)', + 'moveUp': 'moveUp 0.3s forwards cubic-bezier(0.51, 0.92, 0.24, 1)' + } + }, + }, + plugins: [], +} \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 00000000000..431156f1f6b --- /dev/null +++ b/vite.config.js @@ -0,0 +1,24 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: ['resources/css/app.css', 'resources/js/app.js'], + refresh: true, + }), + ], + server: { + watch: { + ignored: [ + "**/.*/**", + "**/database/**", + "**/node_modules/**", + "**/public/**", + "**/storage/**", + "**/tests/**", + "**/vendor/**", + ], + }, + } +}); diff --git a/webpack.mix.js b/webpack.mix.js index 0dc2605a745..fa8442795b5 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -10,7 +10,15 @@ let mix = require('laravel-mix'); | file for the application as well as bundling up all the JS files. | */ +// mix.options({ +// legacyNodePolyfills: true +// }); mix.js('resources/assets/js/app.js', 'public/js') + .copy('resources/js/vendor/alpine.min.js', 'public/js') + .copy('resources/js/vendor/filepond.js', 'public/js') + .copy('resources/js/vendor/justified-layout.min.js', 'public/js') + .js('resources/js/vendor/webauthn/webauthn.js', 'public/js') + .css('resources/css/filepond.css', 'public/css') .sass('resources/assets/scss/app.scss', 'public/css') .options({ processCssUrls: false }); From d467118628b0e7e601861cf32a9777ac0d6129f7 Mon Sep 17 00:00:00 2001 From: ildyria Date: Mon, 21 Aug 2023 21:12:37 +0200 Subject: [PATCH 002/226] fix stupid --- app/Policies/AlbumPolicy.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Policies/AlbumPolicy.php b/app/Policies/AlbumPolicy.php index 064de4e7e88..5e943465260 100644 --- a/app/Policies/AlbumPolicy.php +++ b/app/Policies/AlbumPolicy.php @@ -26,7 +26,6 @@ class AlbumPolicy extends BasePolicy public const CAN_DELETE = 'canDelete'; public const CAN_UPLOAD = 'canUpload'; public const CAN_EDIT = 'canEdit'; - public const CAN_DELETE = 'canDelete'; public const CAN_EDIT_ID = 'canEditById'; public const CAN_SHARE_WITH_USERS = 'canShareWithUsers'; public const CAN_IMPORT_FROM_SERVER = 'canImportFromServer'; From 69a503c551152029d81142ec5587bc01af339b5e Mon Sep 17 00:00:00 2001 From: ildyria Date: Mon, 21 Aug 2023 23:06:24 +0200 Subject: [PATCH 003/226] fix U2F --- .../Forms/Profile/ManageSecondFactor.php | 29 ++++---- .../Components/Forms/Profile/SecondFactor.php | 57 +++++++++++++++ .../Modules/Profile/SecondFactor.php | 71 ------------------- resources/js/app.js | 38 ++++++++-- .../views/components/webauthn/login.blade.php | 2 +- .../profile/manage-second-factor.blade.php | 4 +- .../modules/profile/second-factor.blade.php | 25 ++++--- .../views/livewire/pages/profile.blade.php | 2 +- 8 files changed, 123 insertions(+), 105 deletions(-) create mode 100644 app/Livewire/Components/Forms/Profile/SecondFactor.php delete mode 100644 app/Livewire/Components/Modules/Profile/SecondFactor.php diff --git a/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php index 9550cfce0f5..5a4e6350c37 100644 --- a/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php +++ b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php @@ -2,8 +2,8 @@ namespace App\Livewire\Components\Forms\Profile; -use App\Livewire\Components\Modules\Profile\SecondFactor; use App\Livewire\Traits\Notify; +use App\Livewire\Traits\UseValidator; use Illuminate\Contracts\View\View; use Illuminate\Support\Str; use Laragear\WebAuthn\Models\WebAuthnCredential; @@ -12,6 +12,7 @@ class ManageSecondFactor extends Component { use Notify; + use UseValidator; /** * Credential used. @@ -22,6 +23,11 @@ class ManageSecondFactor extends Component /** @var string alias to rename the credentials. By default we provide the first parts of the ID */ public string $alias; // ! wired + public bool $has_error = false; + + public function rules() { + return ['alias' => 'required|string|min:5|max:255']; + } /** * Just mount the component with the required WebAuthn Credentials. @@ -56,23 +62,14 @@ public function render(): View */ public function updated($field, $value): void { - // TODO: ADD VALIDATION + if (!$this->areValid($this->rules())) { + $this->has_error = true; + return; + } + + $this->has_error = false; $this->credential->alias = $this->alias; $this->credential->save(); $this->notify(__('lychee.CHANGE_SUCCESS')); } - - /** - * Deletes a user. - * - * The albums and photos owned by the user are re-assigned to the - * admin user. - * - * @return void - */ - public function delete(): void - { - $this->credential->delete(); - $this->dispatch('loadCredentials')->to(SecondFactor::class); - } } diff --git a/app/Livewire/Components/Forms/Profile/SecondFactor.php b/app/Livewire/Components/Forms/Profile/SecondFactor.php new file mode 100644 index 00000000000..f712d2b13f5 --- /dev/null +++ b/app/Livewire/Components/Forms/Profile/SecondFactor.php @@ -0,0 +1,57 @@ + + * + * @throws UnauthenticatedException + */ + public function getCredentialsProperty(): Collection + { + /** @var \App\Models\User $user */ + $user = Auth::user() ?? throw new UnauthenticatedException(); + + return $user->webAuthnCredentials; + } + + /** + * Delete an existing credential + * + * @param string $id + * @return void + * @throws InvalidArgumentException + */ + public function delete(string $id): void + { + WebAuthnCredential::query()->where('id', '=', $id)->delete(); + $this->notify(__('lychee.U2F_CREDENTIALS_DELETED')); + } +} diff --git a/app/Livewire/Components/Modules/Profile/SecondFactor.php b/app/Livewire/Components/Modules/Profile/SecondFactor.php deleted file mode 100644 index 124b028e74b..00000000000 --- a/app/Livewire/Components/Modules/Profile/SecondFactor.php +++ /dev/null @@ -1,71 +0,0 @@ -loadCredentials(); - } - - /** - * Rendering of the front-end. - * - * @return View - */ - public function render(): View - { - return view('livewire.modules.profile.second-factor'); - } - - /** - * Fetch the credentials of the current user. - * - * @return void - * - * @throws \RuntimeException - * @throws UnauthenticatedException - */ - public function loadCredentials(): void - { - /** @var \App\Models\User $user */ - $user = Auth::user() ?? throw new UnauthenticatedException(); - - $this->credentials = $user->webAuthnCredentials; - } - - /** - * Create a new U2F credential. - * - * @return void - */ - public function create(): void - { - // TODO: create token - // reset attributes and reload user list (triggers refresh) - $this->loadCredentials(); - } -} diff --git a/resources/js/app.js b/resources/js/app.js index 68524f7e079..e893a29a41e 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -13,32 +13,62 @@ Mousetrap.addKeycodes({ document.addEventListener('alpine:init', () => { Alpine.data('loginWebAuthn', - (success_msg_val, error_msg_val) => ({ + (success_msg_val = "U2F_AUTHENTIFICATION_SUCCESS", error_msg_val = "ERROR_TEXT", not_supported_val = "U2F_NOT_SUPPORTED") => ({ webAuthnOpen: false, success_msg: success_msg_val, error_msg: error_msg_val, + not_supported: not_supported_val, isWebAuthnUnavailable() { return !window.isSecureContext && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1'; }, login() { - console.log('hello There'); + // work around because this does not refer to alpine anymore when inside WebAuthn then context. + let alpine = this new WebAuthn({ login: "/api/WebAuthn::login", loginOptions: "/api/WebAuthn::login/options" }, {}, false) .login({ user_id: 1 }) .then(function () { - this.$dispatch("notify", [{ type: "success", msg: this.success_msg }]); + alpine.$dispatch("notify", [{ type: "success", msg: alpine.success_msg }]); window.location.reload(); }) .catch(() => this.$dispatch("notify", [{ type: "error", msg: this.error_msg }])); } }) ) + + Alpine.data('registerWebAuthn', + (success_msg_val = "U2F_REGISTRATION_SUCCESS", error_msg_val = "ERROR_TEXT", not_supported_val = "U2F_NOT_SUPPORTED") => ({ + success_msg: success_msg_val, + error_msg: error_msg_val, + not_supported: not_supported_val, + + isWebAuthnUnavailable() { + return !window.isSecureContext && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1'; + }, + + register() { + // work around because this does not refer to alpine anymore when inside WebAuthn then context. + let alpine = this + new WebAuthn({ register: "/api/WebAuthn::register", registerOptions: "/api/WebAuthn::register/options" }, {}, false) + .register() + .then(function () { + // First reload then display + alpine.$dispatch("reload-component"); + alpine.$dispatch("notify", [{ type: "success", msg: alpine.success_msg }]); + }) + .catch((error) => { + console.log(error); + this.$dispatch("notify", [{ type: "error", msg: this.error_msg }]); + }); + } + }) + ) }) - // Alpine.bind('openLeftMenu', () => ({ '@click'() { leftMenuOpen = ! leftMenuOpen }})) +// Alpine.bind('openLeftMenu', () => ({ '@click'() { leftMenuOpen = ! leftMenuOpen }})) // }) // Mousetrap // .bind(["l"], function () { diff --git a/resources/views/components/webauthn/login.blade.php b/resources/views/components/webauthn/login.blade.php index 2639300744f..d50dc755488 100644 --- a/resources/views/components/webauthn/login.blade.php +++ b/resources/views/components/webauthn/login.blade.php @@ -1,7 +1,7 @@
    - - {{ __('lychee.DELETE') }} + + {{ __('lychee.DELETE') }}
    \ No newline at end of file diff --git a/resources/views/livewire/modules/profile/second-factor.blade.php b/resources/views/livewire/modules/profile/second-factor.blade.php index 67f8348d940..f1df314a3e1 100644 --- a/resources/views/livewire/modules/profile/second-factor.blade.php +++ b/resources/views/livewire/modules/profile/second-factor.blade.php @@ -1,11 +1,13 @@ -
    - {{-- 'U2F_NOT_SUPPORTED' => 'U2F not supported. Sorry.', +
    + {{-- + 'U2F_NOT_SUPPORTED' => 'U2F not supported. Sorry.', 'U2F_NOT_SECURE' => 'Environment not secured. U2F not available.', 'U2F_REGISTER_KEY' => 'Register new device.', 'U2F_REGISTRATION_SUCCESS' => 'Registration successful!', - 'U2F_AUTHENTIFICATION_SUCCESS' => 'Authentication successful!', - 'U2F_CREDENTIALS' => 'Credentials', - 'U2F_CREDENTIALS_DELETED' => 'Credentials deleted!', --}} + 'U2F_CREDENTIALS_DELETED' => 'Credentials deleted!', + --}}

    @@ -13,14 +15,17 @@

    - @forelse ($credentials as $credential) - + @forelse ($this->credentials as $credential) + @empty -
    +

    Credentials list is empty!

    @endforelse -
    - Register new device. +
    +

    {{ __('lychee.U2F_NOT_SECURE') }}

    +
    +
    + Register new device.
    \ No newline at end of file diff --git a/resources/views/livewire/pages/profile.blade.php b/resources/views/livewire/pages/profile.blade.php index 386eea773cc..68f59f71ad5 100644 --- a/resources/views/livewire/pages/profile.blade.php +++ b/resources/views/livewire/pages/profile.blade.php @@ -15,7 +15,7 @@ @endif @can(App\Policies\UserPolicy::CAN_USE_2FA, [App\Models\User::class, null]) - + @endcan
    From 2b137a94b994217407f660fec88be1e5421c39aa Mon Sep 17 00:00:00 2001 From: ildyria Date: Mon, 21 Aug 2023 23:07:59 +0200 Subject: [PATCH 004/226] formatting --- .../Forms/Profile/ManageSecondFactor.php | 4 +++- .../Components/Forms/Profile/SecondFactor.php | 19 ++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php index 5a4e6350c37..8337e420b53 100644 --- a/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php +++ b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php @@ -25,7 +25,8 @@ class ManageSecondFactor extends Component public string $alias; // ! wired public bool $has_error = false; - public function rules() { + public function rules() + { return ['alias' => 'required|string|min:5|max:255']; } @@ -64,6 +65,7 @@ public function updated($field, $value): void { if (!$this->areValid($this->rules())) { $this->has_error = true; + return; } diff --git a/app/Livewire/Components/Forms/Profile/SecondFactor.php b/app/Livewire/Components/Forms/Profile/SecondFactor.php index f712d2b13f5..9cdfc69a283 100644 --- a/app/Livewire/Components/Forms/Profile/SecondFactor.php +++ b/app/Livewire/Components/Forms/Profile/SecondFactor.php @@ -7,7 +7,6 @@ use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\Auth; use Illuminate\View\View; -use InvalidArgumentException; use Laragear\WebAuthn\Models\WebAuthnCredential; use Livewire\Attributes\On; use Livewire\Component; @@ -29,10 +28,10 @@ public function render(): View /** * Return the list of credentials associated to the current logged in user. - * + * * @return Collection - * - * @throws UnauthenticatedException + * + * @throws UnauthenticatedException */ public function getCredentialsProperty(): Collection { @@ -43,11 +42,13 @@ public function getCredentialsProperty(): Collection } /** - * Delete an existing credential - * - * @param string $id - * @return void - * @throws InvalidArgumentException + * Delete an existing credential. + * + * @param string $id + * + * @return void + * + * @throws \InvalidArgumentException */ public function delete(string $id): void { From c50e30d184861ddd637708f140d6a9276362cb51 Mon Sep 17 00:00:00 2001 From: ildyria Date: Mon, 21 Aug 2023 23:09:11 +0200 Subject: [PATCH 005/226] fix phpstan --- app/Livewire/Components/Forms/Profile/ManageSecondFactor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php index 8337e420b53..749223d31d4 100644 --- a/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php +++ b/app/Livewire/Components/Forms/Profile/ManageSecondFactor.php @@ -25,7 +25,7 @@ class ManageSecondFactor extends Component public string $alias; // ! wired public bool $has_error = false; - public function rules() + public function rules(): array { return ['alias' => 'required|string|min:5|max:255']; } From d01e624bae9631cec3a44d1575e4a0a0046e2959 Mon Sep 17 00:00:00 2001 From: ildyria Date: Thu, 31 Aug 2023 19:53:43 +0200 Subject: [PATCH 006/226] fix login for multiple users --- .../WebAuthn/WebAuthnLoginController.php | 10 +- .../Components/Pages/Gallery/Albums.php | 8 + app/Policies/UserPolicy.php | 2 +- composer.lock | 448 +++++++++--------- resources/js/app.js | 22 +- .../views/components/webauthn/login.blade.php | 23 +- .../modules/profile/second-factor.blade.php | 2 +- .../livewire/pages/gallery/albums.blade.php | 2 + 8 files changed, 275 insertions(+), 242 deletions(-) diff --git a/app/Http/Controllers/WebAuthn/WebAuthnLoginController.php b/app/Http/Controllers/WebAuthn/WebAuthnLoginController.php index 34b7d5b9014..d428f5f1c47 100644 --- a/app/Http/Controllers/WebAuthn/WebAuthnLoginController.php +++ b/app/Http/Controllers/WebAuthn/WebAuthnLoginController.php @@ -27,7 +27,15 @@ class WebAuthnLoginController */ public function options(AssertionRequest $request): Responsable { - return $request->toVerify($request->validate(['user_id' => 'sometimes|int'])['user_id'] ?? null); + $fields = $request->validate([ + 'user_id' => 'sometimes|int', + 'username' => 'sometimes|string' + ]); + + $username = $fields['username'] ?? null; + $authenticatable = $fields['user_id'] ?? ($username !== null ? ['username' => $username] : null); + + return $request->toVerify($authenticatable); } /** diff --git a/app/Livewire/Components/Pages/Gallery/Albums.php b/app/Livewire/Components/Pages/Gallery/Albums.php index 0528634b54b..58fa7dd7ad7 100644 --- a/app/Livewire/Components/Pages/Gallery/Albums.php +++ b/app/Livewire/Components/Pages/Gallery/Albums.php @@ -10,7 +10,10 @@ use App\Models\Configs; use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Auth; use Illuminate\View\View; +use Laragear\WebAuthn\Models\WebAuthnCredential; +use Laragear\WebAuthn\WebAuthn; use Livewire\Attributes\On; use Livewire\Attributes\Renderless; use Livewire\Component; @@ -28,6 +31,7 @@ class Albums extends Component implements Reloadable public string $title; public bool $nsfwAlbumsVisible; + public bool $can_use_2fa; /** * Render component. @@ -41,6 +45,10 @@ public function render(): View return view('livewire.pages.gallery.albums'); } + public function mount() { + $this->can_use_2fa = !Auth::check() && (WebAuthnCredential::query()->whereNull('disabled_at')->count() > 0); + } + #[On('reloadPage')] public function reloadPage(): void { diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index b3b64c6fd45..40154618552 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -41,7 +41,7 @@ public function canList(User $user): bool */ public function canUse2FA(User $user): bool { - return false; + return true; } /** diff --git a/composer.lock b/composer.lock index d12704bb30c..77ec8492202 100644 --- a/composer.lock +++ b/composer.lock @@ -1417,22 +1417,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.7.0", + "version": "7.8.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5" + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/fb7566caccf22d74d1ab270de3551f72a58399f5", - "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9", + "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0", - "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -1523,7 +1523,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.7.0" + "source": "https://github.com/guzzle/guzzle/tree/7.8.0" }, "funding": [ { @@ -1539,7 +1539,7 @@ "type": "tidelift" } ], - "time": "2023-05-21T14:04:53+00:00" + "time": "2023-08-27T10:20:53+00:00" }, { "name": "guzzlehttp/promises", @@ -1626,16 +1626,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.6.0", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77" + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/8bd7c33a0734ae1c5d074360512beb716bef3f77", - "reference": "8bd7c33a0734ae1c5d074360512beb716bef3f77", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727", + "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727", "shasum": "" }, "require": { @@ -1722,7 +1722,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.0" + "source": "https://github.com/guzzle/psr7/tree/2.6.1" }, "funding": [ { @@ -1738,20 +1738,20 @@ "type": "tidelift" } ], - "time": "2023-08-03T15:06:02+00:00" + "time": "2023-08-27T10:13:57+00:00" }, { "name": "guzzlehttp/uri-template", - "version": "v1.0.1", + "version": "v1.0.2", "source": { "type": "git", "url": "https://github.com/guzzle/uri-template.git", - "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2" + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/uri-template/zipball/b945d74a55a25a949158444f09ec0d3c120d69e2", - "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/61bf437fc2197f587f6857d3ff903a24f1731b5d", + "reference": "61bf437fc2197f587f6857d3ff903a24f1731b5d", "shasum": "" }, "require": { @@ -1759,15 +1759,11 @@ "symfony/polyfill-php80": "^1.17" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", "phpunit/phpunit": "^8.5.19 || ^9.5.8", "uri-template/tests": "1.0.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, "autoload": { "psr-4": { "GuzzleHttp\\UriTemplate\\": "src" @@ -1806,7 +1802,7 @@ ], "support": { "issues": "https://github.com/guzzle/uri-template/issues", - "source": "https://github.com/guzzle/uri-template/tree/v1.0.1" + "source": "https://github.com/guzzle/uri-template/tree/v1.0.2" }, "funding": [ { @@ -1822,7 +1818,7 @@ "type": "tidelift" } ], - "time": "2021-10-07T12:57:01+00:00" + "time": "2023-08-27T10:19:19+00:00" }, { "name": "laminas/laminas-servicemanager", @@ -2119,16 +2115,16 @@ }, { "name": "laravel/framework", - "version": "v10.19.0", + "version": "v10.21.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb" + "reference": "96b15c7ac382a9adb4a56d40c640e782d669a112" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb", - "reference": "b8557e4a708a1bd2bc8229bd53feecfa2ac1c6fb", + "url": "https://api.github.com/repos/laravel/framework/zipball/96b15c7ac382a9adb4a56d40c640e782d669a112", + "reference": "96b15c7ac382a9adb4a56d40c640e782d669a112", "shasum": "" }, "require": { @@ -2315,20 +2311,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2023-08-15T13:42:57+00:00" + "time": "2023-08-29T13:55:56+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.5", + "version": "v0.1.6", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "d880a909df144a4bf5760ebd09aba114f79d9adc" + "reference": "b514c5620e1b3b61221b0024dc88def26d9654f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/d880a909df144a4bf5760ebd09aba114f79d9adc", - "reference": "d880a909df144a4bf5760ebd09aba114f79d9adc", + "url": "https://api.github.com/repos/laravel/prompts/zipball/b514c5620e1b3b61221b0024dc88def26d9654f4", + "reference": "b514c5620e1b3b61221b0024dc88def26d9654f4", "shasum": "" }, "require": { @@ -2361,9 +2357,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.5" + "source": "https://github.com/laravel/prompts/tree/v0.1.6" }, - "time": "2023-08-15T14:29:44+00:00" + "time": "2023-08-18T13:32:23+00:00" }, { "name": "laravel/serializable-closure", @@ -2427,16 +2423,16 @@ }, { "name": "league/commonmark", - "version": "2.4.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048" + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d44a24690f16b8c1808bf13b1bd54ae4c63ea048", - "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3669d6d5f7a47a93c08ddff335e6d945481a1dd5", + "reference": "3669d6d5f7a47a93c08ddff335e6d945481a1dd5", "shasum": "" }, "require": { @@ -2529,7 +2525,7 @@ "type": "tidelift" } ], - "time": "2023-03-24T15:16:10+00:00" + "time": "2023-08-30T16:55:00+00:00" }, { "name": "league/config", @@ -2819,16 +2815,16 @@ }, { "name": "livewire/livewire", - "version": "v3.0.0-beta.10", + "version": "v3.0.1", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "526bda01304b16908d029f2010504957d8c46e05" + "reference": "2e426e8d47e03c4777334ec0c8397341bcfa15f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/526bda01304b16908d029f2010504957d8c46e05", - "reference": "526bda01304b16908d029f2010504957d8c46e05", + "url": "https://api.github.com/repos/livewire/livewire/zipball/2e426e8d47e03c4777334ec0c8397341bcfa15f3", + "reference": "2e426e8d47e03c4777334ec0c8397341bcfa15f3", "shasum": "" }, "require": { @@ -2880,7 +2876,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.0.0-beta.10" + "source": "https://github.com/livewire/livewire/tree/v3.0.1" }, "funding": [ { @@ -2888,7 +2884,7 @@ "type": "github" } ], - "time": "2023-08-19T04:25:59+00:00" + "time": "2023-08-25T18:13:03+00:00" }, { "name": "lychee-org/nestedset", @@ -5263,16 +5259,16 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.16.0", + "version": "1.16.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "38fe533e93f86a1b2fb1000bf7df09c4748e6458" + "reference": "cc7c991555a37f9fa6b814aa03af73f88026a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/38fe533e93f86a1b2fb1000bf7df09c4748e6458", - "reference": "38fe533e93f86a1b2fb1000bf7df09c4748e6458", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/cc7c991555a37f9fa6b814aa03af73f88026a83d", + "reference": "cc7c991555a37f9fa6b814aa03af73f88026a83d", "shasum": "" }, "require": { @@ -5311,7 +5307,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.0" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.1" }, "funding": [ { @@ -5319,7 +5315,7 @@ "type": "github" } ], - "time": "2023-08-09T14:08:04+00:00" + "time": "2023-08-23T09:04:39+00:00" }, { "name": "spatie/temporary-directory", @@ -5384,16 +5380,16 @@ }, { "name": "symfony/cache", - "version": "v6.3.2", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "d176b97600860df13e851538c2df2ad88e9e5ca9" + "reference": "e60d00b4f633efa4c1ef54e77c12762d9073e7b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/d176b97600860df13e851538c2df2ad88e9e5ca9", - "reference": "d176b97600860df13e851538c2df2ad88e9e5ca9", + "url": "https://api.github.com/repos/symfony/cache/zipball/e60d00b4f633efa4c1ef54e77c12762d9073e7b3", + "reference": "e60d00b4f633efa4c1ef54e77c12762d9073e7b3", "shasum": "" }, "require": { @@ -5460,7 +5456,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.3.2" + "source": "https://github.com/symfony/cache/tree/v6.3.4" }, "funding": [ { @@ -5476,7 +5472,7 @@ "type": "tidelift" } ], - "time": "2023-07-27T16:19:14+00:00" + "time": "2023-08-05T09:10:27+00:00" }, { "name": "symfony/cache-contracts", @@ -5556,16 +5552,16 @@ }, { "name": "symfony/console", - "version": "v6.3.2", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898" + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/aa5d64ad3f63f2e48964fc81ee45cb318a723898", - "reference": "aa5d64ad3f63f2e48964fc81ee45cb318a723898", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "shasum": "" }, "require": { @@ -5626,7 +5622,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.3.2" + "source": "https://github.com/symfony/console/tree/v6.3.4" }, "funding": [ { @@ -5642,7 +5638,7 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:17:28+00:00" + "time": "2023-08-16T10:10:12+00:00" }, { "name": "symfony/css-selector", @@ -6072,16 +6068,16 @@ }, { "name": "symfony/http-foundation", - "version": "v6.3.2", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3" + "reference": "cac1556fdfdf6719668181974104e6fcfa60e844" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3", - "reference": "43ed99d30f5f466ffa00bdac3f5f7aa9cd7617c3", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cac1556fdfdf6719668181974104e6fcfa60e844", + "reference": "cac1556fdfdf6719668181974104e6fcfa60e844", "shasum": "" }, "require": { @@ -6129,7 +6125,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.3.2" + "source": "https://github.com/symfony/http-foundation/tree/v6.3.4" }, "funding": [ { @@ -6145,20 +6141,20 @@ "type": "tidelift" } ], - "time": "2023-07-23T21:58:39+00:00" + "time": "2023-08-22T08:20:46+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.3.3", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d3b567f0addf695e10b0c6d57564a9bea2e058ee" + "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d3b567f0addf695e10b0c6d57564a9bea2e058ee", - "reference": "d3b567f0addf695e10b0c6d57564a9bea2e058ee", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb", + "reference": "36abb425b4af863ae1fe54d8a8b8b4c76a2bccdb", "shasum": "" }, "require": { @@ -6167,7 +6163,7 @@ "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.3", "symfony/event-dispatcher": "^5.4|^6.0", - "symfony/http-foundation": "^6.2.7", + "symfony/http-foundation": "^6.3.4", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -6175,7 +6171,7 @@ "symfony/cache": "<5.4", "symfony/config": "<6.1", "symfony/console": "<5.4", - "symfony/dependency-injection": "<6.3", + "symfony/dependency-injection": "<6.3.4", "symfony/doctrine-bridge": "<5.4", "symfony/form": "<5.4", "symfony/http-client": "<5.4", @@ -6199,7 +6195,7 @@ "symfony/config": "^6.1", "symfony/console": "^5.4|^6.0", "symfony/css-selector": "^5.4|^6.0", - "symfony/dependency-injection": "^6.3", + "symfony/dependency-injection": "^6.3.4", "symfony/dom-crawler": "^5.4|^6.0", "symfony/expression-language": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", @@ -6242,7 +6238,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.3.3" + "source": "https://github.com/symfony/http-kernel/tree/v6.3.4" }, "funding": [ { @@ -6258,7 +6254,7 @@ "type": "tidelift" } ], - "time": "2023-07-31T10:33:00+00:00" + "time": "2023-08-26T13:54:49+00:00" }, { "name": "symfony/mailer", @@ -6426,16 +6422,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -6450,7 +6446,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6488,7 +6484,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -6504,20 +6500,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -6529,7 +6525,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6569,7 +6565,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -6585,20 +6581,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da" + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/639084e360537a19f9ee352433b84ce831f3d2da", - "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/ecaafce9f77234a6a449d29e49267ba10499116d", + "reference": "ecaafce9f77234a6a449d29e49267ba10499116d", "shasum": "" }, "require": { @@ -6612,7 +6608,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6656,7 +6652,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.28.0" }, "funding": [ { @@ -6672,20 +6668,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:30:37+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -6697,7 +6693,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6740,7 +6736,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -6756,20 +6752,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -6784,7 +6780,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6823,7 +6819,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -6839,20 +6835,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97" + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/869329b1e9894268a8a61dabb69153029b7a8c97", - "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/70f4aebd92afca2f865444d30a4d2151c13c3179", + "reference": "70f4aebd92afca2f865444d30a4d2151c13c3179", "shasum": "" }, "require": { @@ -6861,7 +6857,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6899,7 +6895,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.28.0" }, "funding": [ { @@ -6915,20 +6911,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -6937,7 +6933,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6982,7 +6978,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -6998,20 +6994,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57" + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/508c652ba3ccf69f8c97f251534f229791b52a57", - "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", + "reference": "b0f46ebbeeeda3e9d2faebdfbf4b4eae9b59fa11", "shasum": "" }, "require": { @@ -7021,7 +7017,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7034,7 +7030,10 @@ ], "psr-4": { "Symfony\\Polyfill\\Php83\\": "" - } + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7059,7 +7058,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.28.0" }, "funding": [ { @@ -7075,20 +7074,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-08-16T06:22:46+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166" + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/f3cf1a645c2734236ed1e2e671e273eeb3586166", - "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e", + "reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e", "shasum": "" }, "require": { @@ -7103,7 +7102,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7141,7 +7140,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.28.0" }, "funding": [ { @@ -7157,20 +7156,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/process", - "version": "v6.3.2", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", - "reference": "c5ce962db0d9b6e80247ca5eb9af6472bd4d7b5d", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { @@ -7202,7 +7201,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.3.2" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -7218,7 +7217,7 @@ "type": "tidelift" } ], - "time": "2023-07-12T16:00:22+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/routing", @@ -7720,16 +7719,16 @@ }, { "name": "symfony/var-dumper", - "version": "v6.3.3", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "77fb4f2927f6991a9843633925d111147449ee7a" + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/77fb4f2927f6991a9843633925d111147449ee7a", - "reference": "77fb4f2927f6991a9843633925d111147449ee7a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", "shasum": "" }, "require": { @@ -7784,7 +7783,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.3.3" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" }, "funding": [ { @@ -7800,20 +7799,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T07:08:24+00:00" + "time": "2023-08-24T14:51:05+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.3.2", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "3400949782c0cb5b3e73aa64cfd71dde000beccc" + "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/3400949782c0cb5b3e73aa64cfd71dde000beccc", - "reference": "3400949782c0cb5b3e73aa64cfd71dde000beccc", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/df1f8aac5751871b83d30bf3e2c355770f8f0691", + "reference": "df1f8aac5751871b83d30bf3e2c355770f8f0691", "shasum": "" }, "require": { @@ -7858,7 +7857,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.3.2" + "source": "https://github.com/symfony/var-exporter/tree/v6.3.4" }, "funding": [ { @@ -7874,7 +7873,7 @@ "type": "tidelift" } ], - "time": "2023-07-26T17:39:03+00:00" + "time": "2023-08-16T18:14:47+00:00" }, { "name": "thecodingmachine/safe", @@ -8350,16 +8349,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.8.2", + "version": "v3.9.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "56a2dc1da9d3219164074713983eef68996386cf" + "reference": "bfd0131c146973cab164e50f5cdd8a67cc60cab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/56a2dc1da9d3219164074713983eef68996386cf", - "reference": "56a2dc1da9d3219164074713983eef68996386cf", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/bfd0131c146973cab164e50f5cdd8a67cc60cab1", + "reference": "bfd0131c146973cab164e50f5cdd8a67cc60cab1", "shasum": "" }, "require": { @@ -8418,7 +8417,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.8.2" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.9.2" }, "funding": [ { @@ -8430,7 +8429,7 @@ "type": "github" } ], - "time": "2023-07-26T04:57:49+00:00" + "time": "2023-08-25T18:43:57+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -8724,16 +8723,16 @@ }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -8783,9 +8782,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -8801,7 +8800,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/xdebug-handler", @@ -9093,16 +9092,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.23.0", + "version": "v3.24.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "35af3cbbacfa91e164b252a28ec0b644f1ed4e78" + "reference": "bb6c9d7945dcbf6942e151b018c44d3767e21403" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/35af3cbbacfa91e164b252a28ec0b644f1ed4e78", - "reference": "35af3cbbacfa91e164b252a28ec0b644f1ed4e78", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/bb6c9d7945dcbf6942e151b018c44d3767e21403", + "reference": "bb6c9d7945dcbf6942e151b018c44d3767e21403", "shasum": "" }, "require": { @@ -9178,7 +9177,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.23.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.24.0" }, "funding": [ { @@ -9186,7 +9185,7 @@ "type": "github" } ], - "time": "2023-08-14T12:27:35+00:00" + "time": "2023-08-29T23:18:45+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -10133,16 +10132,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.29", + "version": "1.10.32", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1" + "reference": "c47e47d3ab03137c0e121e77c4d2cb58672f6d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1", - "reference": "ee5d8f2d3977fb09e55603eee6fb53bdd76ee9c1", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c47e47d3ab03137c0e121e77c4d2cb58672f6d44", + "reference": "c47e47d3ab03137c0e121e77c4d2cb58672f6d44", "shasum": "" }, "require": { @@ -10191,7 +10190,7 @@ "type": "tidelift" } ], - "time": "2023-08-14T13:24:11+00:00" + "time": "2023-08-24T21:54:50+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", @@ -10292,16 +10291,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "10.1.3", + "version": "10.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d" + "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d", - "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/cd59bb34756a16ca8253ce9b2909039c227fff71", + "reference": "cd59bb34756a16ca8253ce9b2909039c227fff71", "shasum": "" }, "require": { @@ -10358,7 +10357,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.4" }, "funding": [ { @@ -10366,20 +10365,20 @@ "type": "github" } ], - "time": "2023-07-26T13:45:28+00:00" + "time": "2023-08-31T14:04:38+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "4.0.2", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "5647d65443818959172645e7ed999217360654b6" + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6", - "reference": "5647d65443818959172645e7ed999217360654b6", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", "shasum": "" }, "require": { @@ -10419,7 +10418,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" }, "funding": [ { @@ -10427,7 +10426,7 @@ "type": "github" } ], - "time": "2023-05-07T09:13:23+00:00" + "time": "2023-08-31T06:24:48+00:00" }, { "name": "phpunit/php-invoker", @@ -10494,16 +10493,16 @@ }, { "name": "phpunit/php-text-template", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d" + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d", - "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", "shasum": "" }, "require": { @@ -10541,7 +10540,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" }, "funding": [ { @@ -10549,7 +10549,7 @@ "type": "github" } ], - "time": "2023-02-03T06:56:46+00:00" + "time": "2023-08-31T14:07:24+00:00" }, { "name": "phpunit/php-timer", @@ -10957,16 +10957,16 @@ }, { "name": "sebastian/complexity", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6" + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6", - "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/c70b73893e10757af9c6a48929fa6a333b56a97a", + "reference": "c70b73893e10757af9c6a48929fa6a333b56a97a", "shasum": "" }, "require": { @@ -11002,7 +11002,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.1" }, "funding": [ { @@ -11010,7 +11011,7 @@ "type": "github" } ], - "time": "2023-02-03T06:59:47+00:00" + "time": "2023-08-31T09:55:53+00:00" }, { "name": "sebastian/diff", @@ -11284,16 +11285,16 @@ }, { "name": "sebastian/lines-of-code", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130" + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130", - "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/649e40d279e243d985aa8fb6e74dd5bb28dc185d", + "reference": "649e40d279e243d985aa8fb6e74dd5bb28dc185d", "shasum": "" }, "require": { @@ -11329,7 +11330,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.1" }, "funding": [ { @@ -11337,7 +11339,7 @@ "type": "github" } ], - "time": "2023-02-03T07:08:02+00:00" + "time": "2023-08-31T09:25:50+00:00" }, { "name": "sebastian/object-enumerator", @@ -11882,16 +11884,16 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { @@ -11900,7 +11902,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -11941,7 +11943,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -11957,7 +11959,7 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/stopwatch", diff --git a/resources/js/app.js b/resources/js/app.js index e893a29a41e..fcf733422d3 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -12,12 +12,14 @@ Mousetrap.addKeycodes({ }); document.addEventListener('alpine:init', () => { + Alpine.data('loginWebAuthn', - (success_msg_val = "U2F_AUTHENTIFICATION_SUCCESS", error_msg_val = "ERROR_TEXT", not_supported_val = "U2F_NOT_SUPPORTED") => ({ + (success_msg_val = "U2F_AUTHENTIFICATION_SUCCESS", error_msg_val = "ERROR_TEXT") => ({ webAuthnOpen: false, success_msg: success_msg_val, error_msg: error_msg_val, - not_supported: not_supported_val, + username: null, + userId: 1, isWebAuthnUnavailable() { return !window.isSecureContext && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1'; @@ -25,9 +27,17 @@ document.addEventListener('alpine:init', () => { login() { // work around because this does not refer to alpine anymore when inside WebAuthn then context. - let alpine = this + let alpine = this; + let params = {}; + if (this.username !== '' && this.username !== null) { + params.username = this.username; + } + else if (this.userId !== null) { + params.user_id = this.userId; + } new WebAuthn({ login: "/api/WebAuthn::login", loginOptions: "/api/WebAuthn::login/options" }, {}, false) - .login({ user_id: 1 }) + // .login({ user_id: 1 }) + .login(params) .then(function () { alpine.$dispatch("notify", [{ type: "success", msg: alpine.success_msg }]); window.location.reload(); @@ -38,10 +48,10 @@ document.addEventListener('alpine:init', () => { ) Alpine.data('registerWebAuthn', - (success_msg_val = "U2F_REGISTRATION_SUCCESS", error_msg_val = "ERROR_TEXT", not_supported_val = "U2F_NOT_SUPPORTED") => ({ + (success_msg_val = "U2F_REGISTRATION_SUCCESS", error_msg_val = "ERROR_TEXT") => ({ success_msg: success_msg_val, error_msg: error_msg_val, - not_supported: not_supported_val, + isWebAuthnUnavailable() { return !window.isSecureContext && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1'; diff --git a/resources/views/components/webauthn/login.blade.php b/resources/views/components/webauthn/login.blade.php index d50dc755488..0a30a4ba329 100644 --- a/resources/views/components/webauthn/login.blade.php +++ b/resources/views/components/webauthn/login.blade.php @@ -1,7 +1,7 @@

    {{ __('lychee.U2F_NOT_SECURE') }}

    -
    - {{--

    WebAuthn is Available

    --}} - {{ __('lychee.U2F') }} -
    -
    - - {{ __('lychee.CLOSE') }} +
    +
    + +
    +
    +
    + {{ __('lychee.CLOSE') }} + {{ __('lychee.U2F') }}
    diff --git a/resources/views/livewire/modules/profile/second-factor.blade.php b/resources/views/livewire/modules/profile/second-factor.blade.php index f1df314a3e1..304faf9dfc6 100644 --- a/resources/views/livewire/modules/profile/second-factor.blade.php +++ b/resources/views/livewire/modules/profile/second-factor.blade.php @@ -1,5 +1,5 @@
    {{-- 'U2F_NOT_SUPPORTED' => 'U2F not supported. Sorry.', diff --git a/resources/views/livewire/pages/gallery/albums.blade.php b/resources/views/livewire/pages/gallery/albums.blade.php index cd914d1041f..50eb1248aba 100644 --- a/resources/views/livewire/pages/gallery/albums.blade.php +++ b/resources/views/livewire/pages/gallery/albums.blade.php @@ -73,5 +73,7 @@
    @endguest + @if($can_use_2fa) + @endif From d875804b71ca87a6589ae710c91c1cd77143b425 Mon Sep 17 00:00:00 2001 From: ildyria Date: Thu, 31 Aug 2023 20:02:37 +0200 Subject: [PATCH 007/226] support more users --- app/Http/Requests/User/U2FRequest.php | 3 +- .../WebAuthn/DeleteCredentialRequest.php | 2 +- .../WebAuthn/ListCredentialsRequest.php | 6 ++-- .../Resources/Rights/UserRightsResource.php | 1 - app/Policies/UserPolicy.php | 17 ----------- .../livewire/components/left-menu.blade.php | 8 ++---- .../views/livewire/pages/profile.blade.php | 2 -- tests/Feature/WebAuthTest.php | 28 +++++++++++++++++++ 8 files changed, 35 insertions(+), 32 deletions(-) diff --git a/app/Http/Requests/User/U2FRequest.php b/app/Http/Requests/User/U2FRequest.php index 61611f71c41..1ce770a2422 100644 --- a/app/Http/Requests/User/U2FRequest.php +++ b/app/Http/Requests/User/U2FRequest.php @@ -3,7 +3,6 @@ namespace App\Http\Requests\User; use App\Http\Requests\AbstractEmptyRequest; -use App\Models\User; use App\Policies\UserPolicy; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; @@ -18,6 +17,6 @@ class U2FRequest extends AbstractEmptyRequest */ public function authorize(): bool { - return Gate::check(UserPolicy::CAN_USE_2FA, [User::class]); + return Gate::check(UserPolicy::CAN_EDIT, [User::class]); } } diff --git a/app/Http/Requests/WebAuthn/DeleteCredentialRequest.php b/app/Http/Requests/WebAuthn/DeleteCredentialRequest.php index 58ca94ea381..51b39e371d2 100644 --- a/app/Http/Requests/WebAuthn/DeleteCredentialRequest.php +++ b/app/Http/Requests/WebAuthn/DeleteCredentialRequest.php @@ -18,7 +18,7 @@ class DeleteCredentialRequest extends BaseApiRequest */ public function authorize(): bool { - return Gate::check(UserPolicy::CAN_USE_2FA, [User::class]); + return Gate::check(UserPolicy::CAN_EDIT, [User::class]); } public function rules(): array diff --git a/app/Http/Requests/WebAuthn/ListCredentialsRequest.php b/app/Http/Requests/WebAuthn/ListCredentialsRequest.php index 0667cb6f6e8..b38a1c2137e 100644 --- a/app/Http/Requests/WebAuthn/ListCredentialsRequest.php +++ b/app/Http/Requests/WebAuthn/ListCredentialsRequest.php @@ -3,9 +3,7 @@ namespace App\Http\Requests\WebAuthn; use App\Http\Requests\AbstractEmptyRequest; -use App\Models\User; -use App\Policies\UserPolicy; -use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Auth; class ListCredentialsRequest extends AbstractEmptyRequest { @@ -14,6 +12,6 @@ class ListCredentialsRequest extends AbstractEmptyRequest */ public function authorize(): bool { - return Gate::check(UserPolicy::CAN_USE_2FA, [User::class]); + return Auth::check(); } } diff --git a/app/Http/Resources/Rights/UserRightsResource.php b/app/Http/Resources/Rights/UserRightsResource.php index a6974728506..2129ced9e67 100644 --- a/app/Http/Resources/Rights/UserRightsResource.php +++ b/app/Http/Resources/Rights/UserRightsResource.php @@ -29,7 +29,6 @@ public function toArray($request) { return [ 'can_edit' => Gate::check(UserPolicy::CAN_EDIT, [User::class]), - 'can_use_2fa' => Gate::check(UserPolicy::CAN_USE_2FA, [User::class]), ]; } } diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 40154618552..7a1ee67d348 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -15,7 +15,6 @@ class UserPolicy extends BasePolicy public const CAN_EDIT = 'canEdit'; public const CAN_CREATE_OR_EDIT_OR_DELETE = 'canCreateOrEditOrDelete'; public const CAN_LIST = 'canList'; - public const CAN_USE_2FA = 'canUse2FA'; public function canCreateOrEditOrDelete(User $user): bool { @@ -28,22 +27,6 @@ public function canList(User $user): bool return $user->may_upload; } - /** - * This function returns false as it is bypassed by the before() - * which directly checks for admin rights. - * - * TODO: Later we will want to use this function to allow users - * to make use of 2FA as opposed to only the admin for now. - * - * @param User $user - * - * @return bool - */ - public function canUse2FA(User $user): bool - { - return true; - } - /** * This defines if user can edit their settings. * diff --git a/resources/views/livewire/components/left-menu.blade.php b/resources/views/livewire/components/left-menu.blade.php index 60fa00811ac..3d437ccf07d 100644 --- a/resources/views/livewire/components/left-menu.blade.php +++ b/resources/views/livewire/components/left-menu.blade.php @@ -21,11 +21,9 @@ class="z-40 w-0 h-screen transition-width" {{ __('lychee.USERS') }} @endcan - @can(UserPolicy::CAN_USE_2FA, [App\Models\User::class]) - - {{ __('lychee.U2F') }} - - @endcan + + {{ __('lychee.U2F') }} + @can(AlbumPolicy::CAN_SHARE_WITH_USERS, [App\Contracts\Models\AbstractAlbum::class, null]) {{ __('lychee.SHARING') }} diff --git a/resources/views/livewire/pages/profile.blade.php b/resources/views/livewire/pages/profile.blade.php index 68f59f71ad5..57da43a5dcc 100644 --- a/resources/views/livewire/pages/profile.blade.php +++ b/resources/views/livewire/pages/profile.blade.php @@ -14,9 +14,7 @@ @endif - @can(App\Policies\UserPolicy::CAN_USE_2FA, [App\Models\User::class, null]) - @endcan \ No newline at end of file diff --git a/tests/Feature/WebAuthTest.php b/tests/Feature/WebAuthTest.php index 2efd76347f5..f1dedea0299 100644 --- a/tests/Feature/WebAuthTest.php +++ b/tests/Feature/WebAuthTest.php @@ -211,6 +211,34 @@ public function testWebAuthLoginOptions(): void ]); } + /** + * Testing the Login options. + * + * @return void + */ + public function testWebAuthLoginOptionsUsername(): void + { + $this->createCredentials(); + + // Generate a challenge for username = admin + $response = $this->postJson('/api/WebAuthn::login/options', ['username' => 'admin']); + $this->assertOk($response); + + $challengeRetrieved = Session::get(config('webauthn.challenge.key')); + $clg = $challengeRetrieved->data->toBase64Url(); + + $response->assertJson([ + 'timeout' => 60000, + 'challenge' => $clg, + 'allowCredentials' => [ + 0 => [ + 'id' => '_Xlz-khgFhDdkvOWyy_YqC54ExkYyp1o6HAQiybqLST-9RGBndpgI06TQygIYI7ZL2dayCMYm6J1-bXyl72obA', + 'type' => 'public-key', + ], + ], + ]); + } + /** * Testing the Login interface. * From 60f00da2b41929b9ce87e84124ee66b4ef2ba822 Mon Sep 17 00:00:00 2001 From: ildyria Date: Thu, 31 Aug 2023 20:04:18 +0200 Subject: [PATCH 008/226] fix formatting --- app/Http/Controllers/WebAuthn/WebAuthnLoginController.php | 2 +- app/Livewire/Components/Pages/Gallery/Albums.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/WebAuthn/WebAuthnLoginController.php b/app/Http/Controllers/WebAuthn/WebAuthnLoginController.php index d428f5f1c47..18f7703b289 100644 --- a/app/Http/Controllers/WebAuthn/WebAuthnLoginController.php +++ b/app/Http/Controllers/WebAuthn/WebAuthnLoginController.php @@ -29,7 +29,7 @@ public function options(AssertionRequest $request): Responsable { $fields = $request->validate([ 'user_id' => 'sometimes|int', - 'username' => 'sometimes|string' + 'username' => 'sometimes|string', ]); $username = $fields['username'] ?? null; diff --git a/app/Livewire/Components/Pages/Gallery/Albums.php b/app/Livewire/Components/Pages/Gallery/Albums.php index 58fa7dd7ad7..df89738e17e 100644 --- a/app/Livewire/Components/Pages/Gallery/Albums.php +++ b/app/Livewire/Components/Pages/Gallery/Albums.php @@ -13,7 +13,6 @@ use Illuminate\Support\Facades\Auth; use Illuminate\View\View; use Laragear\WebAuthn\Models\WebAuthnCredential; -use Laragear\WebAuthn\WebAuthn; use Livewire\Attributes\On; use Livewire\Attributes\Renderless; use Livewire\Component; @@ -45,7 +44,8 @@ public function render(): View return view('livewire.pages.gallery.albums'); } - public function mount() { + public function mount() + { $this->can_use_2fa = !Auth::check() && (WebAuthnCredential::query()->whereNull('disabled_at')->count() > 0); } From 60ce8cca80f159598051cd1d9afbe37a026c7d29 Mon Sep 17 00:00:00 2001 From: ildyria Date: Thu, 31 Aug 2023 20:05:35 +0200 Subject: [PATCH 009/226] fix phpstan --- app/Http/Requests/User/U2FRequest.php | 1 + app/Livewire/Components/Pages/Gallery/Albums.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Http/Requests/User/U2FRequest.php b/app/Http/Requests/User/U2FRequest.php index 1ce770a2422..8ec64a3520f 100644 --- a/app/Http/Requests/User/U2FRequest.php +++ b/app/Http/Requests/User/U2FRequest.php @@ -3,6 +3,7 @@ namespace App\Http\Requests\User; use App\Http\Requests\AbstractEmptyRequest; +use App\Models\User; use App\Policies\UserPolicy; use Illuminate\Http\Request; use Illuminate\Support\Facades\Gate; diff --git a/app/Livewire/Components/Pages/Gallery/Albums.php b/app/Livewire/Components/Pages/Gallery/Albums.php index df89738e17e..d9da23f2fbb 100644 --- a/app/Livewire/Components/Pages/Gallery/Albums.php +++ b/app/Livewire/Components/Pages/Gallery/Albums.php @@ -44,7 +44,7 @@ public function render(): View return view('livewire.pages.gallery.albums'); } - public function mount() + public function mount(): void { $this->can_use_2fa = !Auth::check() && (WebAuthnCredential::query()->whereNull('disabled_at')->count() > 0); } From 660cb4048924b81c37a955d7ae1838c088aefb09 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sat, 2 Sep 2023 00:28:05 +0200 Subject: [PATCH 010/226] more work --- .../Components/Modules/Photo/Properties.php | 104 ++++++++++++++++++ .../{Sidebar/Photo.php => Photo/Sidebar.php} | 6 +- resources/css/app.css | 35 ++++++ .../DISABLED.album.blade.php} | 0 .../modules/photo/properties.blade.php | 29 +++++ .../sidebar.blade.php} | 2 +- .../livewire/pages/gallery/photo.blade.php | 64 ++++++----- 7 files changed, 211 insertions(+), 29 deletions(-) create mode 100644 app/Livewire/Components/Modules/Photo/Properties.php rename app/Livewire/Components/Modules/{Sidebar/Photo.php => Photo/Sidebar.php} (97%) rename resources/views/livewire/modules/{sidebar/album.blade.php => DISABLEDsidebar/DISABLED.album.blade.php} (100%) create mode 100644 resources/views/livewire/modules/photo/properties.blade.php rename resources/views/livewire/modules/{sidebar/photo.blade.php => photo/sidebar.blade.php} (98%) diff --git a/app/Livewire/Components/Modules/Photo/Properties.php b/app/Livewire/Components/Modules/Photo/Properties.php new file mode 100644 index 00000000000..1a2192b39c8 --- /dev/null +++ b/app/Livewire/Components/Modules/Photo/Properties.php @@ -0,0 +1,104 @@ + */ + public array $tags; + + /** + * Given a photo model extract all the information. + * + * @param PhotoModel $photo + * + * @return void + * + * @throws IllegalOrderOfOperationException + */ + public function mount(PhotoModel $photo): void + { + $date_format_uploaded = Configs::getValueAsString('date_format_sidebar_uploaded'); + + $this->photoID = $photo->id; + $this->title = $photo->title; + $this->created_at = $photo->created_at->format($date_format_uploaded); + $this->description = $photo->description ?? ''; + $this->tags = $photo->tags; + $this->tags_with_comma = join(', ', $photo->tags); + } + + /** + * Render the view. + * + * @return View + * + * @throws BindingResolutionException + */ + public function render(): View + { + return view('livewire.modules.photo.properties'); + } + + /** + * Update Username & Password of current user. + */ + public function submit(): void + { + $this->tags = collect(explode(',', $this->tags_with_comma))->map(fn (string $v) => trim($v))->all(); + + $rules = [ + RequestAttribute::TITLE_ATTRIBUTE => ['required', new TitleRule()], + ...SetPhotoDescriptionRuleSet::rules(), + RequestAttribute::TAGS_ATTRIBUTE => 'present|array', + RequestAttribute::TAGS_ATTRIBUTE . '.*' => 'required|string|min:1', + ]; + + if (!$this->areValid($rules)) { + return; + } + + $photo = PhotoModel::query()->where('id', '=', $this->photoID)->first(); + $this->authorize(PhotoPolicy::CAN_EDIT, $photo); + + $photo->title = $this->title; + $photo->description = $this->description; + $photo->created_at = $this->created_at; + $photo->tags = $this->tags; + $photo->save(); + + $this->notify(__('lychee.CHANGE_SUCCESS')); + } +} diff --git a/app/Livewire/Components/Modules/Sidebar/Photo.php b/app/Livewire/Components/Modules/Photo/Sidebar.php similarity index 97% rename from app/Livewire/Components/Modules/Sidebar/Photo.php rename to app/Livewire/Components/Modules/Photo/Sidebar.php index 22ce4a6abea..25c22681246 100644 --- a/app/Livewire/Components/Modules/Sidebar/Photo.php +++ b/app/Livewire/Components/Modules/Photo/Sidebar.php @@ -1,6 +1,6 @@ +
    +
    +
    +

    {{ __('lychee.PHOTO_NEW_TITLE') }}

    + + +
    +
    +

    {{ __('lychee.PHOTO_NEW_DESCRIPTION') }}

    + + +
    +
    +

    {{ __('lychee.PHOTO_NEW_TAGS') }}

    + + +
    + {{--
    --}} + {{-- {{ __('lychee.ALBUM_ORDERING') }} + + --}} + {{--
    --}} + {{ __('lychee.SAVE') }} +
    +
    + diff --git a/resources/views/livewire/modules/sidebar/photo.blade.php b/resources/views/livewire/modules/photo/sidebar.blade.php similarity index 98% rename from resources/views/livewire/modules/sidebar/photo.blade.php rename to resources/views/livewire/modules/photo/sidebar.blade.php index 54241e7fc59..89bb7eff672 100644 --- a/resources/views/livewire/modules/sidebar/photo.blade.php +++ b/resources/views/livewire/modules/photo/sidebar.blade.php @@ -8,7 +8,7 @@ {{ $created_at }} @if ($description !== '') {{ __('lychee.PHOTO_DESCRIPTION') }} -
    +
    @markdown{{ $description }}@endmarkdown
    @endif diff --git a/resources/views/livewire/pages/gallery/photo.blade.php b/resources/views/livewire/pages/gallery/photo.blade.php index 40ab04b367e..1189702cd33 100644 --- a/resources/views/livewire/pages/gallery/photo.blade.php +++ b/resources/views/livewire/pages/gallery/photo.blade.php @@ -1,4 +1,4 @@ -
    +
    @@ -16,10 +16,14 @@ --}} {{-- --}} - + @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) + + @endcan + @keydown.window="if (event.keyCode === 73 && $focus.focused() === undefined) { event.preventDefault(); detailsOpen = ! detailsOpen }" + {{-- 73 = i --}} x-bind:class="detailsOpen ? 'fill-sky-500' : 'fill-neutral-400'" />
    @@ -43,7 +47,7 @@ } } }" - x-on:click="rotateOverlay()" > + x-on:click="rotateOverlay()"> @if ($photo->isVideo()) {{-- This is a video file: put html5 player --}} @elseif($photo->isRaw()) {{-- This is a raw file: put a place holder --}} @@ -101,29 +105,39 @@ class='absolute top-7 bottom-7 left-7 right-7 m-auto w-auto h-auto max-w-[calc(1 {{-- --}}
    @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) -
    - - - @if($flags->can_rotate) - - - @endif - - -
    +
    + + + @if ($flags->can_rotate) + + + @endif + + +
    @endcan
    + @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) +
    + +
    + @endcan
    From 0be6539133b97db5ea8fedb0763f72a3dcf0af9b Mon Sep 17 00:00:00 2001 From: ildyria Date: Sat, 2 Sep 2023 14:33:19 +0200 Subject: [PATCH 011/226] support left-right navigation on photo view --- .../Components/Pages/Gallery/Photo.php | 30 ++++++- composer.lock | 90 ++----------------- .../gallery/photo/next-previous.blade.php | 17 ++++ .../livewire/pages/gallery/photo.blade.php | 20 +++-- 4 files changed, 62 insertions(+), 95 deletions(-) create mode 100644 resources/views/components/gallery/photo/next-previous.blade.php diff --git a/app/Livewire/Components/Pages/Gallery/Photo.php b/app/Livewire/Components/Pages/Gallery/Photo.php index 3cc1f247d6a..e35bc09e609 100644 --- a/app/Livewire/Components/Pages/Gallery/Photo.php +++ b/app/Livewire/Components/Pages/Gallery/Photo.php @@ -10,9 +10,9 @@ use App\Livewire\Traits\InteractWithModal; use App\Models\Configs; use App\Models\Photo as PhotoModel; +use App\Policies\AlbumPolicy; use App\Policies\PhotoPolicy; use Illuminate\Contracts\Container\BindingResolutionException; -use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Gate; use Illuminate\View\View; use Livewire\Attributes\Locked; @@ -42,6 +42,9 @@ class Photo extends Component public PhotoModel $photo; public ?AbstractAlbum $album = null; + public ?PhotoModel $nextPhoto = null; + public ?PhotoModel $previousPhoto = null; + public function boot(): void { $this->albumFactory = resolve(AlbumFactory::class); @@ -51,8 +54,12 @@ public function mount(string $albumId, string $photoId): void { $this->albumId = $albumId; $this->photoId = $photoId; + $this->album = $this->albumFactory->findAbstractAlbumOrFail($this->albumId); + // TODO: support password + Gate::authorize(AlbumPolicy::CAN_ACCESS, [AbstractAlbum::class, $this->album]); + /** @var PhotoModel $photoItem */ $photoItem = PhotoModel::with('album')->findOrFail($this->photoId); $this->photo = $photoItem; @@ -63,6 +70,21 @@ public function mount(string $albumId, string $photoId): void can_rotate: Configs::getValueAsBool('editor_enabled'), ); + $idx = $this->album->photos->search(fn(PhotoModel $photo) => $photo->id === $this->photoId); + $max = $this->album->num_photos; + $wrapOver = Configs::getValueAsBool('photos_wraparound') && $max > 1; + + $idx_next = ($idx + 1) % $max; + $idx_previous = ($idx - 1) % $max; + if ($idx < $idx_next && $idx_previous < $idx) { + $this->previousPhoto = $this->album->photos->get($idx_previous); + $this->nextPhoto = $this->album->photos->get($idx_next); + } else { + // Possible wrap around + $this->previousPhoto = ($wrapOver && $idx_previous > $idx) ? $this->album->photos->get($idx_previous) : null; + $this->nextPhoto = ($wrapOver && $idx_next < $idx) ? $this->album->photos->get($idx_next) : null; + } + // $this->locked = Gate::check(AlbumPolicy::CAN_ACCESS, [AbstractAlbum::class, $this->album]); } @@ -90,14 +112,14 @@ public function reloadPage(): void public function set_star(): void { - Gate::check(PhotoPolicy::CAN_EDIT, $this->photo); + Gate::authorize(PhotoPolicy::CAN_EDIT, $this->photo); $this->photo->is_starred = !$this->photo->is_starred; $this->photo->save(); } public function rotate_ccw(): void { - Gate::check(PhotoPolicy::CAN_EDIT, $this->photo); + Gate::authorize(PhotoPolicy::CAN_EDIT, $this->photo); $rotateStrategy = new RotateStrategy($this->photo, -1); $this->photo = $rotateStrategy->do(); $this->render(); @@ -105,7 +127,7 @@ public function rotate_ccw(): void public function rotate_cw(): void { - Gate::check(PhotoPolicy::CAN_EDIT, $this->photo); + Gate::authorize(PhotoPolicy::CAN_EDIT, $this->photo); $rotateStrategy = new RotateStrategy($this->photo, 1); $this->photo = $rotateStrategy->do(); $this->render(); diff --git a/composer.lock b/composer.lock index 77ec8492202..4e60f8f184d 100644 --- a/composer.lock +++ b/composer.lock @@ -8943,82 +8943,6 @@ ], "time": "2023-02-20T08:34:36+00:00" }, - { - "name": "doctrine/annotations", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/annotations.git", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", - "shasum": "" - }, - "require": { - "doctrine/lexer": "^2 || ^3", - "ext-tokenizer": "*", - "php": "^7.2 || ^8.0", - "psr/cache": "^1 || ^2 || ^3" - }, - "require-dev": { - "doctrine/cache": "^2.0", - "doctrine/coding-standard": "^10", - "phpstan/phpstan": "^1.8.0", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "symfony/cache": "^5.4 || ^6", - "vimeo/psalm": "^4.10" - }, - "suggest": { - "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com" - } - ], - "description": "Docblock Annotations Parser", - "homepage": "https://www.doctrine-project.org/projects/annotations.html", - "keywords": [ - "annotations", - "docblock", - "parser" - ], - "support": { - "issues": "https://github.com/doctrine/annotations/issues", - "source": "https://github.com/doctrine/annotations/tree/2.0.1" - }, - "time": "2023-02-02T22:02:53+00:00" - }, { "name": "filp/whoops", "version": "2.15.3", @@ -9092,23 +9016,21 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.24.0", + "version": "v3.25.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "bb6c9d7945dcbf6942e151b018c44d3767e21403" + "reference": "9025b7d2b6e1d90a63d0ac0905018ce5d03ec88d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/bb6c9d7945dcbf6942e151b018c44d3767e21403", - "reference": "bb6c9d7945dcbf6942e151b018c44d3767e21403", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/9025b7d2b6e1d90a63d0ac0905018ce5d03ec88d", + "reference": "9025b7d2b6e1d90a63d0ac0905018ce5d03ec88d", "shasum": "" }, "require": { "composer/semver": "^3.3", "composer/xdebug-handler": "^3.0.3", - "doctrine/annotations": "^2", - "doctrine/lexer": "^2 || ^3", "ext-json": "*", "ext-tokenizer": "*", "php": "^7.4 || ^8.0", @@ -9177,7 +9099,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.24.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.25.0" }, "funding": [ { @@ -9185,7 +9107,7 @@ "type": "github" } ], - "time": "2023-08-29T23:18:45+00:00" + "time": "2023-08-31T21:27:18+00:00" }, { "name": "hamcrest/hamcrest-php", diff --git a/resources/views/components/gallery/photo/next-previous.blade.php b/resources/views/components/gallery/photo/next-previous.blade.php new file mode 100644 index 00000000000..79f3942890a --- /dev/null +++ b/resources/views/components/gallery/photo/next-previous.blade.php @@ -0,0 +1,17 @@ +@props(['albumId', 'photo', 'is_next']) + diff --git a/resources/views/livewire/pages/gallery/photo.blade.php b/resources/views/livewire/pages/gallery/photo.blade.php index 1189702cd33..319a8a14295 100644 --- a/resources/views/livewire/pages/gallery/photo.blade.php +++ b/resources/views/livewire/pages/gallery/photo.blade.php @@ -17,9 +17,9 @@ --}} {{-- --}} @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) - + @endcan --}} {{-- --}} + @if ($this->previousPhoto !== null) + + @endif + @if ($this->nextPhoto !== null) + + @endif @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo])
    @@ -130,10 +136,10 @@ class="fill-white hover:fill-sky-500" icon="clockwise" @endcan
    @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) -
    - -
    +
    + +
    @endcan + @can(App\Policies\PhotoPolicy::CAN_DOWNLOAD, [App\Models\Photo::class, $photo]) + + @endcan diff --git a/routes/api.php b/routes/api.php index 1c3347e19b9..fb3f92b5876 100644 --- a/routes/api.php +++ b/routes/api.php @@ -88,6 +88,7 @@ ->withoutMiddleware(['content_type:json']) ->middleware(['content_type:multipart']); Route::get('/Photo::getArchive', [PhotoController::class, 'getArchive']) + ->name('photo_download') ->withoutMiddleware(['content_type:json', 'accept_content_type:json']) ->middleware(['local_storage', 'accept_content_type:any']); From 126724b061b170d8e14501c534c3239827cb98f4 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 3 Sep 2023 17:29:02 +0200 Subject: [PATCH 021/226] fix phpstan complaints --- .../Components/Gallery/Photo/Download.php | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/app/View/Components/Gallery/Photo/Download.php b/app/View/Components/Gallery/Photo/Download.php index 79acd32f488..a2c54bce761 100644 --- a/app/View/Components/Gallery/Photo/Download.php +++ b/app/View/Components/Gallery/Photo/Download.php @@ -28,29 +28,32 @@ public function __construct(Photo $photo) { $this->photoId = $photo->id; - $medium = $photo->size_variants?->getSizeVariant(SizeVariantType::MEDIUM); - $medium2x = $photo->size_variants?->getSizeVariant(SizeVariantType::MEDIUM2X); - $original = $photo->size_variants?->getSizeVariant(SizeVariantType::ORIGINAL); - $small = $photo->size_variants?->getSizeVariant(SizeVariantType::SMALL); - $small2x = $photo->size_variants?->getSizeVariant(SizeVariantType::SMALL2X); - $thumb = $photo->size_variants?->getSizeVariant(SizeVariantType::THUMB); - $thumb2x = $photo->size_variants?->getSizeVariant(SizeVariantType::THUMB2X); + $medium = $photo->size_variants->getSizeVariant(SizeVariantType::MEDIUM); + $medium2x = $photo->size_variants->getSizeVariant(SizeVariantType::MEDIUM2X); + $original = $photo->size_variants->getSizeVariant(SizeVariantType::ORIGINAL); + $small = $photo->size_variants->getSizeVariant(SizeVariantType::SMALL); + $small2x = $photo->size_variants->getSizeVariant(SizeVariantType::SMALL2X); + $thumb = $photo->size_variants->getSizeVariant(SizeVariantType::THUMB); + $thumb2x = $photo->size_variants->getSizeVariant(SizeVariantType::THUMB2X); $downgrade = !Gate::check(PhotoPolicy::CAN_ACCESS_FULL_PHOTO, [Photo::class, $photo]) && !$photo->isVideo() && - $photo->size_variants?->hasMedium() === true; + $photo->size_variants->hasMedium() === true; + + $rq = request(); $this->size_variants = collect([ - 'original' => $original === null ? null : SizeVariantResource::make($original)->noUrl($downgrade)->toArray(null), - 'medium2x' => $medium2x === null ? null : SizeVariantResource::make($medium2x)->toArray(null), - 'medium' => $medium === null ? null : SizeVariantResource::make($medium)->toArray(null), - 'small2x' => $small2x === null ? null : SizeVariantResource::make($small2x)->toArray(null), - 'small' => $small === null ? null : SizeVariantResource::make($small)->toArray(null), - 'thumb2x' => $thumb2x === null ? null : SizeVariantResource::make($thumb2x)->toArray(null), - 'thumb' => $thumb === null ? null : SizeVariantResource::make($thumb)->toArray(null), + 'original' => $original === null ? null : SizeVariantResource::make($original)->noUrl($downgrade)->toArray($rq), + 'medium2x' => $medium2x === null ? null : SizeVariantResource::make($medium2x)->toArray($rq), + 'medium' => $medium === null ? null : SizeVariantResource::make($medium)->toArray($rq), + 'small2x' => $small2x === null ? null : SizeVariantResource::make($small2x)->toArray($rq), + 'small' => $small === null ? null : SizeVariantResource::make($small)->toArray($rq), + 'thumb2x' => $thumb2x === null ? null : SizeVariantResource::make($thumb2x)->toArray($rq), + 'thumb' => $thumb === null ? null : SizeVariantResource::make($thumb)->toArray($rq), ]) ->filter(fn ($e) => $e !== null) ->map(function ($v, $k) { + /** @var array{filesize:int} $v */ $v['filesize'] = Helpers::getSymbolByQuantity(intval($v['filesize'])); return $v; From ea7cc7b34a5efe2a3201690f847c730cab134378 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 3 Sep 2023 18:10:17 +0200 Subject: [PATCH 022/226] when enabled in settings, it is now fully enabled --- app/Http/Controllers/RedirectController.php | 7 ++++ routes/web-livewire.php | 37 +++++++++++---------- routes/web.php | 13 +++++--- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/app/Http/Controllers/RedirectController.php b/app/Http/Controllers/RedirectController.php index c98c4133803..2384b28229c 100644 --- a/app/Http/Controllers/RedirectController.php +++ b/app/Http/Controllers/RedirectController.php @@ -73,6 +73,13 @@ public function photo(Request $request, string $albumID, ?string $photoID): Symf $this->unlock->do($album, $request['password']); } + // If we are using livewire by default, we redirect to Livewire url intead. + if (config('app.livewire') === true) { + return $photoID === null ? + redirect(route('livewire-gallery-album', ['albumId' => $albumID])) : + redirect(route('livewire-gallery-photo', ['albumId' => $albumID, 'photoId' => $photoID])); + } + return $photoID === null ? redirect('gallery#' . $albumID) : redirect('gallery#' . $albumID . '/' . $photoID); diff --git a/routes/web-livewire.php b/routes/web-livewire.php index c55eb6bd1ac..cdd95668db0 100644 --- a/routes/web-livewire.php +++ b/routes/web-livewire.php @@ -32,23 +32,24 @@ URL::forceScheme('https'); } -if (config('app.livewire') === true) { - Route::middleware(['installation:complete', 'migration:complete'])->group(function () { - Route::get('/livewire/landing', Landing::class)->name('landing'); - Route::get('/livewire/all-settings', AllSettings::class)->name('all-settings'); - Route::get('/livewire/settings', Settings::class)->name('settings'); - Route::get('/livewire/profile', Profile::class)->name('profile'); - Route::get('/livewire/users', Users::class)->name('users'); - Route::get('/livewire/sharing', Sharing::class)->name('sharing'); - Route::get('/livewire/jobs', Jobs::class)->name('jobs'); - Route::get('/livewire/diagnostics', Diagnostics::class)->name('diagnostics'); - Route::get('/livewire/gallery/', Albums::class)->name('livewire-gallery'); - Route::get('/livewire/gallery/{albumId}/', Album::class)->name('livewire-gallery-album'); - Route::get('/livewire/gallery/{albumId}/{photoId}', Photo::class)->name('livewire-gallery-photo'); - // Route::get('/livewire/{page?}/{albumId?}/{photoId?}', Index::class) - - Route::get('/livewire', function () { - return redirect(Configs::getValueAsBool('landing_page_enable') ? route('landing') : route('livewire-gallery')); +Route::middleware(['installation:complete', 'migration:complete']) + ->group(function () { + Route::prefix(config('app.livewire') === true ? '' : 'livewire') + ->group(function () { + Route::get('/landing', Landing::class)->name('landing'); + Route::get('/all-settings', AllSettings::class)->name('all-settings'); + Route::get('/settings', Settings::class)->name('settings'); + Route::get('/profile', Profile::class)->name('profile'); + Route::get('/users', Users::class)->name('users'); + Route::get('/sharing', Sharing::class)->name('sharing'); + Route::get('/jobs', Jobs::class)->name('jobs'); + Route::get('/diagnostics', Diagnostics::class)->name('diagnostics'); + Route::get('/gallery/', Albums::class)->name('livewire-gallery'); + Route::get('/gallery/{albumId}/', Album::class)->name('livewire-gallery-album'); + Route::get('/gallery/{albumId}/{photoId}', Photo::class)->name('livewire-gallery-photo'); + Route::get('/', function () { + return redirect(Configs::getValueAsBool('landing_page_enable') ? route('landing') : route('livewire-gallery')); + }); }); }); -} + diff --git a/routes/web.php b/routes/web.php index b53327184e2..b4a219042a5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -22,8 +22,14 @@ Route::feeds(); -Route::get('/', [IndexController::class, 'show'])->name('home')->middleware(['migration:complete']); -Route::get('/gallery', [IndexController::class, 'gallery'])->name('gallery')->middleware(['migration:complete']); +// If we are using Livewire by default, we no longer need those routes. +if (!config('app.livewire') !== true) { + Route::get('/', [IndexController::class, 'show'])->name('home')->middleware(['migration:complete']); + Route::get('/gallery', [IndexController::class, 'gallery'])->name('gallery')->middleware(['migration:complete']); + Route::get('/view', [IndexController::class, 'view'])->name('view')->middleware(['redirect-legacy-id']); + Route::get('/frame', [IndexController::class, 'frame'])->name('frame')->middleware(['migration:complete']); +} + Route::match(['get', 'post'], '/migrate', [Administration\UpdateController::class, 'migrate']) ->name('migrate') ->middleware(['migration:incomplete']); @@ -38,8 +44,5 @@ Route::get('/r/{albumID}/{photoID}', [RedirectController::class, 'photo'])->middleware(['migration:complete']); Route::get('/r/{albumID}', [RedirectController::class, 'album'])->middleware(['migration:complete']); -Route::get('/view', [IndexController::class, 'view'])->name('view')->middleware(['redirect-legacy-id']); -Route::get('/frame', [IndexController::class, 'frame'])->name('frame')->middleware(['migration:complete']); - // This route must be defined last because it is a catch all. Route::match(['get', 'post'], '{path}', HoneyPotController::class)->where('path', '.*'); From 2f21765c2b7518990fb57447581dcc3f00e47eb2 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 3 Sep 2023 19:09:26 +0200 Subject: [PATCH 023/226] add dev tools in left menu --- app/Livewire/Components/Menus/LeftMenu.php | 39 +++++++++++++++++++ app/Policies/SettingsPolicy.php | 14 +++++++ resources/views/includes/svg.blade.php | 2 + .../livewire/components/left-menu.blade.php | 15 +++++++ routes/web.php | 2 +- 5 files changed, 71 insertions(+), 1 deletion(-) diff --git a/app/Livewire/Components/Menus/LeftMenu.php b/app/Livewire/Components/Menus/LeftMenu.php index c35d6b6ae96..a2ac0add09f 100644 --- a/app/Livewire/Components/Menus/LeftMenu.php +++ b/app/Livewire/Components/Menus/LeftMenu.php @@ -3,9 +3,14 @@ namespace App\Livewire\Components\Menus; use App\Livewire\Traits\InteractWithModal; +use App\Models\Configs; +use App\Policies\SettingsPolicy; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Session; use Illuminate\View\View; +use Livewire\Attributes\Locked; use Livewire\Attributes\On; use Livewire\Component; @@ -26,6 +31,12 @@ class LeftMenu extends Component { use InteractWithModal; + #[Locked] + public bool $has_dev_tools = false; + + public ?string $clockwork_url = null; + public ?string $doc_api_url = null; + /** * Method called from user-land. * Log out the user. @@ -46,6 +57,8 @@ public function logout(): void #[On('reloadPage')] public function render(): View { + $this->loadDevMenu(); + return view('livewire.components.left-menu'); } @@ -59,4 +72,30 @@ public function openAboutModal(): void { $this->openClosableModal('modals.about', __('lychee.CLOSE')); } + + /** + * We load some data about debuging tools section. + * + * @return void + */ + private function loadDevMenu(): void + { + $this->has_dev_tools = Gate::check(SettingsPolicy::CAN_ACCESS_DEV_TOOLS, [Configs::class]); + if (!$this->has_dev_tools) { + return; + } + + // Defining clockwork URL + $clockWorkEnabled = config('clockwork.enable') === true || (config('app.debug') === true && config('clockwork.enable') === null); + $clockWorkWeb = config('clockwork.web'); + if ($clockWorkEnabled && $clockWorkWeb === true || is_string($clockWorkWeb)) { + $this->clockwork_url = $clockWorkWeb === true ? 'clockwork/app' : $clockWorkWeb . '/app'; + } + + // API documentation + $this->doc_api_url = Route::has('scramble.docs.api') ? route('scramble.docs.api') : null; + + // Double check to avoid showing an empty section. + $this->has_dev_tools = $this->doc_api_url !== null && $this->clockwork_url !== null; + } } diff --git a/app/Policies/SettingsPolicy.php b/app/Policies/SettingsPolicy.php index 457c4e9c383..38efd770109 100644 --- a/app/Policies/SettingsPolicy.php +++ b/app/Policies/SettingsPolicy.php @@ -15,6 +15,7 @@ class SettingsPolicy extends BasePolicy public const CAN_CLEAR_LOGS = 'canClearLogs'; public const CAN_SEE_DIAGNOSTICS = 'canSeeDiagnostics'; public const CAN_UPDATE = 'canUpdate'; + public const CAN_ACCESS_DEV_TOOLS = 'canAccessDevTools'; /** * This function returns false as it is bypassed by the before() @@ -79,4 +80,17 @@ public function canUpdate(User $user): bool { return $user->id === 0; // Edge case of migration not applied yet. } + + /** + * This function returns false as it is bypassed by the before() + * which directly checks for admin rights. + * + * @param User $user + * + * @return bool + */ + public function canAccessDevTools(User $user): bool + { + return false; + } } diff --git a/resources/views/includes/svg.blade.php b/resources/views/includes/svg.blade.php index 735e9070773..5c9ffde83b0 100644 --- a/resources/views/includes/svg.blade.php +++ b/resources/views/includes/svg.blade.php @@ -224,6 +224,8 @@ + +
  • +
  • --}} +
  • + + Dev Tools + +
  • + @if($clockwork_url !== null) + Clockwork App + @endif + @if($doc_api_url !== null) + Api Documentation + @endif + @endif diff --git a/routes/web.php b/routes/web.php index b4a219042a5..835fd570b1b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -23,7 +23,7 @@ Route::feeds(); // If we are using Livewire by default, we no longer need those routes. -if (!config('app.livewire') !== true) { +if (config('app.livewire') !== true) { Route::get('/', [IndexController::class, 'show'])->name('home')->middleware(['migration:complete']); Route::get('/gallery', [IndexController::class, 'gallery'])->name('gallery')->middleware(['migration:complete']); Route::get('/view', [IndexController::class, 'view'])->name('view')->middleware(['redirect-legacy-id']); From 679c7a226156a3dc4a7546cd070a5c1c8cacb55d Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 3 Sep 2023 19:36:16 +0200 Subject: [PATCH 024/226] better csp support --- app/Http/Middleware/DisableCSP.php | 4 +++- resources/views/components/layouts/app.blade.php | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Http/Middleware/DisableCSP.php b/app/Http/Middleware/DisableCSP.php index b19f4d65217..8a819626a66 100644 --- a/app/Http/Middleware/DisableCSP.php +++ b/app/Http/Middleware/DisableCSP.php @@ -6,6 +6,7 @@ use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Http\Request; use Illuminate\Support\Facades\File; +use Illuminate\Support\Str; /** * Class DisableCSP. @@ -46,7 +47,8 @@ public function handle(Request $request, \Closure $next): mixed config(['secure-headers.csp.script-src.hashes.sha256' => []]); } - if (config('app.livewire', false) === true) { + // disable unsafe-eval if we are on a Livewire page + if (config('app.livewire', false) === true || Str::startsWith($request->getRequestUri(), '/livewire/')) { $this->handleLivewire(); } diff --git a/resources/views/components/layouts/app.blade.php b/resources/views/components/layouts/app.blade.php index 941d99f7a6e..52b203b0694 100644 --- a/resources/views/components/layouts/app.blade.php +++ b/resources/views/components/layouts/app.blade.php @@ -11,6 +11,8 @@ {{-- --}} {{-- --}} + {{-- @livewireStyles(['nonce' => csp_nonce('script')]) --}} + {{-- @livewireScripts(['nonce' => csp_nonce('script')]) --}} @vite(['resources/css/app.css','resources/js/app.js']) From d968f44efd2dbdc1a01a1fa2ab8a52e67e986524 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 3 Sep 2023 22:36:35 +0200 Subject: [PATCH 025/226] fix url --- app/Http/Middleware/DisableCSP.php | 2 +- app/Livewire/Components/Menus/LeftMenu.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/Http/Middleware/DisableCSP.php b/app/Http/Middleware/DisableCSP.php index 8a819626a66..d747858bccf 100644 --- a/app/Http/Middleware/DisableCSP.php +++ b/app/Http/Middleware/DisableCSP.php @@ -47,7 +47,7 @@ public function handle(Request $request, \Closure $next): mixed config(['secure-headers.csp.script-src.hashes.sha256' => []]); } - // disable unsafe-eval if we are on a Livewire page + // disable unsafe-eval if we are on a Livewire page if (config('app.livewire', false) === true || Str::startsWith($request->getRequestUri(), '/livewire/')) { $this->handleLivewire(); } diff --git a/app/Livewire/Components/Menus/LeftMenu.php b/app/Livewire/Components/Menus/LeftMenu.php index a2ac0add09f..18ed5a438f8 100644 --- a/app/Livewire/Components/Menus/LeftMenu.php +++ b/app/Livewire/Components/Menus/LeftMenu.php @@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Session; +use Illuminate\Support\Facades\URL; use Illuminate\View\View; use Livewire\Attributes\Locked; use Livewire\Attributes\On; @@ -89,7 +90,7 @@ private function loadDevMenu(): void $clockWorkEnabled = config('clockwork.enable') === true || (config('app.debug') === true && config('clockwork.enable') === null); $clockWorkWeb = config('clockwork.web'); if ($clockWorkEnabled && $clockWorkWeb === true || is_string($clockWorkWeb)) { - $this->clockwork_url = $clockWorkWeb === true ? 'clockwork/app' : $clockWorkWeb . '/app'; + $this->clockwork_url = $clockWorkWeb === true ? URL::asset('clockwork/app') : $clockWorkWeb . '/app'; } // API documentation From 5a5367ce0b79da2ecef125c242512bc5d405ecd5 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 3 Sep 2023 22:48:27 +0200 Subject: [PATCH 026/226] finalize import from url --- app/Livewire/Components/Forms/Add/ImportFromUrl.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/Livewire/Components/Forms/Add/ImportFromUrl.php b/app/Livewire/Components/Forms/Add/ImportFromUrl.php index fee3ac1e061..8ec0df9ff87 100644 --- a/app/Livewire/Components/Forms/Add/ImportFromUrl.php +++ b/app/Livewire/Components/Forms/Add/ImportFromUrl.php @@ -5,11 +5,13 @@ use App\Actions\Import\FromUrl; use App\Contracts\Http\Requests\RequestAttribute; use App\Contracts\Models\AbstractAlbum; +use App\Exceptions\MassImportException; use App\Exceptions\UnauthenticatedException; use App\Http\RuleSets\Import\ImportFromUrlRuleSet; use App\Livewire\Components\Forms\BaseForm; use App\Livewire\Components\Pages\Gallery\Album as PageGalleryAlbum; use App\Livewire\Traits\InteractWithModal; +use App\Livewire\Traits\Notify; use App\Models\Album; use App\Policies\AlbumPolicy; use Illuminate\Support\Facades\Auth; @@ -24,6 +26,7 @@ class ImportFromUrl extends BaseForm * Allow modal integration */ use InteractWithModal; + use Notify; /** * This defines the set of validation rules to be applied on the input. @@ -101,11 +104,15 @@ public function submit(): void // Create $fromUrl = resolve(FromUrl::class); - $fromUrl->do($urls, $parentAlbum, $currentUserId); + try { + $fromUrl->do($urls, $parentAlbum, $currentUserId); + $this->notify(__('lychee.UPLOAD_IMPORT_COMPLETE')); + } catch (MassImportException $e) { + $this->notify($e->getMessage()); + } // Do we want refresh or direcly open newly created Album ? - $this->dispatch('reload')->to(PageGalleryAlbum::class); - // $this->dispatch('reload')->to(PageGalleryAlbum::class); + $this->dispatch('reloadPage')->to(PageGalleryAlbum::class); $this->close(); } From a68f0ba5233080f1d0b5a021600aeff683ea7b0f Mon Sep 17 00:00:00 2001 From: ildyria Date: Mon, 4 Sep 2023 20:35:06 +0200 Subject: [PATCH 027/226] persist status of side bar --- .../Components/Pages/Gallery/Photo.php | 7 ++ app/Livewire/DTO/SessionFlags.php | 35 ++++++++++ app/Livewire/Synth/SessionFlagsSynth.php | 69 +++++++++++++++++++ app/Providers/AppServiceProvider.php | 2 + .../gallery/photo/next-previous.blade.php | 6 +- .../livewire/modules/photo/sidebar.blade.php | 2 +- .../livewire/pages/gallery/photo.blade.php | 45 ++++++++---- webpack.mix.js | 24 ------- 8 files changed, 148 insertions(+), 42 deletions(-) create mode 100644 app/Livewire/DTO/SessionFlags.php create mode 100644 app/Livewire/Synth/SessionFlagsSynth.php delete mode 100644 webpack.mix.js diff --git a/app/Livewire/Components/Pages/Gallery/Photo.php b/app/Livewire/Components/Pages/Gallery/Photo.php index 0e5f91a2bf9..6a6e25ef93d 100644 --- a/app/Livewire/Components/Pages/Gallery/Photo.php +++ b/app/Livewire/Components/Pages/Gallery/Photo.php @@ -7,6 +7,7 @@ use App\Enum\Livewire\PhotoOverlayMode; use App\Factories\AlbumFactory; use App\Livewire\DTO\PhotoFlags; +use App\Livewire\DTO\SessionFlags; use App\Livewire\Traits\InteractWithModal; use App\Models\Configs; use App\Models\Photo as PhotoModel; @@ -36,6 +37,8 @@ class Photo extends Component #[Locked] public PhotoFlags $flags; + public SessionFlags $sessionFlags; + public string $overlayType; /** @var PhotoModel Said photo to be displayed */ @@ -96,11 +99,15 @@ public function mount(string $albumId, string $photoId): void */ public function render(): View { + $this->sessionFlags = SessionFlags::get(); + return view('livewire.pages.gallery.photo'); } public function back(): mixed { + $this->sessionFlags->save(); + return $this->redirect(route('livewire-gallery-album', ['albumId' => $this->albumId])); } diff --git a/app/Livewire/DTO/SessionFlags.php b/app/Livewire/DTO/SessionFlags.php new file mode 100644 index 00000000000..83588521aa8 --- /dev/null +++ b/app/Livewire/DTO/SessionFlags.php @@ -0,0 +1,35 @@ +> + */ + public function dehydrate($target): array + { + return [[ + 'can_fullscreen' => $target->can_fullscreen, + 'is_fullscreen' => $target->is_fullscreen, + 'are_photo_details_open' => $target->are_photo_details_open, + ], []]; + } + + /** + * @param array $value + * + * @return SessionFlags + */ + public function hydrate($value): SessionFlags + { + return new SessionFlags( + can_fullscreen: $value['can_fullscreen'], + is_fullscreen: $value['is_fullscreen'], + are_photo_details_open: $value['are_photo_details_open'], + ); + } + + + /** + * + * @param SessionFlags $target + * @param string $key + * @return string + */ + public function get(&$target, $key) + { + return $target->{$key}; + } + + /** + * + * @param SessionFlags $target + * @param string $key + * @param string|bool $value + * @return void + */ + public function set(&$target, $key, $value) + { + $target->{$key} = $value; + $target->save(); + } +} \ No newline at end of file diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9a686c48ebf..cc94a6d3400 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -13,6 +13,7 @@ use App\Image\StreamStatFilter; use App\Livewire\Synth\AlbumSynth; use App\Livewire\Synth\PhotoSynth; +use App\Livewire\Synth\SessionFlagsSynth; use App\Metadata\Json\CommitsRequest; use App\Metadata\Json\UpdateRequest; use App\Metadata\Versions\FileVersion; @@ -85,6 +86,7 @@ class AppServiceProvider extends ServiceProvider [ AlbumSynth::class, PhotoSynth::class, + SessionFlagsSynth::class, ]; /** diff --git a/resources/views/components/gallery/photo/next-previous.blade.php b/resources/views/components/gallery/photo/next-previous.blade.php index 79f3942890a..af4e143b9eb 100644 --- a/resources/views/components/gallery/photo/next-previous.blade.php +++ b/resources/views/components/gallery/photo/next-previous.blade.php @@ -3,11 +3,13 @@ 'absolute w-1/5 h-full top-0 group', 'right-0' => $is_next, 'left-0' => !$is_next, -])> +]) +x-cloak > $is_next, '-left-px group-hover:translate-x-0 -translate-x-full' => !$is_next, ]) diff --git a/resources/views/livewire/modules/photo/sidebar.blade.php b/resources/views/livewire/modules/photo/sidebar.blade.php index 89bb7eff672..b01d3daef3a 100644 --- a/resources/views/livewire/modules/photo/sidebar.blade.php +++ b/resources/views/livewire/modules/photo/sidebar.blade.php @@ -1,4 +1,4 @@ -
    +

    {{ __('lychee.ALBUM_ABOUT') }}

    {{ __('lychee.PHOTO_BASICS') }}

    diff --git a/resources/views/livewire/pages/gallery/photo.blade.php b/resources/views/livewire/pages/gallery/photo.blade.php index f32871705dd..3372e5a5839 100644 --- a/resources/views/livewire/pages/gallery/photo.blade.php +++ b/resources/views/livewire/pages/gallery/photo.blade.php @@ -1,4 +1,8 @@ -
    +
    @@ -17,7 +21,9 @@ --}} {{-- --}} @can(App\Policies\PhotoPolicy::CAN_DOWNLOAD, [App\Models\Photo::class, $photo]) - + @endcan @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) @endcan $sessionFlags->are_photo_details_open, + 'fill-neutral-400' => !$sessionFlags->are_photo_details_open]) @keydown.window="if (event.keyCode === 73 && $focus.focused() === undefined) { event.preventDefault(); detailsOpen = ! detailsOpen }" {{-- 73 = i --}} x-bind:class="detailsOpen ? 'fill-sky-500' : 'fill-neutral-400'" /> -
    +
    + @keydown.window="if (event.keyCode === 79 && $focus.focused() === undefined) { rotateOverlay() }" + {{-- 79 - o --}} x-on:click="rotateOverlay()"> @if ($photo->isVideo()) {{-- This is a video file: put html5 player --}}
    @can(App\Policies\PhotoPolicy::CAN_DOWNLOAD, [App\Models\Photo::class, $photo]) - + @endcan
    diff --git a/webpack.mix.js b/webpack.mix.js deleted file mode 100644 index fa8442795b5..00000000000 --- a/webpack.mix.js +++ /dev/null @@ -1,24 +0,0 @@ -let mix = require('laravel-mix'); - -/* - |-------------------------------------------------------------------------- - | Mix Asset Management - |-------------------------------------------------------------------------- - | - | Mix provides a clean, fluent API for defining some Webpack build steps - | for your Laravel application. By default, we are compiling the Sass - | file for the application as well as bundling up all the JS files. - | - */ -// mix.options({ -// legacyNodePolyfills: true -// }); - -mix.js('resources/assets/js/app.js', 'public/js') - .copy('resources/js/vendor/alpine.min.js', 'public/js') - .copy('resources/js/vendor/filepond.js', 'public/js') - .copy('resources/js/vendor/justified-layout.min.js', 'public/js') - .js('resources/js/vendor/webauthn/webauthn.js', 'public/js') - .css('resources/css/filepond.css', 'public/css') - .sass('resources/assets/scss/app.scss', 'public/css') - .options({ processCssUrls: false }); From fd618edafae8d9f0f10ed4a2b5cabe383dd1c515 Mon Sep 17 00:00:00 2001 From: ildyria Date: Mon, 4 Sep 2023 20:45:03 +0200 Subject: [PATCH 028/226] fix phpstan & formatting --- app/Livewire/DTO/SessionFlags.php | 7 ++-- app/Livewire/Synth/SessionFlagsSynth.php | 41 ++++++++++++------------ phpstan.neon | 12 +++++++ 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/app/Livewire/DTO/SessionFlags.php b/app/Livewire/DTO/SessionFlags.php index 83588521aa8..511fd2af64a 100644 --- a/app/Livewire/DTO/SessionFlags.php +++ b/app/Livewire/DTO/SessionFlags.php @@ -18,7 +18,8 @@ public function __construct( ) { } - public static function get(): SessionFlags { + public static function get(): SessionFlags + { $default = new SessionFlags( can_fullscreen: true, is_fullscreen: false, @@ -28,8 +29,8 @@ public static function get(): SessionFlags { return Session::get('session-flags', $default); } - public function save(): void { + public function save(): void + { Session::put('session-flags', $this); } - } \ No newline at end of file diff --git a/app/Livewire/Synth/SessionFlagsSynth.php b/app/Livewire/Synth/SessionFlagsSynth.php index dac3aa6c391..bab50e4dcca 100644 --- a/app/Livewire/Synth/SessionFlagsSynth.php +++ b/app/Livewire/Synth/SessionFlagsSynth.php @@ -17,7 +17,7 @@ public static function match(mixed $target): bool /** * @param SessionFlags $target * - * @return array> + * @return array> */ public function dehydrate($target): array { @@ -29,7 +29,7 @@ public function dehydrate($target): array } /** - * @param array $value + * @param array $value * * @return SessionFlags */ @@ -42,28 +42,27 @@ public function hydrate($value): SessionFlags ); } - /** - * - * @param SessionFlags $target - * @param string $key - * @return string + * @param SessionFlags $target + * @param string $key + * + * @return string */ - public function get(&$target, $key) - { - return $target->{$key}; - } - + public function get(&$target, $key) + { + return $target->{$key}; + } + /** - * - * @param SessionFlags $target - * @param string $key - * @param string|bool $value - * @return void + * @param SessionFlags $target + * @param string $key + * @param bool $value + * + * @return void */ - public function set(&$target, $key, $value) - { - $target->{$key} = $value; + public function set(&$target, $key, $value) + { + $target->{$key} = $value; $target->save(); - } + } } \ No newline at end of file diff --git a/phpstan.neon b/phpstan.neon index a7bd522e7eb..ac8481937a6 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -75,6 +75,18 @@ parameters: # False positive from maennchen/ZipStream - '#Call to an undefined static method ZipStream\\Option\\Method::(STORE|DEFLATE)\(\)#' + + # Synth + - + message: '#Variable property access on .*#' + paths: + - app/Livewire/Synth + + - + message: '#Parameter .* of method App\\Livewire\\Synth\\.* should be contravariant with parameter .* of method Livewire\\Mechanisms\\HandleComponents\\Synthesizers\\Synth::.*#' + paths: + - app/Livewire/Synth + # Migrations - message: '#Function define is unsafe to use.#' From 903b930bcf2f472850fc9fa22e1c376e34d476fa Mon Sep 17 00:00:00 2001 From: ildyria Date: Mon, 4 Sep 2023 20:45:33 +0200 Subject: [PATCH 029/226] fix formatting --- app/Livewire/Synth/SessionFlagsSynth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Livewire/Synth/SessionFlagsSynth.php b/app/Livewire/Synth/SessionFlagsSynth.php index bab50e4dcca..67a63ac14a1 100644 --- a/app/Livewire/Synth/SessionFlagsSynth.php +++ b/app/Livewire/Synth/SessionFlagsSynth.php @@ -56,7 +56,7 @@ public function get(&$target, $key) /** * @param SessionFlags $target * @param string $key - * @param bool $value + * @param bool $value * * @return void */ From b32ad983c54dc2b16aa2d4537dd9a89374778efc Mon Sep 17 00:00:00 2001 From: ildyria Date: Tue, 5 Sep 2023 16:07:00 +0200 Subject: [PATCH 030/226] remove public smart album, bye bye --- app/Livewire/Components/Pages/Gallery/Albums.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/Livewire/Components/Pages/Gallery/Albums.php b/app/Livewire/Components/Pages/Gallery/Albums.php index d9da23f2fbb..486dc1d1deb 100644 --- a/app/Livewire/Components/Pages/Gallery/Albums.php +++ b/app/Livewire/Components/Pages/Gallery/Albums.php @@ -4,6 +4,8 @@ use App\Actions\Albums\Top; use App\Contracts\Livewire\Reloadable; +use App\Contracts\Models\AbstractAlbum; +use App\Enum\SmartAlbumType; use App\Http\Resources\Collections\TopAlbumsResource; use App\Livewire\Components\Base\ContextMenu; use App\Livewire\Traits\InteractWithModal; @@ -70,6 +72,9 @@ public function getAlbumsProperty(): Collection public function getSmartAlbumsProperty(): Collection { return $this->topAlbums->smart_albums + // We filter out the public one (we don't remove it completely to not break the other front-end). + ->filter(fn (AbstractAlbum $e, $k) => $e->id !== SmartAlbumType::PUBLIC->value) + ->concat($this->topAlbums->tag_albums) ->reject(fn ($album) => $album === null); } From a5ae0e97bce33db6f05923a2e4b27e61b9568991 Mon Sep 17 00:00:00 2001 From: ildyria Date: Tue, 5 Sep 2023 18:30:50 +0200 Subject: [PATCH 031/226] full screen also on album --- .../Components/Pages/Gallery/Album.php | 5 + .../Components/Pages/Gallery/Albums.php | 1 - .../Components/Pages/Gallery/Photo.php | 2 - .../gallery/photo/photo-panel.blade.php | 8 ++ .../gallery/photo/video-panel.blade.php | 13 +++ .../views/components/header/bar.blade.php | 3 +- .../livewire/pages/gallery/album.blade.php | 10 +- .../livewire/pages/gallery/photo.blade.php | 96 ++++++++++--------- tailwind.config.js | 6 ++ 9 files changed, 93 insertions(+), 51 deletions(-) create mode 100644 resources/views/components/gallery/photo/photo-panel.blade.php create mode 100644 resources/views/components/gallery/photo/video-panel.blade.php diff --git a/app/Livewire/Components/Pages/Gallery/Album.php b/app/Livewire/Components/Pages/Gallery/Album.php index b4a35f058d9..bfc0c21ac33 100644 --- a/app/Livewire/Components/Pages/Gallery/Album.php +++ b/app/Livewire/Components/Pages/Gallery/Album.php @@ -10,6 +10,7 @@ use App\Factories\AlbumFactory; use App\Livewire\Components\Base\ContextMenu; use App\Livewire\DTO\AlbumFlags; +use App\Livewire\DTO\SessionFlags; use App\Livewire\Traits\InteractWithModal; use App\Models\Album as ModelsAlbum; use App\Models\Configs; @@ -41,6 +42,8 @@ class Album extends Component implements Reloadable public AlbumFlags $flags; + public SessionFlags $sessionFlags; + public bool $nsfwAlbumsVisible; #[Locked] @@ -78,6 +81,8 @@ public function mount(string $albumId): void */ public function render(): View { + $this->sessionFlags = SessionFlags::get(); + $this->layout = Configs::getValueAsEnum('layout', AlbumMode::class); $this->header_url ??= $this->fetchHeaderUrl()?->url; diff --git a/app/Livewire/Components/Pages/Gallery/Albums.php b/app/Livewire/Components/Pages/Gallery/Albums.php index 486dc1d1deb..e670f3dc69d 100644 --- a/app/Livewire/Components/Pages/Gallery/Albums.php +++ b/app/Livewire/Components/Pages/Gallery/Albums.php @@ -74,7 +74,6 @@ public function getSmartAlbumsProperty(): Collection return $this->topAlbums->smart_albums // We filter out the public one (we don't remove it completely to not break the other front-end). ->filter(fn (AbstractAlbum $e, $k) => $e->id !== SmartAlbumType::PUBLIC->value) - ->concat($this->topAlbums->tag_albums) ->reject(fn ($album) => $album === null); } diff --git a/app/Livewire/Components/Pages/Gallery/Photo.php b/app/Livewire/Components/Pages/Gallery/Photo.php index 6a6e25ef93d..15268070163 100644 --- a/app/Livewire/Components/Pages/Gallery/Photo.php +++ b/app/Livewire/Components/Pages/Gallery/Photo.php @@ -106,8 +106,6 @@ public function render(): View public function back(): mixed { - $this->sessionFlags->save(); - return $this->redirect(route('livewire-gallery-album', ['albumId' => $this->albumId])); } diff --git a/resources/views/components/gallery/photo/photo-panel.blade.php b/resources/views/components/gallery/photo/photo-panel.blade.php new file mode 100644 index 00000000000..0f60ff38b40 --- /dev/null +++ b/resources/views/components/gallery/photo/photo-panel.blade.php @@ -0,0 +1,8 @@ +@props(['alt', 'src', 'srcset' => '', 'class' => 'top-7 bottom-7 left-7 right-7']) +{{ $alt }} diff --git a/resources/views/components/gallery/photo/video-panel.blade.php b/resources/views/components/gallery/photo/video-panel.blade.php new file mode 100644 index 00000000000..8c524d1bd6e --- /dev/null +++ b/resources/views/components/gallery/photo/video-panel.blade.php @@ -0,0 +1,13 @@ +@props(['flags', 'src', 'class' => 'top-7 bottom-7 left-7 right-7']) +{{-- This is a video file: put html5 player --}} + diff --git a/resources/views/components/header/bar.blade.php b/resources/views/components/header/bar.blade.php index 785f0f9b8e8..cd87ced0c66 100644 --- a/resources/views/components/header/bar.blade.php +++ b/resources/views/components/header/bar.blade.php @@ -1,5 +1,6 @@ +@props(['class' => 'h-14'])
    + class="px-2 w-full flex-none bg-gradient-to-b from-dark-700 to-dark-800 border-b border-b-solid border-b-neutral-900 {{ $class }}" {{ $attributes }}>
    {{ $slot }}
    diff --git a/resources/views/livewire/pages/gallery/album.blade.php b/resources/views/livewire/pages/gallery/album.blade.php index d53b86622d4..3bac442fdde 100644 --- a/resources/views/livewire/pages/gallery/album.blade.php +++ b/resources/views/livewire/pages/gallery/album.blade.php @@ -1,16 +1,19 @@
    - + {{ $album->title }} {{-- --}} @@ -34,7 +37,8 @@ x-on:resize.window="width = (window.innerWidth > 0) ? window.innerWidth : screen.width; $wire.loadAlbum(width - 2*28);" @endif - class="relative flex flex-wrap content-start w-full justify-start h-[calc(100vh-56px)] overflow-x-clip overflow-y-auto"> + class="relative flex flex-wrap content-start w-full justify-start overflow-x-clip overflow-y-auto" + x-bind:class="isFullscreen ? 'h-[calc(100vh-3px)]' : 'h-[calc(100vh-56px)]'"> @if ($flags->is_base_album) @can(App\Policies\AlbumPolicy::CAN_EDIT, [App\Contracts\Models\AbstractAlbum::class, $this->album]) diff --git a/resources/views/livewire/pages/gallery/photo.blade.php b/resources/views/livewire/pages/gallery/photo.blade.php index 3372e5a5839..af1efc2cb2f 100644 --- a/resources/views/livewire/pages/gallery/photo.blade.php +++ b/resources/views/livewire/pages/gallery/photo.blade.php @@ -1,10 +1,13 @@ -
    +}" + @keydown.window="if (event.keyCode === 70 && $focus.focused() === undefined) { event.preventDefault(); isFullscreen = ! isFullscreen }" + {{-- 70 = f --}}> - + {{ $photo->title }} {{-- @@ -22,8 +25,7 @@ {{-- --}} @can(App\Policies\PhotoPolicy::CAN_DOWNLOAD, [App\Models\Photo::class, $photo]) + class="fill-neutral-400" x-bind:class="donwloadOpen ? 'fill-sky-500' : 'fill-neutral-400'" /> @endcan @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) $sessionFlags->are_photo_details_open, - 'fill-neutral-400' => !$sessionFlags->are_photo_details_open]) + 'fill-neutral-400' => !$sessionFlags->are_photo_details_open, + ]) @keydown.window="if (event.keyCode === 73 && $focus.focused() === undefined) { event.preventDefault(); detailsOpen = ! detailsOpen }" {{-- 73 = i --}} x-bind:class="detailsOpen ? 'fill-sky-500' : 'fill-neutral-400'" /> -
    +
    @if ($photo->isVideo()) {{-- This is a video file: put html5 player --}} - + @elseif($photo->isRaw()) {{-- This is a raw file: put a place holder --}} - big + @elseif ($photo->live_photo_short_path === null) {{-- This is a normal image: medium or original --}} @if ($photo->size_variants->getMedium() !== null) - mediumsize_variants->getMedium2x() !== null) srcset='{{ URL::asset($photo->size_variants->getMedium()->url) }} {{ $photo->size_variants->getMedium()->width }}w, - {{ URL::asset($photo->size_variants->getMedium2x()->url) }} {{ $photo->size_variants->getMedium2x()->width }}w' @endif - data-tabindex='{{ Helpers::data_index() }}' /> + class='top-7 bottom-7 left-7 right-7' :srcset="$photo->size_variants->getMedium2x() === null + ? '' + : URL::asset($photo->size_variants->getMedium()->url) . + ' ' . + $photo->size_variants->getMedium()->width . + 'w, ' . + URL::asset($photo->size_variants->getMedium2x()->url) . + ' ' . + $photo->size_variants->getMedium2x()->width . + 'w'" /> @else - big + src='{{ URL::asset($photo->size_variants->getOriginal()->url) }}' /> @endif @elseif ($photo->size_variants->getMedium() !== null) {{-- This is a livephoto : medium --}} @@ -123,43 +122,52 @@ class='absolute top-7 bottom-7 left-7 right-7 m-auto w-auto h-auto max-w-[calc(1 @keyup.right.window="Alpine.navigate($el.getAttribute('href'));" wire:navigate.hover /> @endif @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) -
    - - +
    + + + + @if ($flags->can_rotate) @endif - + +
    @endcan
    @can(App\Policies\PhotoPolicy::CAN_EDIT, [App\Models\Photo::class, $photo]) -
    - -
    +
    + +
    @endcan
    diff --git a/tailwind.config.js b/tailwind.config.js index 0abb540d218..436c8462f43 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -18,6 +18,12 @@ module.exports = { ], theme: { extend: { + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + }, + dropShadow: { + '3xl': '0 20px 20px rgba(0, 0, 0, 1)', + }, colors: { dark: { // 50: '#fdf8f6', From 3004480cddb41899a42eb05d8f14facf08ad5921 Mon Sep 17 00:00:00 2001 From: ildyria Date: Tue, 5 Sep 2023 18:45:07 +0200 Subject: [PATCH 032/226] shortcut --- resources/views/components/shortcuts.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/components/shortcuts.blade.php b/resources/views/components/shortcuts.blade.php index 25b487cb1a5..7518459dfed 100644 --- a/resources/views/components/shortcuts.blade.php +++ b/resources/views/components/shortcuts.blade.php @@ -23,8 +23,8 @@ Shift ? Login l - Logout - l + Login with U2F + k From c6d793acc4c3dd8d41fa0d222c930079672913ad Mon Sep 17 00:00:00 2001 From: ildyria Date: Wed, 6 Sep 2023 12:30:08 +0200 Subject: [PATCH 033/226] improve interaction with shortcut menu --- resources/views/components/shortcuts.blade.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/views/components/shortcuts.blade.php b/resources/views/components/shortcuts.blade.php index 7518459dfed..9174c31cbbc 100644 --- a/resources/views/components/shortcuts.blade.php +++ b/resources/views/components/shortcuts.blade.php @@ -8,11 +8,10 @@ x-show="shortCutsOpen"> @endif
    - +
    {{-- We only display this menu if there are more than 1 user, it does not make sense otherwise --}} diff --git a/resources/views/livewire/forms/add/create-tag.blade.php b/resources/views/livewire/forms/add/create-tag.blade.php index 9398cd73912..65dcb26992d 100644 --- a/resources/views/livewire/forms/add/create-tag.blade.php +++ b/resources/views/livewire/forms/add/create-tag.blade.php @@ -16,6 +16,7 @@ {{ __('lychee.CANCEL') }} {{ __('lychee.CREATE_TAG_ALBUM') }}
    diff --git a/resources/views/livewire/forms/add/create.blade.php b/resources/views/livewire/forms/add/create.blade.php index aa269e59170..e8681f8dd0a 100644 --- a/resources/views/livewire/forms/add/create.blade.php +++ b/resources/views/livewire/forms/add/create.blade.php @@ -12,6 +12,7 @@ {{ __('lychee.CANCEL') }} {{ __('lychee.CREATE_ALBUM') }}
    diff --git a/resources/views/livewire/forms/add/import-from-server.blade.php b/resources/views/livewire/forms/add/import-from-server.blade.php index c39bd35b257..9566ac89ca8 100644 --- a/resources/views/livewire/forms/add/import-from-server.blade.php +++ b/resources/views/livewire/forms/add/import-from-server.blade.php @@ -40,6 +40,8 @@
    {{ __('lychee.CANCEL') }} - {{ __('lychee.UPLOAD_IMPORT') }} + {{ __('lychee.UPLOAD_IMPORT') }}
    \ No newline at end of file diff --git a/resources/views/livewire/forms/add/import-from-url.blade.php b/resources/views/livewire/forms/add/import-from-url.blade.php index 0454775d149..7bbcee63798 100644 --- a/resources/views/livewire/forms/add/import-from-url.blade.php +++ b/resources/views/livewire/forms/add/import-from-url.blade.php @@ -9,6 +9,8 @@
    {{ __('lychee.CANCEL') }} - {{ __('lychee.UPLOAD_IMPORT') }} + {{ __('lychee.UPLOAD_IMPORT') }}
    \ No newline at end of file diff --git a/resources/views/livewire/forms/album/move-panel.blade.php b/resources/views/livewire/forms/album/move-panel.blade.php new file mode 100644 index 00000000000..10731a6e303 --- /dev/null +++ b/resources/views/livewire/forms/album/move-panel.blade.php @@ -0,0 +1,13 @@ +
    + @if ($title !== null && $title !== '') +

    {{ sprintf(__('lychee.ALBUM_MOVE'), $titleMoved, $title) }}

    + {{ __('lychee.MOVE_ALBUM') }} + @else +
    +
    + {{ "Move to" }} +
    + +
    + @endif +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/album/move.blade.php b/resources/views/livewire/forms/album/move.blade.php index 10731a6e303..4191c4e7122 100644 --- a/resources/views/livewire/forms/album/move.blade.php +++ b/resources/views/livewire/forms/album/move.blade.php @@ -1,13 +1,27 @@ -
    - @if ($title !== null && $title !== '') -

    {{ sprintf(__('lychee.ALBUM_MOVE'), $titleMoved, $title) }}

    - {{ __('lychee.MOVE_ALBUM') }} - @else -
    -
    - {{ "Move to" }} -
    - -
    - @endif -
    \ No newline at end of file +
    +
    + @if ($title !== null && $title !== '') +

    + @if (count($albumIDs) === 1) + {{ sprintf(__('lychee.ALBUM_MOVE'), $titleMoved, $title) }} + @else + {{ sprintf(__('lychee.ALBUMS_MOVE'), $title) }} + @endif +

    + {{ count($albumIDs) === 1 ? __('lychee.MOVE_ALBUM') : __('lychee.MOVE_ALBUMS') }} + @else +
    +
    + {{ 'Move to' }} +
    + +
    + @endif +
    +
    + {{ __('lychee.CANCEL') }} +
    +
    diff --git a/resources/views/livewire/forms/photo/delete.blade.php b/resources/views/livewire/forms/photo/delete.blade.php index 542c03f886f..d538718d052 100644 --- a/resources/views/livewire/forms/photo/delete.blade.php +++ b/resources/views/livewire/forms/photo/delete.blade.php @@ -13,6 +13,6 @@ wire:click="close">{{ __('lychee.PHOTO_KEEP') }} {{ __('lychee.PHOTO_DELETE') }} + wire:click="submit">{{ count($photoIDs) === 1 ? __('lychee.PHOTO_DELETE') : __('lychee.DELETE_ALL') }}
    diff --git a/resources/views/livewire/forms/photo/rename.blade.php b/resources/views/livewire/forms/photo/rename.blade.php new file mode 100644 index 00000000000..8c0dfdccd06 --- /dev/null +++ b/resources/views/livewire/forms/photo/rename.blade.php @@ -0,0 +1,20 @@ +
    +
    +

    + {{ count($photoIDs) === 1 ? __('lychee.PHOTO_NEW_TITLE') : sprintf(__('lychee.PHOTOS_NEW_TITLE'), count($photoIDs)) }} +

    +
    +
    + +
    +
    +
    +
    + {{ __('lychee.CANCEL') }} + {{ count($photoIDs) === 1 ? __('lychee.RENAME') : __('lychee.RENAME_ALL') }} +
    +
    diff --git a/resources/views/livewire/forms/photo/tag.blade.php b/resources/views/livewire/forms/photo/tag.blade.php new file mode 100644 index 00000000000..5610ce1f1fe --- /dev/null +++ b/resources/views/livewire/forms/photo/tag.blade.php @@ -0,0 +1,26 @@ +
    +
    +

    + {{ count($photoIDs) === 1 ? __('lychee.PHOTO_NEW_TAGS') : sprintf(__('lychee.PHOTOS_NEW_TAGS'), count($photoIDs)) }} +

    +
    +
    + +
    +
    + + +
    + +
    +
    +
    + {{ __('lychee.CANCEL') }} + {{ __('lychee.PHOTO_SET_TAGS') }} +
    +
    diff --git a/resources/views/livewire/forms/photo/visibility.blade.php b/resources/views/livewire/forms/photo/visibility.blade.php deleted file mode 100644 index ae62f68638d..00000000000 --- a/resources/views/livewire/forms/photo/visibility.blade.php +++ /dev/null @@ -1,30 +0,0 @@ - \ No newline at end of file From a2c7524201536af8f854832beedde6787c243416 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sat, 16 Sep 2023 22:44:27 +0200 Subject: [PATCH 089/226] fix phpstan --- app/Livewire/Components/Forms/Photo/Tag.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Livewire/Components/Forms/Photo/Tag.php b/app/Livewire/Components/Forms/Photo/Tag.php index da65758fa19..f5b00f9c823 100644 --- a/app/Livewire/Components/Forms/Photo/Tag.php +++ b/app/Livewire/Components/Forms/Photo/Tag.php @@ -8,6 +8,7 @@ use App\Models\Photo; use App\Policies\PhotoPolicy; use Illuminate\Contracts\View\View; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Support\Facades\Gate; use Livewire\Attributes\Locked; @@ -54,7 +55,6 @@ public function submit(): void Gate::check(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); - /** @var Photo $photo */ $photos = Photo::query()->whereIn('id', $this->photoIDs)->get(); foreach ($photos as $photo) { if ($this->shall_override) { From c0a7ff6b2c0e55249f36159b52aebfbf6393f9ba Mon Sep 17 00:00:00 2001 From: ildyria Date: Sat, 16 Sep 2023 22:45:08 +0200 Subject: [PATCH 090/226] reordering --- app/Livewire/Components/Forms/Photo/Rename.php | 2 +- app/Livewire/Components/Forms/Photo/Tag.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Livewire/Components/Forms/Photo/Rename.php b/app/Livewire/Components/Forms/Photo/Rename.php index 635d675dd53..3d01922304c 100644 --- a/app/Livewire/Components/Forms/Photo/Rename.php +++ b/app/Livewire/Components/Forms/Photo/Rename.php @@ -3,8 +3,8 @@ namespace App\Livewire\Components\Forms\Photo; use App\Contracts\Livewire\Params; -use App\Livewire\Components\Pages\Gallery\Album as GalleryAlbum; use App\Http\RuleSets\Photo\SetPhotosTitleRuleSet; +use App\Livewire\Components\Pages\Gallery\Album as GalleryAlbum; use App\Livewire\Traits\InteractWithModal; use App\Models\Photo; use App\Policies\PhotoPolicy; diff --git a/app/Livewire/Components/Forms/Photo/Tag.php b/app/Livewire/Components/Forms/Photo/Tag.php index f5b00f9c823..414053cd2ae 100644 --- a/app/Livewire/Components/Forms/Photo/Tag.php +++ b/app/Livewire/Components/Forms/Photo/Tag.php @@ -8,7 +8,6 @@ use App\Models\Photo; use App\Policies\PhotoPolicy; use Illuminate\Contracts\View\View; -use Illuminate\Database\Eloquent\Collection; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Support\Facades\Gate; use Livewire\Attributes\Locked; @@ -21,9 +20,10 @@ class Tag extends Component /** @var array */ #[Locked] public array $photoIDs; + #[Locked] public array $tags = []; public bool $shall_override = false; public ?string $tag = ''; - #[Locked] public array $tags = []; + /** * This is the equivalent of the constructor for Livewire Components. * From caebeb7b0b693d8945b5739ffb66dff85c957863 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sat, 16 Sep 2023 23:01:15 +0200 Subject: [PATCH 091/226] stronger security --- app/Livewire/Components/Forms/Album/CreateTag.php | 1 - app/Livewire/Components/Forms/Album/Delete.php | 3 ++- app/Livewire/Components/Forms/Album/MovePanel.php | 5 +++-- app/Livewire/Components/Forms/Album/Properties.php | 3 ++- app/Livewire/Components/Forms/Album/ShareWith.php | 6 ++++++ app/Livewire/Components/Forms/Album/ShareWithLine.php | 2 +- app/Livewire/Components/Forms/Album/Transfer.php | 3 ++- app/Livewire/Components/Forms/Album/Visibility.php | 6 +++++- app/Livewire/Components/Forms/Confirms/SaveAll.php | 5 +++++ app/Livewire/Components/Forms/Photo/CopyTo.php | 4 ++-- app/Livewire/Components/Forms/Photo/Delete.php | 2 +- app/Livewire/Components/Forms/Photo/Move.php | 5 +++-- app/Livewire/Components/Forms/Photo/Rename.php | 4 +++- app/Livewire/Components/Forms/Photo/Tag.php | 2 +- .../Forms/Settings/Base/BaseConfigDoubleDropDown.php | 2 +- .../Components/Forms/Settings/Base/BaseConfigDropDown.php | 2 +- .../Components/Forms/Settings/Base/BooleanSetting.php | 2 +- .../Components/Forms/Settings/Base/StringSetting.php | 2 +- app/Livewire/Components/Forms/Settings/SetLayoutSetting.php | 2 +- app/Livewire/Components/Pages/Gallery/Photo.php | 2 -- 20 files changed, 41 insertions(+), 22 deletions(-) diff --git a/app/Livewire/Components/Forms/Album/CreateTag.php b/app/Livewire/Components/Forms/Album/CreateTag.php index d07ac14eef2..01f08d22c56 100644 --- a/app/Livewire/Components/Forms/Album/CreateTag.php +++ b/app/Livewire/Components/Forms/Album/CreateTag.php @@ -6,7 +6,6 @@ use App\Contracts\Models\AbstractAlbum; use App\Http\RuleSets\Album\AddTagAlbumRuleSet; use App\Livewire\Traits\InteractWithModal; -use App\Models\Album; use App\Policies\AlbumPolicy; use Illuminate\Support\Facades\Gate; use Illuminate\View\View; diff --git a/app/Livewire/Components/Forms/Album/Delete.php b/app/Livewire/Components/Forms/Album/Delete.php index a762d6c6c1a..d83a046663a 100644 --- a/app/Livewire/Components/Forms/Album/Delete.php +++ b/app/Livewire/Components/Forms/Album/Delete.php @@ -13,6 +13,7 @@ use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Gate; use Livewire\Attributes\Locked; use Livewire\Component; @@ -60,7 +61,7 @@ public function delete(AlbumFactory $albumFactory): \Illuminate\Routing\Redirect $baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumIDs[0], false); - $this->authorize(AlbumPolicy::CAN_DELETE, $baseAlbum); + Gate::authorize(AlbumPolicy::CAN_DELETE, $baseAlbum); $parent_id = ($baseAlbum instanceof Album) ? $baseAlbum->parent_id : null; diff --git a/app/Livewire/Components/Forms/Album/MovePanel.php b/app/Livewire/Components/Forms/Album/MovePanel.php index 2e761a35b77..8504c897ece 100644 --- a/app/Livewire/Components/Forms/Album/MovePanel.php +++ b/app/Livewire/Components/Forms/Album/MovePanel.php @@ -13,6 +13,7 @@ use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Gate; use Livewire\Attributes\Locked; use Livewire\Component; @@ -86,14 +87,14 @@ public function move(MoveAlbums $move): void /** @var ?Album $album */ $album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID); - $this->authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]); + Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]); // `findOrFail` returns a union type, but we know that it returns the // correct collection in this case /** @var Collection $albums */ $albums = Album::query()->findOrFail($this->albumIDs); foreach ($albums as $movedAlbum) { - $this->authorize(AlbumPolicy::CAN_EDIT, $movedAlbum); + Gate::authorize(AlbumPolicy::CAN_EDIT, $movedAlbum); } $move->do($album, $albums); diff --git a/app/Livewire/Components/Forms/Album/Properties.php b/app/Livewire/Components/Forms/Album/Properties.php index fdd0d32324f..52d19690221 100644 --- a/app/Livewire/Components/Forms/Album/Properties.php +++ b/app/Livewire/Components/Forms/Album/Properties.php @@ -16,6 +16,7 @@ use App\Rules\TitleRule; use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Support\Facades\Gate; use Livewire\Attributes\Locked; use Livewire\Component; @@ -76,7 +77,7 @@ public function submit(AlbumFactory $albumFactory): void } $baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumID, false); - $this->authorize(AlbumPolicy::CAN_EDIT, $baseAlbum); + Gate::authorize(AlbumPolicy::CAN_EDIT, $baseAlbum); $baseAlbum->title = $this->title; $baseAlbum->description = $this->description; diff --git a/app/Livewire/Components/Forms/Album/ShareWith.php b/app/Livewire/Components/Forms/Album/ShareWith.php index efeb90a0921..2c4c618e08b 100644 --- a/app/Livewire/Components/Forms/Album/ShareWith.php +++ b/app/Livewire/Components/Forms/Album/ShareWith.php @@ -2,6 +2,7 @@ namespace App\Livewire\Components\Forms\Album; +use App\Contracts\Models\AbstractAlbum; use App\Exceptions\Internal\QueryBuilderException; use App\Exceptions\UnauthorizedException; use App\Livewire\Traits\Notify; @@ -10,9 +11,11 @@ use App\Models\Configs; use App\Models\Extensions\BaseAlbum; use App\Models\User; +use App\Policies\AlbumPolicy; use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; use Illuminate\Support\Str; use Livewire\Component; @@ -47,6 +50,7 @@ class ShareWith extends Component public function mount(BaseAlbum $album): void { $this->album = $album; + Gate::authorize(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, $this->album]); $this->resetData(); } @@ -100,6 +104,8 @@ public function getUserListProperty(): array public function add(): void { + Gate::authorize(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, $this->album]); + $perm = new AccessPermission(); $perm->user_id = $this->userID; $perm->base_album_id = $this->album->id; diff --git a/app/Livewire/Components/Forms/Album/ShareWithLine.php b/app/Livewire/Components/Forms/Album/ShareWithLine.php index 07f855e8f0b..d9d29256335 100644 --- a/app/Livewire/Components/Forms/Album/ShareWithLine.php +++ b/app/Livewire/Components/Forms/Album/ShareWithLine.php @@ -68,7 +68,7 @@ public function render(): View */ public function updated($field, $value): void { - Gate::authorize(AlbumPolicy::IS_OWNER, [AbstractAlbum::class, $this->perm->album]); + Gate::authorize(AlbumPolicy::CAN_SHARE_WITH_USERS, [AbstractAlbum::class, $this->perm->album]); $this->perm->grants_full_photo_access = $this->grants_full_photo_access; $this->perm->grants_download = $this->grants_download; diff --git a/app/Livewire/Components/Forms/Album/Transfer.php b/app/Livewire/Components/Forms/Album/Transfer.php index b71724c3b3a..df14e700b76 100644 --- a/app/Livewire/Components/Forms/Album/Transfer.php +++ b/app/Livewire/Components/Forms/Album/Transfer.php @@ -15,6 +15,7 @@ use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Gate; use Livewire\Attributes\Locked; use Livewire\Component; @@ -86,7 +87,7 @@ public function transfer(AlbumFactory $albumFactory) $baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumID, false); // We use CAN DELETE because it is pretty much the same. Only the owner and admin can transfer ownership - $this->authorize(AlbumPolicy::CAN_DELETE, $baseAlbum); + Gate::authorize(AlbumPolicy::CAN_DELETE, $baseAlbum); $userId = User::query() ->select(['id']) diff --git a/app/Livewire/Components/Forms/Album/Visibility.php b/app/Livewire/Components/Forms/Album/Visibility.php index 88459cb6c6c..71fabdd06ad 100644 --- a/app/Livewire/Components/Forms/Album/Visibility.php +++ b/app/Livewire/Components/Forms/Album/Visibility.php @@ -3,6 +3,7 @@ namespace App\Livewire\Components\Forms\Album; use App\Actions\Album\SetProtectionPolicy; +use App\Contracts\Models\AbstractAlbum; use App\DTO\AlbumProtectionPolicy; use App\Factories\AlbumFactory; use App\Http\RuleSets\Album\SetAlbumProtectionPolicyRuleSet; @@ -12,6 +13,7 @@ use App\Policies\AlbumPolicy; use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Support\Facades\Gate; use Livewire\Attributes\Locked; use Livewire\Component; @@ -38,6 +40,8 @@ class Visibility extends Component */ public function mount(BaseAlbum $album): void { + Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]); + $this->albumID = $album->id; $this->is_nsfw = $album->is_nsfw; @@ -103,7 +107,7 @@ public function updated() $this->validate(SetAlbumProtectionPolicyRuleSet::rules()); - $this->authorize(AlbumPolicy::CAN_EDIT, $baseAlbum); + Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $baseAlbum]); if (!$this->is_public) { $this->setPrivate(); diff --git a/app/Livewire/Components/Forms/Confirms/SaveAll.php b/app/Livewire/Components/Forms/Confirms/SaveAll.php index 2e3e0a1d464..c3dc041d90c 100644 --- a/app/Livewire/Components/Forms/Confirms/SaveAll.php +++ b/app/Livewire/Components/Forms/Confirms/SaveAll.php @@ -4,7 +4,10 @@ use App\Livewire\Components\Pages\AllSettings; use App\Livewire\Traits\InteractWithModal; +use App\Models\Configs; +use App\Policies\SettingsPolicy; use Illuminate\Contracts\View\View; +use Illuminate\Support\Facades\Gate; use Livewire\Component; /** @@ -21,6 +24,8 @@ class SaveAll extends Component */ public function render(): View { + Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]); + return view('livewire.forms.confirms.save-all'); } diff --git a/app/Livewire/Components/Forms/Photo/CopyTo.php b/app/Livewire/Components/Forms/Photo/CopyTo.php index df5f76fc09f..3a20ff8cc2d 100644 --- a/app/Livewire/Components/Forms/Photo/CopyTo.php +++ b/app/Livewire/Components/Forms/Photo/CopyTo.php @@ -80,13 +80,13 @@ public function setAlbum(string $id, string $title): void $this->title = $title; $this->validate(DuplicatePhotosRuleSet::rules()); - Gate::check(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); + Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); $this->albumID = $this->albumID === '' ? null : $this->albumID; /** @var ?Album $album */ $album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID); - Gate::check(AlbumPolicy::CAN_EDIT, [Album::class, $album]); + Gate::authorize(AlbumPolicy::CAN_EDIT, [Album::class, $album]); $photos = Photo::query()->findOrFail($this->photoIDs); diff --git a/app/Livewire/Components/Forms/Photo/Delete.php b/app/Livewire/Components/Forms/Photo/Delete.php index e25706fb26a..174454c8894 100644 --- a/app/Livewire/Components/Forms/Photo/Delete.php +++ b/app/Livewire/Components/Forms/Photo/Delete.php @@ -68,7 +68,7 @@ public function submit(DeleteAction $delete): \Illuminate\Routing\Redirector|\Il { $this->validate(DeletePhotosRuleSet::rules()); - Gate::check(PhotoPolicy::CAN_DELETE_BY_ID, [Photo::class, $this->photoIDs]); + Gate::authorize(PhotoPolicy::CAN_DELETE_BY_ID, [Photo::class, $this->photoIDs]); $fileDeleter = $delete->do($this->photoIDs); App::terminating(fn () => $fileDeleter->do()); diff --git a/app/Livewire/Components/Forms/Photo/Move.php b/app/Livewire/Components/Forms/Photo/Move.php index 8fb7d000e99..33fd8535606 100644 --- a/app/Livewire/Components/Forms/Photo/Move.php +++ b/app/Livewire/Components/Forms/Photo/Move.php @@ -48,6 +48,7 @@ public function mount(array $params = ['albumID' => null]): void $this->photoIDs = $params[Params::PHOTO_IDS] ?? []; } + Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); $this->parent_id = $params[Params::ALBUM_ID] ?? SmartAlbumType::UNSORTED->value; } @@ -65,13 +66,13 @@ public function setAlbum(string $id, string $title): void $this->title = $title; $this->validate(MovePhotosRuleSet::rules()); - Gate::check(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); + Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); $this->albumID = $this->albumID === '' ? null : $this->albumID; /** @var ?Album $album */ $album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID); - Gate::check(AlbumPolicy::CAN_EDIT, [Album::class, $album]); + Gate::authorize(AlbumPolicy::CAN_EDIT, [Album::class, $album]); $photos = Photo::query()->findOrFail($this->photoIDs); diff --git a/app/Livewire/Components/Forms/Photo/Rename.php b/app/Livewire/Components/Forms/Photo/Rename.php index 3d01922304c..4eebaf99004 100644 --- a/app/Livewire/Components/Forms/Photo/Rename.php +++ b/app/Livewire/Components/Forms/Photo/Rename.php @@ -41,6 +41,8 @@ public function mount(array $params = ['albumID' => null]): void } else { $this->photoIDs = $params[Params::PHOTO_IDS] ?? []; } + + Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); } /** @@ -51,7 +53,7 @@ public function mount(array $params = ['albumID' => null]): void public function submit(): void { $this->validate(SetPhotosTitleRuleSet::rules()); - Gate::check(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); + Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); Photo::query()->whereIn('id', $this->photoIDs)->update(['title' => $this->title]); $this->close(); diff --git a/app/Livewire/Components/Forms/Photo/Tag.php b/app/Livewire/Components/Forms/Photo/Tag.php index 414053cd2ae..a71a5a271ac 100644 --- a/app/Livewire/Components/Forms/Photo/Tag.php +++ b/app/Livewire/Components/Forms/Photo/Tag.php @@ -53,7 +53,7 @@ public function submit(): void { $this->tags = collect(explode(',', $this->tag))->map(fn ($v, $k) => trim($v))->filter(fn ($v) => $v !== '')->all(); - Gate::check(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); + Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); $photos = Photo::query()->whereIn('id', $this->photoIDs)->get(); foreach ($photos as $photo) { diff --git a/app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php index a14b48c5606..d10ae9a52fc 100644 --- a/app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php +++ b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDoubleDropDown.php @@ -58,7 +58,7 @@ public function render(): View */ public function updated($field, $value) { - Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]); $error_msg = $this->config1->sanity($this->value1); if ($error_msg !== '') { $this->notify($error_msg, NotificationType::ERROR); diff --git a/app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php index e08fafff1f6..c7b2ac354a7 100644 --- a/app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php +++ b/app/Livewire/Components/Forms/Settings/Base/BaseConfigDropDown.php @@ -47,7 +47,7 @@ public function render(): View */ public function updating($field, $value): void { - Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]); $error_msg = $this->config->sanity($value); if ($error_msg !== '') { $this->notify($error_msg, NotificationType::ERROR); diff --git a/app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php b/app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php index 5e47501f121..6ff57bce154 100644 --- a/app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php +++ b/app/Livewire/Components/Forms/Settings/Base/BooleanSetting.php @@ -69,7 +69,7 @@ public function render(): View */ public function updating($field, $value) { - Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]); $error_msg = $this->config->sanity($value === true ? '1' : '0'); if ($error_msg !== '') { diff --git a/app/Livewire/Components/Forms/Settings/Base/StringSetting.php b/app/Livewire/Components/Forms/Settings/Base/StringSetting.php index 73240d0a61f..d64f7b399ce 100644 --- a/app/Livewire/Components/Forms/Settings/Base/StringSetting.php +++ b/app/Livewire/Components/Forms/Settings/Base/StringSetting.php @@ -60,7 +60,7 @@ public function render(): View */ public function save(): void { - Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]); $error_msg = $this->config->sanity($this->value); if ($error_msg !== '') { $this->notify($error_msg, NotificationType::ERROR); diff --git a/app/Livewire/Components/Forms/Settings/SetLayoutSetting.php b/app/Livewire/Components/Forms/Settings/SetLayoutSetting.php index d320510c0a1..3d79bad66b1 100644 --- a/app/Livewire/Components/Forms/Settings/SetLayoutSetting.php +++ b/app/Livewire/Components/Forms/Settings/SetLayoutSetting.php @@ -46,7 +46,7 @@ public function render(): View public function updating($field, $value): void { - Gate::check(SettingsPolicy::CAN_EDIT, [Configs::class]); + Gate::authorize(SettingsPolicy::CAN_EDIT, [Configs::class]); // Fetch the keys and reverse index. $reverse = array_flip(array_keys($this->getOptionsProperty())); diff --git a/app/Livewire/Components/Pages/Gallery/Photo.php b/app/Livewire/Components/Pages/Gallery/Photo.php index ff833d50560..056650f70ea 100644 --- a/app/Livewire/Components/Pages/Gallery/Photo.php +++ b/app/Livewire/Components/Pages/Gallery/Photo.php @@ -87,8 +87,6 @@ public function mount(string $albumId, string $photoId): void $this->previousPhoto = ($wrapOver && $idx_previous > $idx) || $idx_previous < $idx ? $this->album->photos->get($idx_previous) : null; $this->nextPhoto = ($wrapOver && $idx_next < $idx) || $idx < $idx_next ? $this->album->photos->get($idx_next) : null; - - // $this->locked = Gate::check(AlbumPolicy::CAN_ACCESS, [AbstractAlbum::class, $this->album]); } /** From 496d6f5ddc523582ac8d3f322a5b24b89e3a4441 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 17 Sep 2023 00:39:39 +0200 Subject: [PATCH 092/226] done --- .../Components/Forms/Album/Create.php | 6 +- .../Components/Forms/Album/Delete.php | 61 ++++---- .../Components/Forms/Album/DeletePanel.php | 86 +++++++++++ app/Livewire/Components/Forms/Album/Merge.php | 133 ++++++++++++++++++ app/Livewire/Components/Forms/Album/Move.php | 133 ++++++++++++++++++ .../Components/Forms/Album/MovePanel.php | 20 +-- .../Components/Forms/Album/Rename.php | 94 +++++++++++++ .../Components/Forms/Photo/CopyTo.php | 4 + .../Components/Forms/Photo/Delete.php | 2 + .../Components/Forms/Photo/Download.php | 4 +- app/Livewire/Components/Forms/Photo/Move.php | 2 + .../Components/Forms/Photo/Rename.php | 3 + app/Livewire/Components/Forms/Photo/Tag.php | 4 + .../Components/Menus/AlbumDropdown.php | 11 +- .../Components/Menus/AlbumsDropdown.php | 11 +- .../gallery/album/menu/menu.blade.php | 2 +- .../forms/album/delete-panel.blade.php | 5 + .../livewire/forms/album/delete.blade.php | 25 +++- .../livewire/forms/album/merge.blade.php | 35 +++++ .../views/livewire/forms/album/move.blade.php | 46 +++--- .../livewire/forms/album/rename.blade.php | 20 +++ .../livewire/forms/photo/copyTo.blade.php | 4 +- .../livewire/forms/photo/delete.blade.php | 6 +- .../views/livewire/forms/photo/move.blade.php | 4 +- .../livewire/forms/photo/rename.blade.php | 4 +- .../views/livewire/forms/photo/tag.blade.php | 2 +- 26 files changed, 642 insertions(+), 85 deletions(-) create mode 100644 app/Livewire/Components/Forms/Album/DeletePanel.php create mode 100644 app/Livewire/Components/Forms/Album/Merge.php create mode 100644 app/Livewire/Components/Forms/Album/Move.php create mode 100644 app/Livewire/Components/Forms/Album/Rename.php create mode 100644 resources/views/livewire/forms/album/delete-panel.blade.php create mode 100644 resources/views/livewire/forms/album/merge.blade.php create mode 100644 resources/views/livewire/forms/album/rename.blade.php diff --git a/app/Livewire/Components/Forms/Album/Create.php b/app/Livewire/Components/Forms/Album/Create.php index dd0be3884a8..2780752d404 100644 --- a/app/Livewire/Components/Forms/Album/Create.php +++ b/app/Livewire/Components/Forms/Album/Create.php @@ -26,7 +26,7 @@ class Create extends Component */ use InteractWithModal; - #[Locked] public ?string $parentId; + #[Locked] public ?string $parent_id; public string $title = ''; /** @@ -49,7 +49,7 @@ protected function rules(): array */ public function mount(array $params = []): void { - $this->parentId = $params[Params::PARENT_ID]; + $this->parent_id = $params[Params::PARENT_ID]; } /** @@ -76,7 +76,7 @@ public function submit(): void $this->validate(); /** @var Album|null $parentAlbum */ - $parentAlbum = $this->parentId === null ? null : Album::query()->findOrFail($this->parentId); + $parentAlbum = $this->parent_id === null ? null : Album::query()->findOrFail($this->parent_id); // Authorize Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $parentAlbum]); diff --git a/app/Livewire/Components/Forms/Album/Delete.php b/app/Livewire/Components/Forms/Album/Delete.php index d83a046663a..0b4d76f50ee 100644 --- a/app/Livewire/Components/Forms/Album/Delete.php +++ b/app/Livewire/Components/Forms/Album/Delete.php @@ -3,12 +3,12 @@ namespace App\Livewire\Components\Forms\Album; use App\Actions\Album\Delete as DeleteAction; +use App\Contracts\Livewire\Params; +use App\Contracts\Models\AbstractAlbum; +use App\Enum\SmartAlbumType; use App\Factories\AlbumFactory; use App\Http\RuleSets\Album\DeleteAlbumsRuleSet; -use App\Livewire\Traits\Notify; -use App\Livewire\Traits\UseValidator; -use App\Models\Album; -use App\Models\Extensions\BaseAlbum; +use App\Livewire\Traits\InteractWithModal; use App\Policies\AlbumPolicy; use Illuminate\Contracts\View\View; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; @@ -20,24 +20,44 @@ class Delete extends Component { use AuthorizesRequests; - use UseValidator; - use Notify; + use InteractWithModal; // We need to use an array instead of directly said album id to reuse the rules (because I'm lazy). /** @var array */ #[Locked] public array $albumIDs; - #[Locked] public string $title; + #[Locked] public string $parent_id; + #[Locked] public string $title = ''; + #[Locked] public int $num; + private AlbumFactory $albumFactory; + private DeleteAction $deleteAction; + + public function boot(): void + { + $this->albumFactory = resolve(AlbumFactory::class); + $this->deleteAction = resolve(DeleteAction::class); + } + /** * This is the equivalent of the constructor for Livewire Components. * - * @param BaseAlbum $album to update the attributes of + * @param array{albumID?:string,albumIDs?:array,parentID:?string} $params to delete * * @return void */ - public function mount(BaseAlbum $album): void + public function mount(array $params = ['parentID' => null]): void { - $this->albumIDs = [$album->id]; - $this->title = $album->title; + $id = $params[Params::ALBUM_ID] ?? null; + if ($id !== null) { + $this->albumIDs = [$id]; + $this->title = $this->albumFactory->findBaseAlbumOrFail($id)->title; + } else { + $this->albumIDs = $params[Params::ALBUM_IDS] ?? []; + } + + Gate::authorize(AlbumPolicy::CAN_DELETE_ID, [AbstractAlbum::class, $this->albumIDs]); + $this->parent_id = $params[Params::PARENT_ID] ?? SmartAlbumType::UNSORTED->value; + + $this->num = count($this->albumIDs); } /** @@ -53,26 +73,17 @@ public function render(): View /** * Execute deletion. * - * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + * @return void */ - public function delete(AlbumFactory $albumFactory): \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + public function delete(): void { $this->validate(DeleteAlbumsRuleSet::rules()); - $baseAlbum = $albumFactory->findBaseAlbumOrFail($this->albumIDs[0], false); - - Gate::authorize(AlbumPolicy::CAN_DELETE, $baseAlbum); + Gate::authorize(AlbumPolicy::CAN_DELETE_ID, [AbstractAlbum::class, $this->albumIDs]); - $parent_id = ($baseAlbum instanceof Album) ? $baseAlbum->parent_id : null; - - $delete = resolve(DeleteAction::class); - $fileDeleter = $delete->do([$baseAlbum->id]); + $fileDeleter = $this->deleteAction->do($this->albumIDs); App::terminating(fn () => $fileDeleter->do()); - if ($parent_id !== null) { - return redirect()->to(route('livewire-gallery-album', ['albumId' => $parent_id])); - } - - return redirect()->to(route('livewire-gallery')); + $this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true); } } diff --git a/app/Livewire/Components/Forms/Album/DeletePanel.php b/app/Livewire/Components/Forms/Album/DeletePanel.php new file mode 100644 index 00000000000..7c841e7edad --- /dev/null +++ b/app/Livewire/Components/Forms/Album/DeletePanel.php @@ -0,0 +1,86 @@ + */ + #[Locked] public array $albumIDs; + #[Locked] public string $title; + private AlbumFactory $albumFactory; + private DeleteAction $deleteAction; + + public function boot(): void + { + $this->albumFactory = resolve(AlbumFactory::class); + $this->deleteAction = resolve(DeleteAction::class); + } + + /** + * This is the equivalent of the constructor for Livewire Components. + * + * @param BaseAlbum $album to update the attributes of + * + * @return void + */ + public function mount(BaseAlbum $album): void + { + $this->albumIDs = [$album->id]; + $this->title = $album->title; + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.delete-panel'); + } + + /** + * Execute deletion. + * + * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + */ + public function delete(): \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse + { + $this->validate(DeleteAlbumsRuleSet::rules()); + + $baseAlbum = $this->albumFactory->findBaseAlbumOrFail($this->albumIDs[0], false); + + Gate::authorize(AlbumPolicy::CAN_DELETE, $baseAlbum); + + $parent_id = ($baseAlbum instanceof Album) ? $baseAlbum->parent_id : null; + + $fileDeleter = $this->deleteAction->do([$baseAlbum->id]); + App::terminating(fn () => $fileDeleter->do()); + + if ($parent_id !== null) { + return redirect()->to(route('livewire-gallery-album', ['albumId' => $parent_id])); + } + + return redirect()->to(route('livewire-gallery')); + } +} diff --git a/app/Livewire/Components/Forms/Album/Merge.php b/app/Livewire/Components/Forms/Album/Merge.php new file mode 100644 index 00000000000..3d9b945b50d --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Merge.php @@ -0,0 +1,133 @@ + */ + #[Locked] public array $albumIDs; + #[Locked] public string $titleMoved = ''; + #[Locked] public int $num; + // Destination + #[Locked] public ?string $albumID = null; + #[Locked] public ?string $title = null; + #[Locked] public ?int $lft = null; + #[Locked] public ?int $rgt = null; + private AlbumFactory $albumFactory; + private AlbumMerge $mergeAlbums; + + public function boot(): void + { + $this->albumFactory = resolve(AlbumFactory::class); + $this->mergeAlbums = resolve(AlbumMerge::class); + } + + /** + * This is the equivalent of the constructor for Livewire Components. + * + * @param array{albumID?:string,albumIDs?:array,parentID:?string} $params to move + * + * @return void + */ + public function mount(array $params = ['parentID' => null]): void + { + $id = $params[Params::ALBUM_ID] ?? null; + if ($id !== null) { + $this->albumIDs = [$id]; + /** @var Album $album */ + $album = $this->albumFactory->findBaseAlbumOrFail($id, false); + $this->lft = $album->_lft; + $this->rgt = $album->_rgt; + } else { + $this->albumIDs = $params[Params::ALBUM_IDS] ?? []; + } + + if ($id === null && count($this->albumIDs) > 1) { + $this->albumID = array_shift($this->albumIDs); + $this->title = $this->albumFactory->findBaseAlbumOrFail($this->albumID, false)->title; + } + if ($id === null && count($this->albumIDs) === 1) { + $this->titleMoved = $this->albumFactory->findBaseAlbumOrFail($this->albumIDs[0], false)->title; + } + + Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, $this->albumIDs]); + $this->parent_id = $params[Params::PARENT_ID] ?? SmartAlbumType::UNSORTED->value; + $this->num = count($this->albumIDs); + } + + /** + * Prepare confirmation step. + * + * @param string $id + * @param string $title + * + * @return void + */ + public function setAlbum(string $id, string $title): void + { + $this->albumID = $id; + $this->title = $title; + } + + public function submit(): void + { + $this->albumID = $this->albumID === '' ? null : $this->albumID; + + $this->validate(MergeAlbumsRuleSet::rules()); + Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, $this->albumIDs]); + + /** @var ?Album $album */ + $album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID); + Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]); + + // `findOrFail` returns a union type, but we know that it returns the + // correct collection in this case + /** @var Collection $albums */ + $albums = Album::query()->findOrFail($this->albumIDs); + + $this->mergeAlbums->do($album, $albums); + + $this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true); + $this->close(); + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.merge'); + } + + /** + * Add an handle to close the modal form from a user-land call. + * + * @return void + */ + public function close(): void + { + $this->closeModal(); + } +} diff --git a/app/Livewire/Components/Forms/Album/Move.php b/app/Livewire/Components/Forms/Album/Move.php new file mode 100644 index 00000000000..5ea4a5986c4 --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Move.php @@ -0,0 +1,133 @@ + */ + #[Locked] public array $albumIDs; + #[Locked] public string $titleMoved = ''; + #[Locked] public int $num; + // Destination + #[Locked] public ?string $albumID = null; + #[Locked] public ?string $title = null; + #[Locked] public int $lft; + #[Locked] public int $rgt; + private AlbumFactory $albumFactory; + private AlbumMove $moveAlbums; + + public function boot(): void + { + $this->albumFactory = resolve(AlbumFactory::class); + $this->moveAlbums = resolve(AlbumMove::class); + } + + /** + * This is the equivalent of the constructor for Livewire Components. + * + * @param array{albumID?:string,albumIDs?:array,parentID:?string} $params to move + * + * @return void + */ + public function mount(array $params = ['parentID' => null]): void + { + $id = $params[Params::ALBUM_ID] ?? null; + if ($id !== null) { + $this->albumIDs = [$id]; + /** @var Album $album */ + $album = $this->albumFactory->findBaseAlbumOrFail($id, false); + $this->titleMoved = $album->title; + $this->lft = $album->_lft; + $this->rgt = $album->_rgt; + } else { + $this->albumIDs = $params[Params::ALBUM_IDS] ?? []; + } + + Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, $this->albumIDs]); + $this->parent_id = $params[Params::PARENT_ID] ?? null; + + // TODO : This could be dangerous: it is possible to put an album within itself! + // Some safety, but not perfect. + if ($this->parent_id !== null && $id !== null) { + /** @var Album $album */ + $album = $this->albumFactory->findBaseAlbumOrFail($id, false); + $this->lft = $album->_lft; + $this->rgt = $album->_rgt; + } + $this->num = count($this->albumIDs); + } + + /** + * Prepare confirmation step. + * + * @param string $id + * @param string $title + * + * @return void + */ + public function setAlbum(string $id, string $title): void + { + $this->albumID = $id; + $this->title = $title; + } + + public function submit(): void + { + $this->albumID = $this->albumID === '' ? null : $this->albumID; + + $this->validate(MoveAlbumsRuleSet::rules()); + Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, $this->albumIDs]); + + /** @var ?Album $album */ + $album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID); + Gate::authorize(AlbumPolicy::CAN_EDIT, [AbstractAlbum::class, $album]); + + // `findOrFail` returns a union type, but we know that it returns the + // correct collection in this case + /** @var Collection $albums */ + $albums = Album::query()->findOrFail($this->albumIDs); + $this->moveAlbums->do($album, $albums); + + $this->redirect(route('livewire-gallery-album', ['albumId' => $this->parent_id]), true); + $this->close(); + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.move'); + } + + /** + * Add an handle to close the modal form from a user-land call. + * + * @return void + */ + public function close(): void + { + $this->closeModal(); + } +} diff --git a/app/Livewire/Components/Forms/Album/MovePanel.php b/app/Livewire/Components/Forms/Album/MovePanel.php index 8504c897ece..3e23f950fd8 100644 --- a/app/Livewire/Components/Forms/Album/MovePanel.php +++ b/app/Livewire/Components/Forms/Album/MovePanel.php @@ -2,7 +2,7 @@ namespace App\Livewire\Components\Forms\Album; -use App\Actions\Album\Move as MoveAlbums; +use App\Actions\Album\Move as AlbumMove; use App\Contracts\Models\AbstractAlbum; use App\Http\RuleSets\Album\MoveAlbumsRuleSet; use App\Livewire\Components\Pages\Gallery\Album as GalleryAlbum; @@ -33,6 +33,13 @@ class MovePanel extends Component #[Locked] public ?string $parent_id; #[Locked] public int $lft; #[Locked] public int $rgt; + private AlbumMove $moveAlbums; + + public function boot(): void + { + $this->moveAlbums = resolve(AlbumMove::class); + } + /** * This is the equivalent of the constructor for Livewire Components. * @@ -75,15 +82,14 @@ public function render(): View /** * Execute transfer of ownership. - * - * @param MoveAlbums $move */ - public function move(MoveAlbums $move): void + public function move(): void { $this->areValid(MoveAlbumsRuleSet::rules()); // set default for root. $this->albumID = $this->albumID === '' ? null : $this->albumID; + Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, $this->albumIDs]); /** @var ?Album $album */ $album = $this->albumID === null ? null : Album::query()->findOrFail($this->albumID); @@ -93,11 +99,7 @@ public function move(MoveAlbums $move): void // correct collection in this case /** @var Collection $albums */ $albums = Album::query()->findOrFail($this->albumIDs); - foreach ($albums as $movedAlbum) { - Gate::authorize(AlbumPolicy::CAN_EDIT, $movedAlbum); - } - - $move->do($album, $albums); + $this->moveAlbums->do($album, $albums); $this->dispatch('toggleAlbumDetails')->to(GalleryAlbum::class); $this->notify(__('lychee.CHANGE_SUCCESS')); diff --git a/app/Livewire/Components/Forms/Album/Rename.php b/app/Livewire/Components/Forms/Album/Rename.php new file mode 100644 index 00000000000..7cc42b5d2b8 --- /dev/null +++ b/app/Livewire/Components/Forms/Album/Rename.php @@ -0,0 +1,94 @@ + */ + #[Locked] public array $albumIDs; + #[Locked] public int $num; + public string $title = ''; + + private AlbumFactory $albumFactory; + + public function boot(): void + { + $this->albumFactory = resolve(AlbumFactory::class); + } + + /** + * This is the equivalent of the constructor for Livewire Components. + * + * @param array{albumID?:string,albumIDs?:array,parentID:?string} $params to move + * + * @return void + */ + public function mount(array $params = ['parentID' => null]): void + { + $id = $params[Params::ALBUM_ID] ?? null; + if ($id !== null) { + $this->albumIDs = [$id]; + $this->title = $this->albumFactory->findBaseAlbumOrFail($id, false)->title; + } else { + $this->albumIDs = $params[Params::ALBUM_IDS] ?? []; + } + + Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, $this->albumIDs]); + $this->parent_id = $params[Params::PARENT_ID] ?? SmartAlbumType::UNSORTED->value; + $this->num = count($this->albumIDs); + } + + /** + * Rename. + * + * @return void + */ + public function submit(): void + { + $this->validate(SetAlbumsTitleRuleSet::rules()); + Gate::authorize(AlbumPolicy::CAN_EDIT_ID, [AbstractAlbum::class, $this->albumIDs]); + BaseAlbumImpl::query()->whereIn('id', $this->albumIDs)->update(['title' => $this->title]); + + $this->close(); + $this->dispatch('reloadPage')->to(GalleryAlbum::class); + } + + /** + * Simply render the form. + * + * @return View + */ + public function render(): View + { + return view('livewire.forms.album.rename'); + } + + /** + * Add an handle to close the modal form from a user-land call. + * + * @return void + */ + public function close(): void + { + $this->closeModal(); + } +} diff --git a/app/Livewire/Components/Forms/Photo/CopyTo.php b/app/Livewire/Components/Forms/Photo/CopyTo.php index 3a20ff8cc2d..c37f3f69c5f 100644 --- a/app/Livewire/Components/Forms/Photo/CopyTo.php +++ b/app/Livewire/Components/Forms/Photo/CopyTo.php @@ -36,6 +36,7 @@ class CopyTo extends Component // Destination #[Locked] public ?string $albumID = null; #[Locked] public ?string $albumTitle = null; + #[Locked] public int $num; /** * Boot method. */ @@ -63,7 +64,10 @@ public function mount(array $params = ['albumID' => null]): void $this->photoIDs = $params[Params::PHOTO_IDS] ?? []; } + Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); + $this->parent_id = $params[Params::ALBUM_ID] ?? SmartAlbumType::UNSORTED->value; + $this->num = count($this->photoIDs); } /** diff --git a/app/Livewire/Components/Forms/Photo/Delete.php b/app/Livewire/Components/Forms/Photo/Delete.php index 174454c8894..137134a37a4 100644 --- a/app/Livewire/Components/Forms/Photo/Delete.php +++ b/app/Livewire/Components/Forms/Photo/Delete.php @@ -29,6 +29,7 @@ class Delete extends Component #[Locked] public array $photoIDs; #[Locked] public string $albumId; #[Locked] public string $title = ''; + #[Locked] public int $num; /** * This is the equivalent of the constructor for Livewire Components. * @@ -47,6 +48,7 @@ public function mount(array $params = ['albumID' => null]): void } $this->albumId = $params[Params::ALBUM_ID] ?? null; + $this->num = count($this->photoIDs); } /** diff --git a/app/Livewire/Components/Forms/Photo/Download.php b/app/Livewire/Components/Forms/Photo/Download.php index ed0696b9582..87c849e8ae8 100644 --- a/app/Livewire/Components/Forms/Photo/Download.php +++ b/app/Livewire/Components/Forms/Photo/Download.php @@ -39,9 +39,7 @@ public function mount(array $params = ['albumID' => null]): void $this->photo = Photo::query()->findOrFail($id); } else { $this->photoIDs = $params[Params::PHOTO_IDS] ?? null; - $this->redirect(route('photo_download', - ['photoIDs' => $this->photoIDs, - 'kind' => DownloadVariantType::ORIGINAL->value])); + $this->redirect(route('photo_download', ['kind' => DownloadVariantType::ORIGINAL->value]) . '&photoIDs=' . implode(',', $this->photoIDs)); } } diff --git a/app/Livewire/Components/Forms/Photo/Move.php b/app/Livewire/Components/Forms/Photo/Move.php index 33fd8535606..759f67aa245 100644 --- a/app/Livewire/Components/Forms/Photo/Move.php +++ b/app/Livewire/Components/Forms/Photo/Move.php @@ -26,6 +26,7 @@ class Move extends Component /** @var array */ #[Locked] public array $photoIDs; #[Locked] public string $title = ''; + #[Locked] public int $num; // Destination #[Locked] public ?string $albumID = null; #[Locked] public ?string $albumTitle = null; @@ -50,6 +51,7 @@ public function mount(array $params = ['albumID' => null]): void Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); $this->parent_id = $params[Params::ALBUM_ID] ?? SmartAlbumType::UNSORTED->value; + $this->num = count($this->photoIDs); } /** diff --git a/app/Livewire/Components/Forms/Photo/Rename.php b/app/Livewire/Components/Forms/Photo/Rename.php index 4eebaf99004..8331f9b7ac6 100644 --- a/app/Livewire/Components/Forms/Photo/Rename.php +++ b/app/Livewire/Components/Forms/Photo/Rename.php @@ -21,6 +21,7 @@ class Rename extends Component /** @var array */ #[Locked] public array $photoIDs; + #[Locked] public int $num; public string $title = ''; /** @@ -43,6 +44,8 @@ public function mount(array $params = ['albumID' => null]): void } Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); + + $this->num = count($this->photoIDs); } /** diff --git a/app/Livewire/Components/Forms/Photo/Tag.php b/app/Livewire/Components/Forms/Photo/Tag.php index a71a5a271ac..d57acdae1f6 100644 --- a/app/Livewire/Components/Forms/Photo/Tag.php +++ b/app/Livewire/Components/Forms/Photo/Tag.php @@ -21,6 +21,7 @@ class Tag extends Component /** @var array */ #[Locked] public array $photoIDs; #[Locked] public array $tags = []; + #[Locked] public int $num; public bool $shall_override = false; public ?string $tag = ''; @@ -42,6 +43,9 @@ public function mount(array $params = ['albumID' => null]): void } else { $this->photoIDs = $params[Params::PHOTO_IDS] ?? []; } + + Gate::authorize(PhotoPolicy::CAN_EDIT_ID, [Photo::class, $this->photoIDs]); + $this->num = count($this->photoIDs); } /** diff --git a/app/Livewire/Components/Menus/AlbumDropdown.php b/app/Livewire/Components/Menus/AlbumDropdown.php index f26cc71d893..a944619cdad 100644 --- a/app/Livewire/Components/Menus/AlbumDropdown.php +++ b/app/Livewire/Components/Menus/AlbumDropdown.php @@ -2,6 +2,7 @@ namespace App\Livewire\Components\Menus; +use App\Contracts\Livewire\Params; use App\Livewire\Traits\InteractWithContextMenu; use App\Livewire\Traits\InteractWithModal; use Illuminate\Contracts\View\View; @@ -31,30 +32,30 @@ public function render(): View public function rename(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->openModal('forms.album.rename', [Params::ALBUM_ID => $this->params[Params::ALBUM_ID], Params::PARENT_ID => $this->params[Params::PARENT_ID]]); } public function merge(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->openModal('forms.album.merge', [Params::ALBUM_ID => $this->params[Params::ALBUM_ID], Params::PARENT_ID => $this->params[Params::PARENT_ID]]); } public function move(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->openModal('forms.album.move', [Params::ALBUM_ID => $this->params[Params::ALBUM_ID], Params::PARENT_ID => $this->params[Params::PARENT_ID]]); } public function delete(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->openModal('forms.album.delete', [Params::ALBUM_ID => $this->params[Params::ALBUM_ID], Params::PARENT_ID => $this->params[Params::PARENT_ID]]); } public function download(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->redirect(route('download', ['albumIDs' => $this->params[Params::ALBUM_ID]])); } } diff --git a/app/Livewire/Components/Menus/AlbumsDropdown.php b/app/Livewire/Components/Menus/AlbumsDropdown.php index 25ff1692caf..7cbe9e9d196 100644 --- a/app/Livewire/Components/Menus/AlbumsDropdown.php +++ b/app/Livewire/Components/Menus/AlbumsDropdown.php @@ -2,6 +2,7 @@ namespace App\Livewire\Components\Menus; +use App\Contracts\Livewire\Params; use App\Livewire\Traits\InteractWithContextMenu; use App\Livewire\Traits\InteractWithModal; use Illuminate\Contracts\View\View; @@ -31,30 +32,30 @@ public function render(): View public function renameAll(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->openModal('forms.album.rename', [Params::ALBUM_IDS => $this->params[Params::ALBUM_IDS], Params::PARENT_ID => $this->params[Params::PARENT_ID]]); } public function mergeAll(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->openModal('forms.album.merge', [Params::ALBUM_IDS => $this->params[Params::ALBUM_IDS], Params::PARENT_ID => $this->params[Params::PARENT_ID]]); } public function moveAll(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->openModal('forms.album.move', [Params::ALBUM_IDS => $this->params[Params::ALBUM_IDS], Params::PARENT_ID => $this->params[Params::PARENT_ID]]); } public function deleteAll(): void { $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); + $this->openModal('forms.album.delete', [Params::ALBUM_IDS => $this->params[Params::ALBUM_IDS], Params::PARENT_ID => $this->params[Params::PARENT_ID]]); } public function downloadAll(): void { + $this->redirect(route('download') . '?albumIDs=' . implode(',', $this->params[Params::ALBUM_IDS])); $this->closeContextMenu(); - // $this->openModal('forms.add.upload', $this->params); } } diff --git a/resources/views/components/gallery/album/menu/menu.blade.php b/resources/views/components/gallery/album/menu/menu.blade.php index b7a83e6e26f..003b059af98 100644 --- a/resources/views/components/gallery/album/menu/menu.blade.php +++ b/resources/views/components/gallery/album/menu/menu.blade.php @@ -40,6 +40,6 @@ @if ($userCount > 1) @endif - +
    diff --git a/resources/views/livewire/forms/album/delete-panel.blade.php b/resources/views/livewire/forms/album/delete-panel.blade.php new file mode 100644 index 00000000000..07560cbab17 --- /dev/null +++ b/resources/views/livewire/forms/album/delete-panel.blade.php @@ -0,0 +1,5 @@ +
    +

    {{ sprintf(__('lychee.DELETE_ALBUM_CONFIRMATION'), $title) }}

    + {{-- TODO add confirmation by typing album name? --}} + {{ __('lychee.DELETE_ALBUM_QUESTION') }} +
    \ No newline at end of file diff --git a/resources/views/livewire/forms/album/delete.blade.php b/resources/views/livewire/forms/album/delete.blade.php index 07560cbab17..541db127b60 100644 --- a/resources/views/livewire/forms/album/delete.blade.php +++ b/resources/views/livewire/forms/album/delete.blade.php @@ -1,5 +1,20 @@ -
    -

    {{ sprintf(__('lychee.DELETE_ALBUM_CONFIRMATION'), $title) }}

    - {{-- TODO add confirmation by typing album name? --}} - {{ __('lychee.DELETE_ALBUM_QUESTION') }} -
    \ No newline at end of file +
    +
    +

    + @if ($num === 1) + {{ sprintf(__('lychee.DELETE_ALBUM_CONFIRMATION'), $title) }} + @else + {{ sprintf(__('lychee.DELETE_ALBUMS_CONFIRMATION'), $num) }} + @endif + {{-- TODO add confirmation by typing album name? --}} +

    +
    +
    + + {{ $num === 1 ? __('lychee.KEEP_ALBUM') : __('lychee.KEEP_ALBUMS') }} + + + {{ $num === 1 ? __('lychee.DELETE_ALBUM_QUESTION') : __('lychee.DELETE_ALBUMS_QUESTION') }} + +
    +
    diff --git a/resources/views/livewire/forms/album/merge.blade.php b/resources/views/livewire/forms/album/merge.blade.php new file mode 100644 index 00000000000..fb8fd9b93ab --- /dev/null +++ b/resources/views/livewire/forms/album/merge.blade.php @@ -0,0 +1,35 @@ +
    + @if ($title !== null && $title !== '') +
    +

    + @if ($num === 1) + {{ sprintf(__('lychee.ALBUM_MERGE'), $titleMoved, $title) }} + @else + {{ sprintf(__('lychee.ALBUMS_MERGE'), $title) }} + @endif +

    +
    +
    + + {{ __('lychee.DONT_MERGE') }} + + + {{ __('lychee.MERGE_ALBUM') }} + +
    + @else +
    +
    + + {{ __('lychee.MERGE_ALBUM') }} into + +
    + +
    +
    + + {{ __('lychee.CANCEL') }} + +
    + @endif +
    diff --git a/resources/views/livewire/forms/album/move.blade.php b/resources/views/livewire/forms/album/move.blade.php index 4191c4e7122..ae582544d71 100644 --- a/resources/views/livewire/forms/album/move.blade.php +++ b/resources/views/livewire/forms/album/move.blade.php @@ -1,27 +1,35 @@
    -
    - @if ($title !== null && $title !== '') + @if ($title !== null && $title !== '') +

    - @if (count($albumIDs) === 1) + @if ($num === 1) {{ sprintf(__('lychee.ALBUM_MOVE'), $titleMoved, $title) }} @else {{ sprintf(__('lychee.ALBUMS_MOVE'), $title) }} @endif

    - {{ count($albumIDs) === 1 ? __('lychee.MOVE_ALBUM') : __('lychee.MOVE_ALBUMS') }} - @else -
    -
    - {{ 'Move to' }} -
    - -
    - @endif -
    -
    - {{ __('lychee.CANCEL') }} -
    +
    +
    + + {{ __('lychee.NOT_MOVE_ALBUMS') }} + + + {{ $num === 1 ? __('lychee.MOVE_ALBUM') : __('lychee.MOVE_ALBUMS') }} + +
    + @else +
    +
    + + {{ $num === 1 ? __('lychee.MOVE_ALBUM') : __('lychee.MOVE_ALBUMS') }} to + +
    + +
    +
    + + {{ __('lychee.CANCEL') }} + +
    + @endif
    diff --git a/resources/views/livewire/forms/album/rename.blade.php b/resources/views/livewire/forms/album/rename.blade.php new file mode 100644 index 00000000000..2d8c7155c6d --- /dev/null +++ b/resources/views/livewire/forms/album/rename.blade.php @@ -0,0 +1,20 @@ +
    +
    +

    + {{ $num === 1 ? __('lychee.ALBUM_NEW_TITLE') : sprintf(__('lychee.ALBUMS_NEW_TITLE'), $num) }} +

    +
    +
    + +
    +
    +
    +
    + {{ __('lychee.CANCEL') }} + {{ __('lychee.ALBUM_SET_TITLE') }} +
    +
    diff --git a/resources/views/livewire/forms/photo/copyTo.blade.php b/resources/views/livewire/forms/photo/copyTo.blade.php index 6fe227b2cb0..b352c3316da 100644 --- a/resources/views/livewire/forms/photo/copyTo.blade.php +++ b/resources/views/livewire/forms/photo/copyTo.blade.php @@ -1,10 +1,10 @@

    - @if (count($photoIDs) === 1) + @if ($num === 1) {{ sprintf('Copy %s to:', $title) }} @else - {{ sprintf('Copy %d photos to:', count($photoIDs)) }} + {{ sprintf('Copy %d photos to:', $num) }} @endif

    diff --git a/resources/views/livewire/forms/photo/delete.blade.php b/resources/views/livewire/forms/photo/delete.blade.php index d538718d052..df28d79dfe2 100644 --- a/resources/views/livewire/forms/photo/delete.blade.php +++ b/resources/views/livewire/forms/photo/delete.blade.php @@ -1,10 +1,10 @@

    - @if (count($photoIDs) === 1) + @if ($num === 1) {{ sprintf(__('lychee.PHOTO_DELETE_CONFIRMATION'), $title) }} @else - {{ sprintf(__('lychee.PHOTO_DELETE_ALL'), count($photoIDs)) }} + {{ sprintf(__('lychee.PHOTO_DELETE_ALL'), $num) }} @endif

    @@ -13,6 +13,6 @@ wire:click="close">{{ __('lychee.PHOTO_KEEP') }} {{ count($photoIDs) === 1 ? __('lychee.PHOTO_DELETE') : __('lychee.DELETE_ALL') }} + wire:click="submit">{{ $num === 1 ? __('lychee.PHOTO_DELETE') : __('lychee.DELETE_ALL') }}
    diff --git a/resources/views/livewire/forms/photo/move.blade.php b/resources/views/livewire/forms/photo/move.blade.php index f7071d013ed..38b445b313c 100644 --- a/resources/views/livewire/forms/photo/move.blade.php +++ b/resources/views/livewire/forms/photo/move.blade.php @@ -1,10 +1,10 @@

    - @if (count($photoIDs) === 1) + @if ($num === 1) {{ sprintf('Move %s to:', $title) }} @else - {{ sprintf('Move %d photos to:', count($photoIDs)) }} + {{ sprintf('Move %d photos to:', $num) }} @endif

    diff --git a/resources/views/livewire/forms/photo/rename.blade.php b/resources/views/livewire/forms/photo/rename.blade.php index 8c0dfdccd06..3944bdfd424 100644 --- a/resources/views/livewire/forms/photo/rename.blade.php +++ b/resources/views/livewire/forms/photo/rename.blade.php @@ -1,7 +1,7 @@

    - {{ count($photoIDs) === 1 ? __('lychee.PHOTO_NEW_TITLE') : sprintf(__('lychee.PHOTOS_NEW_TITLE'), count($photoIDs)) }} + {{ $num === 1 ? __('lychee.PHOTO_NEW_TITLE') : sprintf(__('lychee.PHOTOS_NEW_TITLE'), $num) }}

    @@ -15,6 +15,6 @@ wire:click="close">{{ __('lychee.CANCEL') }} {{ count($photoIDs) === 1 ? __('lychee.RENAME') : __('lychee.RENAME_ALL') }} + wire:click="submit">{{ $num === 1 ? __('lychee.RENAME') : __('lychee.RENAME_ALL') }}
    diff --git a/resources/views/livewire/forms/photo/tag.blade.php b/resources/views/livewire/forms/photo/tag.blade.php index 5610ce1f1fe..66129acabcf 100644 --- a/resources/views/livewire/forms/photo/tag.blade.php +++ b/resources/views/livewire/forms/photo/tag.blade.php @@ -1,7 +1,7 @@

    - {{ count($photoIDs) === 1 ? __('lychee.PHOTO_NEW_TAGS') : sprintf(__('lychee.PHOTOS_NEW_TAGS'), count($photoIDs)) }} + {{ $num === 1 ? __('lychee.PHOTO_NEW_TAGS') : sprintf(__('lychee.PHOTOS_NEW_TAGS'), $num) }}

    From e30e50383f3865fd596618d2d2394919c1d74894 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 17 Sep 2023 00:42:42 +0200 Subject: [PATCH 093/226] fixes --- resources/views/livewire/forms/album/merge.blade.php | 2 +- resources/views/livewire/forms/album/move.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/livewire/forms/album/merge.blade.php b/resources/views/livewire/forms/album/merge.blade.php index fb8fd9b93ab..398c99525fc 100644 --- a/resources/views/livewire/forms/album/merge.blade.php +++ b/resources/views/livewire/forms/album/merge.blade.php @@ -18,7 +18,7 @@
    @else -
    +
    {{ __('lychee.MERGE_ALBUM') }} into diff --git a/resources/views/livewire/forms/album/move.blade.php b/resources/views/livewire/forms/album/move.blade.php index ae582544d71..449125f79fb 100644 --- a/resources/views/livewire/forms/album/move.blade.php +++ b/resources/views/livewire/forms/album/move.blade.php @@ -18,7 +18,7 @@
    @else -
    +
    {{ $num === 1 ? __('lychee.MOVE_ALBUM') : __('lychee.MOVE_ALBUMS') }} to From f219cd34ca1bb7fba2fe64807f18917b232ad7f2 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 17 Sep 2023 00:46:02 +0200 Subject: [PATCH 094/226] more integration --- .../livewire/pages/gallery/albums.blade.php | 60 ++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/resources/views/livewire/pages/gallery/albums.blade.php b/resources/views/livewire/pages/gallery/albums.blade.php index 794e331dbcf..7a68882b758 100644 --- a/resources/views/livewire/pages/gallery/albums.blade.php +++ b/resources/views/livewire/pages/gallery/albums.blade.php @@ -1,16 +1,72 @@
    - @guest From 65ccd0f430dd26e66565ea8be6f623b2ed144eab Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 17 Sep 2023 09:11:39 +0200 Subject: [PATCH 095/226] debug cover_id --- app/View/Components/Gallery/Album/Thumbs/Album.php | 6 +++--- app/View/Components/Gallery/Album/Thumbs/Photo.php | 3 +++ .../views/components/gallery/album/thumbs/album.blade.php | 2 +- .../views/components/gallery/album/thumbs/photo.blade.php | 3 +++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/View/Components/Gallery/Album/Thumbs/Album.php b/app/View/Components/Gallery/Album/Thumbs/Album.php index 99b6db07b6c..c4cb7273efd 100644 --- a/app/View/Components/Gallery/Album/Thumbs/Album.php +++ b/app/View/Components/Gallery/Album/Thumbs/Album.php @@ -11,6 +11,7 @@ use App\Models\Extensions\Thumb; use App\Models\TagAlbum; use App\SmartAlbums\BaseSmartAlbum; +use Barryvdh\Debugbar\Facades\Debugbar; use Illuminate\View\Component; class Album extends Component @@ -27,7 +28,7 @@ class Album extends Component public string $subType; public bool $is_tag_album; - public bool $has_cover_id; + public bool $is_cover_id; public bool $has_subalbum; public string $created_at = ''; @@ -61,9 +62,8 @@ public function __construct(AbstractAlbum $data) $this->is_password_required = $policy->is_password_required; $this->is_tag_album = $data instanceof TagAlbum; - // TODO : FIX ME This is incorrect. We should compare with the parent and not the current album. // This aims to indicate whether the current thumb is used to determine the parent. - $this->has_cover_id = $data instanceof AlbumModel && $data->cover_id !== null && $data->cover_id === $data->thumb->id; + $this->is_cover_id = $data instanceof AlbumModel && $data->parent?->cover_id === $data->thumb->id; $this->has_subalbum = $data instanceof AlbumModel && !$data->isLeaf(); } diff --git a/app/View/Components/Gallery/Album/Thumbs/Photo.php b/app/View/Components/Gallery/Album/Thumbs/Photo.php index 45e8b9ecc89..509eaafc045 100644 --- a/app/View/Components/Gallery/Album/Thumbs/Photo.php +++ b/app/View/Components/Gallery/Album/Thumbs/Photo.php @@ -32,6 +32,7 @@ class Photo extends Component public string $created_at; public bool $is_starred = false; public bool $is_public = false; + public bool $is_cover_id = false; public string $src = ''; public string $srcset = ''; @@ -64,6 +65,8 @@ public function __construct(ModelsPhoto $data, string $albumId, Item|null $geome $this->style = $geometry?->toCSS() ?? ''; $this->is_video = $data->isVideo(); + $this->is_cover_id = $data->album?->cover_id === $data->id; + if ($this->layout === AlbumLayoutType::SQUARE) { $this->setSquareLayout($data); diff --git a/resources/views/components/gallery/album/thumbs/album.blade.php b/resources/views/components/gallery/album/thumbs/album.blade.php index 5f408ced4d9..9cc7b18ad40 100644 --- a/resources/views/components/gallery/album/thumbs/album.blade.php +++ b/resources/views/components/gallery/album/thumbs/album.blade.php @@ -83,7 +83,7 @@ @if ($is_tag_album == "1") @endif - @if ($has_cover_id) + @if ($is_cover_id) @endif
    diff --git a/resources/views/components/gallery/album/thumbs/photo.blade.php b/resources/views/components/gallery/album/thumbs/photo.blade.php index 298f244a4cd..774c2e5f5fc 100644 --- a/resources/views/components/gallery/album/thumbs/photo.blade.php +++ b/resources/views/components/gallery/album/thumbs/photo.blade.php @@ -54,6 +54,9 @@ @if($is_public) @endif + @if ($is_cover_id) + + @endif
    @endauth \ No newline at end of file From 6f994bcc35ef8d880176009c0c28a1c9fcc98b67 Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 17 Sep 2023 09:12:00 +0200 Subject: [PATCH 096/226] remove unused imports --- app/View/Components/Gallery/Album/Thumbs/Album.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/View/Components/Gallery/Album/Thumbs/Album.php b/app/View/Components/Gallery/Album/Thumbs/Album.php index c4cb7273efd..e121ae92353 100644 --- a/app/View/Components/Gallery/Album/Thumbs/Album.php +++ b/app/View/Components/Gallery/Album/Thumbs/Album.php @@ -11,7 +11,6 @@ use App\Models\Extensions\Thumb; use App\Models\TagAlbum; use App\SmartAlbums\BaseSmartAlbum; -use Barryvdh\Debugbar\Facades\Debugbar; use Illuminate\View\Component; class Album extends Component From 7ef7c56281955800db649ffb2c1e185db48d832e Mon Sep 17 00:00:00 2001 From: ildyria Date: Sun, 17 Sep 2023 10:51:28 +0200 Subject: [PATCH 097/226] better code --- .prettierrc.json | 3 + package-lock.json | 16 + package.json | 7 +- resources/css/app.css | 299 +- resources/css/filepond.css | 1047 -- resources/js/app.js | 300 +- resources/js/lycheeOrg/albumView.js | 103 + resources/js/lycheeOrg/upload.js | 136 + resources/js/lycheeOrg/webauthn.js | 62 + resources/js/vendor/alpine.min.js | 5 - resources/js/vendor/filepond.js | 12728 ---------------- resources/js/vendor/webauthn/webauthn.js | 652 +- .../gallery/album/thumbs/album.blade.php | 4 +- .../gallery/album/thumbs/photo.blade.php | 4 +- .../components/context-menu.blade.php | 2 +- .../views/livewire/components/modal.blade.php | 36 +- .../livewire/pages/gallery/album.blade.php | 70 +- .../livewire/pages/gallery/photo.blade.php | 4 +- 18 files changed, 847 insertions(+), 14631 deletions(-) create mode 100644 .prettierrc.json delete mode 100644 resources/css/filepond.css create mode 100644 resources/js/lycheeOrg/albumView.js create mode 100644 resources/js/lycheeOrg/upload.js create mode 100644 resources/js/lycheeOrg/webauthn.js delete mode 100644 resources/js/vendor/alpine.min.js delete mode 100644 resources/js/vendor/filepond.js diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 00000000000..8760090e21e --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "printWidth": 150 +} diff --git a/package-lock.json b/package-lock.json index c4369512b0f..611e141fcc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "axios": "^1.1.2", "laravel-vite-plugin": "^0.7.5", "postcss": "^8.4.24", + "prettier": "^2.8.3", "tailwindcss": "^3.3.2", "vite": "^4.0.0" } @@ -1404,6 +1405,21 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", diff --git a/package.json b/package.json index 2e95c0b7c2c..bbb16e65fbb 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,9 @@ "type": "module", "scripts": { "dev": "vite", - "build": "vite build" + "build": "vite build", + "check-formatting": "prettier --check resources/js/ resources/css/", + "format": "prettier --write resources/js/ resources/css/" }, "devDependencies": { "autoprefixer": "^10.4.14", @@ -11,7 +13,8 @@ "laravel-vite-plugin": "^0.7.5", "postcss": "^8.4.24", "tailwindcss": "^3.3.2", - "vite": "^4.0.0" + "vite": "^4.0.0", + "prettier": "^2.8.3" }, "dependencies": { "lazysizes": "^5.3.2", diff --git a/resources/css/app.css b/resources/css/app.css index f00057ab5b4..8d185230d5b 100644 --- a/resources/css/app.css +++ b/resources/css/app.css @@ -5,149 +5,156 @@ @tailwind utilities; @layer base { - - @font-face { - font-family: "Roboto"; - font-style: normal; - font-weight: 300; - src: local(""), url("../fonts/roboto-v29-300.woff2") format("woff2"); - } - - /* roboto-regular - vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic */ - @font-face { - font-family: "Roboto"; - font-style: normal; - font-weight: 400; - src: local(""), url("../fonts/roboto-v29-400.woff2") format("woff2"); - } - - /* roboto-700 - vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic */ - @font-face { - font-family: "Roboto"; - font-style: normal; - font-weight: 700; - src: local(""), url("../fonts/roboto-v29-700.woff2") format("woff2"); - } - - @font-face { - font-family: "socials"; - src: url("../fonts/socials.eot?egvu10"); - src: url("../fonts/socials.eot?egvu10#iefix") format("embedded-opentype"), url("../fonts/socials.ttf?egvu10") format("truetype"), - url("../fonts/socials.woff?egvu10") format("woff"), url("../fonts/socials.svg?egvu10#socials") format("svg"); - font-weight: normal; - font-style: normal; - } - - html { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - } - - [x-cloak] { display: none !important; } - - .roboto { - font-family: "Roboto", sans-serif; - } - - .socials { - font-family: "socials" !important; - } - - #twitter:before { - content: "\ea96"; - } - - #instagram:before { - content: "\ea92"; - } - - #youtube:before { - content: "\ea9d"; - } - - #flickr:before { - content: "\eaa4"; - } - - #facebook:before { - content: "\ea91"; - } - - .box-shadow { - box-shadow: 3px 3px 8px -2px rgba(0,0,0,.7); - } - - .text-shadow { - text-shadow: 1px 1px 2px #000; - } - - .text-shadow-sm { - text-shadow: 0 1px 3px #00000066; - } - - .max-wh-full-56 { - max-width: calc(100% - 56px); - max-height: calc(100% - 56px); - } - - input:checked+.slider:before { - transform: translateX(20px); - background-color: #fff; - } - - input:checked+.slider { - background-color: rgb(14 165 233); - } - - input:checked~.checkbox svg { - opacity: 1; - -ms-transform: scale(1); - -webkit-transform: scale(1); - transform: scale(1); - } - - /* Remove all ugly outlines */ - * { - outline: 2px solid transparent; - outline-offset: 2px; - } - - .markdown a { - text-underline-offset: 0.2rem; - text-decoration: underline dashed; - } - - #photoDescription h1 { - font-size: large; - margin-bottom: 1.25rem; - font-weight: bold; - } - - #photoDescription h2 { - font-size: medium; - margin-bottom: 1rem; - } - - #photoDescription h3 { - font-size: small; - margin-bottom: 0.75rem; - } - - #photoDescription p, #photoDescription li, #photoDescription a { - font-size: smaller; - } - - #photoDescription a { - text-underline-offset: 0.2rem; - text-decoration: underline dashed; - } - - #photoDescription ul { - list-style-type: circle; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - } - - #photoDescription li { - margin-left: 1.5rem; - } -} \ No newline at end of file + @font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 300; + src: local(""), url("../fonts/roboto-v29-300.woff2") format("woff2"); + } + + /* roboto-regular - vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic */ + @font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 400; + src: local(""), url("../fonts/roboto-v29-400.woff2") format("woff2"); + } + + /* roboto-700 - vietnamese_latin-ext_latin_greek-ext_greek_cyrillic-ext_cyrillic */ + @font-face { + font-family: "Roboto"; + font-style: normal; + font-weight: 700; + src: local(""), url("../fonts/roboto-v29-700.woff2") format("woff2"); + } + + @font-face { + font-family: "socials"; + src: url("../fonts/socials.eot?egvu10"); + src: url("../fonts/socials.eot?egvu10#iefix") format("embedded-opentype"), url("../fonts/socials.ttf?egvu10") format("truetype"), + url("../fonts/socials.woff?egvu10") format("woff"), url("../fonts/socials.svg?egvu10#socials") format("svg"); + font-weight: normal; + font-style: normal; + } + + html { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + } + + [x-cloak] { + display: none !important; + } + + .roboto { + font-family: "Roboto", sans-serif; + } + + .socials { + font-family: "socials" !important; + } + + #twitter:before { + content: "\ea96"; + } + + #instagram:before { + content: "\ea92"; + } + + #youtube:before { + content: "\ea9d"; + } + + #flickr:before { + content: "\eaa4"; + } + + #facebook:before { + content: "\ea91"; + } + + .menu-shadow { + box-shadow: 3px 3px 8px -2px rgba(0, 0, 0, 0.7); + } + + .box-shadow { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.7); + } + + .text-shadow { + text-shadow: 1px 1px 2px #000; + } + + .text-shadow-sm { + text-shadow: 0 1px 3px #00000066; + } + + .max-wh-full-56 { + max-width: calc(100% - 56px); + max-height: calc(100% - 56px); + } + + input:checked + .slider:before { + transform: translateX(20px); + background-color: #fff; + } + + input:checked + .slider { + background-color: rgb(14 165 233); + } + + input:checked ~ .checkbox svg { + opacity: 1; + -ms-transform: scale(1); + -webkit-transform: scale(1); + transform: scale(1); + } + + /* Remove all ugly outlines */ + * { + outline: 2px solid transparent; + outline-offset: 2px; + } + + .markdown a { + text-underline-offset: 0.2rem; + text-decoration: underline dashed; + } + + #photoDescription h1 { + font-size: large; + margin-bottom: 1.25rem; + font-weight: bold; + } + + #photoDescription h2 { + font-size: medium; + margin-bottom: 1rem; + } + + #photoDescription h3 { + font-size: small; + margin-bottom: 0.75rem; + } + + #photoDescription p, + #photoDescription li, + #photoDescription a { + font-size: smaller; + } + + #photoDescription a { + text-underline-offset: 0.2rem; + text-decoration: underline dashed; + } + + #photoDescription ul { + list-style-type: circle; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + } + + #photoDescription li { + margin-left: 1.5rem; + } +} diff --git a/resources/css/filepond.css b/resources/css/filepond.css deleted file mode 100644 index a53b54ea94c..00000000000 --- a/resources/css/filepond.css +++ /dev/null @@ -1,1047 +0,0 @@ -/*! - * FilePond 4.30.4 - * Licensed under MIT, https://opensource.org/licenses/MIT/ - * Please visit https://pqina.nl/filepond/ for details. - */ - -/* eslint-disable */ -.filepond--assistant { - position: absolute; - overflow: hidden; - height: 1px; - width: 1px; - padding: 0; - border: 0; - clip: rect(1px, 1px, 1px, 1px); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - white-space: nowrap; -} -/* Hard to override styles */ -.filepond--browser.filepond--browser { - /* is positioned absolute so it is focusable for form validation errors */ - position: absolute; - margin: 0; - padding: 0; - - /* is positioned ~behind drop label */ - left: 1em; - top: 1.75em; - width: calc(100% - 2em); - - /* hide visually */ - opacity: 0; - font-size: 0; /* removes text cursor in Internet Explorer 11 */ -} -.filepond--data { - position: absolute; - width: 0; - height: 0; - padding: 0; - margin: 0; - border: none; - visibility: hidden; - pointer-events: none; - contain: strict; -} -.filepond--drip { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - overflow: hidden; - opacity: 0.1; - - /* can't interact with this element */ - pointer-events: none; - - /* inherit border radius from parent (needed for drip-blob cut of) */ - border-radius: 0.5em; - - /* this seems to prevent Chrome from redrawing this layer constantly */ - background: rgba(0, 0, 0, 0.01); -} -.filepond--drip-blob { - position: absolute; - -webkit-transform-origin: center center; - transform-origin: center center; - top: 0; - left: 0; - width: 8em; - height: 8em; - margin-left: -4em; - margin-top: -4em; - background: #292625; - border-radius: 50%; - - /* will be animated */ - will-change: transform, opacity; -} -.filepond--drop-label { - position: absolute; - left: 0; - right: 0; - top: 0; - margin: 0; - color: #4f4f4f; - - /* center contents */ - display: flex; - justify-content: center; - align-items: center; - - /* fixes IE11 centering problems (is overruled by label min-height) */ - height: 0px; - - /* dont allow selection */ - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - - /* will be animated */ - will-change: transform, opacity; -} -/* Hard to override styles on purpose */ -.filepond--drop-label.filepond--drop-label label { - display: block; - margin: 0; - padding: 0.5em; /* use padding instead of margin so click area is not impacted */ -} -.filepond--drop-label label { - cursor: default; - font-size: 0.875em; - font-weight: normal; - text-align: center; - line-height: 1.5; -} -.filepond--label-action { - text-decoration: underline; - -webkit-text-decoration-skip: ink; - text-decoration-skip-ink: auto; - -webkit-text-decoration-color: #a7a4a4; - text-decoration-color: #a7a4a4; - cursor: pointer; -} -.filepond--root[data-disabled] .filepond--drop-label label { - opacity: 0.5; -} -/* Hard to override styles */ -.filepond--file-action-button.filepond--file-action-button { - font-size: 1em; - width: 1.625em; - height: 1.625em; - - font-family: inherit; - line-height: inherit; - - margin: 0; - padding: 0; - border: none; - outline: none; - - will-change: transform, opacity; - - /* hidden label */ -} -.filepond--file-action-button.filepond--file-action-button span { - position: absolute; - overflow: hidden; - height: 1px; - width: 1px; - padding: 0; - border: 0; - clip: rect(1px, 1px, 1px, 1px); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - white-space: nowrap; -} -.filepond--file-action-button.filepond--file-action-button { - /* scale SVG to fill button */ -} -.filepond--file-action-button.filepond--file-action-button svg { - width: 100%; - height: 100%; -} -.filepond--file-action-button.filepond--file-action-button { - /* bigger touch area */ -} -.filepond--file-action-button.filepond--file-action-button::after { - position: absolute; - left: -0.75em; - right: -0.75em; - top: -0.75em; - bottom: -0.75em; - content: ''; -} -/* Soft styles */ -.filepond--file-action-button { - /* use default arrow cursor */ - cursor: auto; - - /* reset default button styles */ - color: #fff; - - /* set default look n feel */ - border-radius: 50%; - background-color: rgba(0, 0, 0, 0.5); - background-image: none; - - /* we animate box shadow on focus */ - /* it's only slightly slower than animating */ - /* a pseudo-element with transforms and renders */ - /* a lot better on chrome */ - box-shadow: 0 0 0 0 rgba(255, 255, 255, 0); - transition: box-shadow 0.25s ease-in; -} -.filepond--file-action-button:hover, -.filepond--file-action-button:focus { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.9); -} -.filepond--file-action-button[disabled] { - color: rgba(255, 255, 255, 0.5); - background-color: rgba(0, 0, 0, 0.25); -} -.filepond--file-action-button[hidden] { - display: none; -} -/* edit button */ -.filepond--action-edit-item.filepond--action-edit-item { - width: 2em; - height: 2em; - padding: 0.1875em; -} -.filepond--action-edit-item.filepond--action-edit-item[data-align*='center'] { - margin-left: -0.1875em; -} -.filepond--action-edit-item.filepond--action-edit-item[data-align*='bottom'] { - margin-bottom: -0.1875em; -} -.filepond--action-edit-item-alt { - border: none; - line-height: inherit; - background: transparent; - font-family: inherit; - color: inherit; - outline: none; - padding: 0; - margin: 0 0 0 0.25em; - pointer-events: all; - position: absolute; -} -.filepond--action-edit-item-alt svg { - width: 1.3125em; - height: 1.3125em; -} -.filepond--action-edit-item-alt span { - font-size: 0; - opacity: 0; -} -.filepond--file-info { - position: static; - display: flex; - flex-direction: column; - align-items: flex-start; - flex: 1; - margin: 0 0.5em 0 0; - min-width: 0; - - /* will be animated */ - will-change: transform, opacity; - - /* can't do anything with this info */ - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - - /* no margins on children */ -} -.filepond--file-info * { - margin: 0; -} -.filepond--file-info { - /* we don't want to have these overrules so these selectors are a bit more specific */ -} -.filepond--file-info .filepond--file-info-main { - font-size: 0.75em; - line-height: 1.2; - - /* we want ellipsis if this bar gets too wide */ - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - width: 100%; -} -.filepond--file-info .filepond--file-info-sub { - font-size: 0.625em; - opacity: 0.5; - transition: opacity 0.25s ease-in-out; - white-space: nowrap; -} -.filepond--file-info .filepond--file-info-sub:empty { - display: none; -} -.filepond--file-status { - position: static; - display: flex; - flex-direction: column; - align-items: flex-end; - flex-grow: 0; - flex-shrink: 0; - - margin: 0; - min-width: 2.25em; - text-align: right; - - /* will be animated */ - will-change: transform, opacity; - - /* can't do anything with this info */ - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - - /* no margins on children */ -} -.filepond--file-status * { - margin: 0; - white-space: nowrap; -} -.filepond--file-status { - /* font sizes */ -} -.filepond--file-status .filepond--file-status-main { - font-size: 0.75em; - line-height: 1.2; -} -.filepond--file-status .filepond--file-status-sub { - font-size: 0.625em; - opacity: 0.5; - transition: opacity 0.25s ease-in-out; -} -/* Hard to override styles */ -.filepond--file-wrapper.filepond--file-wrapper { - border: none; - margin: 0; - padding: 0; - min-width: 0; - height: 100%; - - /* hide legend for visual users */ -} -.filepond--file-wrapper.filepond--file-wrapper > legend { - position: absolute; - overflow: hidden; - height: 1px; - width: 1px; - padding: 0; - border: 0; - clip: rect(1px, 1px, 1px, 1px); - -webkit-clip-path: inset(50%); - clip-path: inset(50%); - white-space: nowrap; -} -.filepond--file { - position: static; - display: flex; - height: 100%; - align-items: flex-start; - - padding: 0.5625em 0.5625em; - - color: #fff; - border-radius: 0.5em; - - /* control positions */ -} -.filepond--file .filepond--file-status { - margin-left: auto; - margin-right: 2.25em; -} -.filepond--file .filepond--processing-complete-indicator { - pointer-events: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - z-index: 3; -} -.filepond--file .filepond--processing-complete-indicator, -.filepond--file .filepond--progress-indicator, -.filepond--file .filepond--file-action-button { - position: absolute; -} -.filepond--file { - /* .filepond--file-action-button */ -} -.filepond--file [data-align*='left'] { - left: 0.5625em; -} -.filepond--file [data-align*='right'] { - right: 0.5625em; -} -.filepond--file [data-align*='center'] { - left: calc(50% - 0.8125em); /* .8125 is half of button width */ -} -.filepond--file [data-align*='bottom'] { - bottom: 1.125em; -} -.filepond--file [data-align='center'] { - top: calc(50% - 0.8125em); -} -.filepond--file .filepond--progress-indicator { - margin-top: 0.1875em; -} -.filepond--file .filepond--progress-indicator[data-align*='right'] { - margin-right: 0.1875em; -} -.filepond--file .filepond--progress-indicator[data-align*='left'] { - margin-left: 0.1875em; -} -/* make sure text does not overlap */ -[data-filepond-item-state='cancelled'] .filepond--file-info, -[data-filepond-item-state*='invalid'] .filepond--file-info, -[data-filepond-item-state*='error'] .filepond--file-info { - margin-right: 2.25em; -} -[data-filepond-item-state~='processing'] .filepond--file-status-sub { - opacity: 0; -} -[data-filepond-item-state~='processing'] - .filepond--action-abort-item-processing - ~ .filepond--file-status - .filepond--file-status-sub { - opacity: 0.5; -} -[data-filepond-item-state='processing-error'] .filepond--file-status-sub { - opacity: 0; -} -[data-filepond-item-state='processing-error'] - .filepond--action-retry-item-processing - ~ .filepond--file-status - .filepond--file-status-sub { - opacity: 0.5; -} -[data-filepond-item-state='processing-complete'] { - /* busy state */ -} -[data-filepond-item-state='processing-complete'] .filepond--action-revert-item-processing svg { - -webkit-animation: fall 0.5s 0.125s linear both; - animation: fall 0.5s 0.125s linear both; -} -[data-filepond-item-state='processing-complete'] { - /* hide details by default, only show when can revert */ -} -[data-filepond-item-state='processing-complete'] .filepond--file-status-sub { - opacity: 0.5; -} -[data-filepond-item-state='processing-complete'] - .filepond--processing-complete-indicator:not([style*='hidden']) - ~ .filepond--file-status - .filepond--file-status-sub { - opacity: 0; -} -[data-filepond-item-state='processing-complete'] .filepond--file-info-sub { - opacity: 0; -} -[data-filepond-item-state='processing-complete'] - .filepond--action-revert-item-processing - ~ .filepond--file-info - .filepond--file-info-sub { - opacity: 0.5; -} -/* file state can be invalid or error, both are visually similar but */ -/* having them as separate states might be useful */ -[data-filepond-item-state*='invalid'] .filepond--panel, -[data-filepond-item-state*='invalid'] .filepond--file-wrapper, -[data-filepond-item-state*='error'] .filepond--panel, -[data-filepond-item-state*='error'] .filepond--file-wrapper { - -webkit-animation: shake 0.65s linear both; - animation: shake 0.65s linear both; -} -/* spins progress indicator when file is marked as busy */ -[data-filepond-item-state*='busy'] .filepond--progress-indicator svg { - -webkit-animation: spin 1s linear infinite; - animation: spin 1s linear infinite; -} -/** - * States - */ -@-webkit-keyframes spin { - 0% { - -webkit-transform: rotateZ(0deg); - transform: rotateZ(0deg); - } - - 100% { - -webkit-transform: rotateZ(360deg); - transform: rotateZ(360deg); - } -} -@keyframes spin { - 0% { - -webkit-transform: rotateZ(0deg); - transform: rotateZ(0deg); - } - - 100% { - -webkit-transform: rotateZ(360deg); - transform: rotateZ(360deg); - } -} -@-webkit-keyframes shake { - 10%, - 90% { - -webkit-transform: translateX(-0.0625em); - transform: translateX(-0.0625em); - } - - 20%, - 80% { - -webkit-transform: translateX(0.125em); - transform: translateX(0.125em); - } - - 30%, - 50%, - 70% { - -webkit-transform: translateX(-0.25em); - transform: translateX(-0.25em); - } - - 40%, - 60% { - -webkit-transform: translateX(0.25em); - transform: translateX(0.25em); - } -} -@keyframes shake { - 10%, - 90% { - -webkit-transform: translateX(-0.0625em); - transform: translateX(-0.0625em); - } - - 20%, - 80% { - -webkit-transform: translateX(0.125em); - transform: translateX(0.125em); - } - - 30%, - 50%, - 70% { - -webkit-transform: translateX(-0.25em); - transform: translateX(-0.25em); - } - - 40%, - 60% { - -webkit-transform: translateX(0.25em); - transform: translateX(0.25em); - } -} -@-webkit-keyframes fall { - 0% { - opacity: 0; - -webkit-transform: scale(0.5); - transform: scale(0.5); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 70% { - opacity: 1; - -webkit-transform: scale(1.1); - transform: scale(1.1); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } -} -@keyframes fall { - 0% { - opacity: 0; - -webkit-transform: scale(0.5); - transform: scale(0.5); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 70% { - opacity: 1; - -webkit-transform: scale(1.1); - transform: scale(1.1); - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 100% { - -webkit-transform: scale(1); - transform: scale(1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } -} -/* ignore all other interaction elements while dragging a file */ -.filepond--hopper[data-hopper-state='drag-over'] > * { - pointer-events: none; -} -/* capture all hit tests using a hidden layer, this speeds up the event flow */ -.filepond--hopper[data-hopper-state='drag-over']::after { - content: ''; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - z-index: 100; -} -.filepond--progress-indicator { - z-index: 103; -} -.filepond--file-action-button { - z-index: 102; -} -.filepond--file-status { - z-index: 101; -} -.filepond--file-info { - z-index: 100; -} -.filepond--item { - position: absolute; - top: 0; - left: 0; - right: 0; - z-index: 1; - - padding: 0; - margin: 0.25em; - - will-change: transform, opacity; - - /* item children order */ -} -.filepond--item > .filepond--panel { - z-index: -1; -} -/* has a slight shadow */ -.filepond--item > .filepond--panel .filepond--panel-bottom { - box-shadow: 0 0.0625em 0.125em -0.0625em rgba(0, 0, 0, 0.25); -} -.filepond--item { - /* drag related */ -} -.filepond--item > .filepond--file-wrapper, -.filepond--item > .filepond--panel { - transition: opacity 0.15s ease-out; -} -.filepond--item[data-drag-state] { - cursor: -webkit-grab; - cursor: grab; -} -.filepond--item[data-drag-state] > .filepond--panel { - transition: box-shadow 0.125s ease-in-out; - box-shadow: 0 0 0 rgba(0, 0, 0, 0); -} -.filepond--item[data-drag-state='drag'] { - cursor: -webkit-grabbing; - cursor: grabbing; -} -.filepond--item[data-drag-state='drag'] > .filepond--panel { - box-shadow: 0 0.125em 0.3125em rgba(0, 0, 0, 0.325); -} -.filepond--item[data-drag-state]:not([data-drag-state='idle']) { - z-index: 2; -} -/* states */ -.filepond--item-panel { - background-color: #64605e; -} -[data-filepond-item-state='processing-complete'] .filepond--item-panel { - background-color: #369763; -} -[data-filepond-item-state*='invalid'] .filepond--item-panel, -[data-filepond-item-state*='error'] .filepond--item-panel { - background-color: #c44e47; -} -/* style of item panel */ -.filepond--item-panel { - border-radius: 0.5em; - transition: background-color 0.25s; -} -/* normal mode */ -.filepond--list-scroller { - position: absolute; - top: 0; - left: 0; - right: 0; - margin: 0; - will-change: transform; -} -/* scroll mode */ -.filepond--list-scroller[data-state='overflow'] .filepond--list { - bottom: 0; - right: 0; -} -.filepond--list-scroller[data-state='overflow'] { - overflow-y: scroll; - overflow-x: hidden; - -webkit-overflow-scrolling: touch; - -webkit-mask: linear-gradient(to bottom, #000 calc(100% - 0.5em), transparent 100%); - mask: linear-gradient(to bottom, #000 calc(100% - 0.5em), transparent 100%); -} -/* style scrollbar */ -.filepond--list-scroller::-webkit-scrollbar { - background: transparent; -} -.filepond--list-scroller::-webkit-scrollbar:vertical { - width: 1em; -} -.filepond--list-scroller::-webkit-scrollbar:horizontal { - height: 0; -} -.filepond--list-scroller::-webkit-scrollbar-thumb { - background-color: rgba(0, 0, 0, 0.3); - border-radius: 99999px; - border: 0.3125em solid transparent; - background-clip: content-box; -} -/* hard to overide styles on purpose */ -.filepond--list.filepond--list { - position: absolute; - top: 0; - margin: 0; - padding: 0; - list-style-type: none; - - /* prevents endless paint calls on filepond--list-scroller */ - will-change: transform; -} -/* used for padding so allowed to be restyled */ -.filepond--list { - left: 0.75em; - right: 0.75em; -} -.filepond--root[data-style-panel-layout~='integrated'] { - width: 100%; - height: 100%; - max-width: none; - margin: 0; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--panel-root, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--panel-root { - border-radius: 0; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--panel-root > *, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--panel-root > * { - display: none; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--drop-label, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--drop-label { - bottom: 0; - height: auto; - display: flex; - justify-content: center; - align-items: center; - z-index: 7; -} -.filepond--root[data-style-panel-layout~='circle'], -.filepond--root[data-style-panel-layout~='integrated'] { - /* we're only loading one item, this makes the intro animation a bit nicer */ -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--item-panel, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--item-panel { - display: none; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--list-scroller, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--list-scroller { - overflow: hidden; - height: 100%; - margin-top: 0; - margin-bottom: 0; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--list, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--list { - left: 0; - right: 0; - height: 100%; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--item, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--item { - margin: 0; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--file-wrapper, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--file-wrapper { - height: 100%; -} -.filepond--root[data-style-panel-layout~='compact'] .filepond--drop-label, -.filepond--root[data-style-panel-layout~='integrated'] .filepond--drop-label { - z-index: 7; -} -.filepond--root[data-style-panel-layout~='circle'] { - border-radius: 99999rem; - overflow: hidden; -} -.filepond--root[data-style-panel-layout~='circle'] > .filepond--panel { - border-radius: inherit; -} -.filepond--root[data-style-panel-layout~='circle'] > .filepond--panel > * { - display: none; -} -.filepond--root[data-style-panel-layout~='circle'] { - /* circle cuts of this info, so best to hide it */ -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--file-info { - display: none; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--file-status { - display: none; -} -.filepond--root[data-style-panel-layout~='circle'] .filepond--action-edit-item { - opacity: 1 !important; - visibility: visible !important; -} -/* dirfty way to fix circular overflow issue on safari 11+ */ -@media not all and (min-resolution: 0.001dpcm) { - @supports (-webkit-appearance: none) and (stroke-color: transparent) { - .filepond--root[data-style-panel-layout~='circle'] { - will-change: transform; - } - } -} -.filepond--panel-root { - border-radius: 0.5em; - background-color: #f1f0ef; -} -.filepond--panel { - position: absolute; - left: 0; - top: 0; - right: 0; - margin: 0; - - /* defaults to 100% height (fixed height mode) this fixes problem with panel height in IE11 */ - height: 100% !important; - - /* no interaction possible with panel */ - pointer-events: none; -} -.filepond-panel:not([data-scalable='false']) { - height: auto !important; -} -.filepond--panel[data-scalable='false'] > div { - display: none; -} -.filepond--panel[data-scalable='true'] { - /* this seems to fix Chrome performance issues */ - /* - when box-shadow is enabled */ - /* - when multiple ponds are active on the same page */ - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - - /* prevent borders and backgrounds */ - background-color: transparent !important; - border: none !important; -} -.filepond--panel-top, -.filepond--panel-bottom, -.filepond--panel-center { - position: absolute; - left: 0; - top: 0; - right: 0; - margin: 0; - padding: 0; -} -.filepond--panel-top, -.filepond--panel-bottom { - height: 0.5em; -} -.filepond--panel-top { - border-bottom-left-radius: 0 !important; - border-bottom-right-radius: 0 !important; - border-bottom: none !important; - - /* fixes tiny transparant line between top and center panel */ -} -.filepond--panel-top::after { - content: ''; - position: absolute; - height: 2px; - left: 0; - right: 0; - bottom: -1px; - background-color: inherit; -} -.filepond--panel-center, -.filepond--panel-bottom { - will-change: transform; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transform-origin: left top; - transform-origin: left top; - -webkit-transform: translate3d(0, 0.5em, 0); - transform: translate3d(0, 0.5em, 0); -} -.filepond--panel-bottom { - border-top-left-radius: 0 !important; - border-top-right-radius: 0 !important; - border-top: none !important; - - /* fixes tiny transparant line between bottom and center of panel */ -} -.filepond--panel-bottom::before { - content: ''; - position: absolute; - height: 2px; - left: 0; - right: 0; - top: -1px; - background-color: inherit; -} -.filepond--panel-center { - /* the center panel is scaled using scale3d to fit the correct height */ - /* we use 100px instead of 1px as scaling 1px to a huge height is really laggy on chrome */ - height: 100px !important; - border-top: none !important; - border-bottom: none !important; - border-radius: 0 !important; - - /* hide if not transformed, prevents a little flash when the panel is at 100px height while attached for first time */ -} -.filepond--panel-center:not([style]) { - visibility: hidden; -} -.filepond--progress-indicator { - position: static; - width: 1.25em; - height: 1.25em; - - color: #fff; - - /* can't have margins */ - margin: 0; - - /* no interaction possible with progress indicator */ - pointer-events: none; - - /* will be animated */ - will-change: transform, opacity; -} -.filepond--progress-indicator svg { - width: 100%; - height: 100%; - vertical-align: top; - transform-box: fill-box; /* should center the animation correctly when zoomed in */ -} -.filepond--progress-indicator path { - fill: none; - stroke: currentColor; -} -.filepond--list-scroller { - z-index: 6; -} -.filepond--drop-label { - z-index: 5; -} -.filepond--drip { - z-index: 3; -} -.filepond--root > .filepond--panel { - z-index: 2; -} -.filepond--browser { - z-index: 1; -} -.filepond--root { - /* layout*/ - box-sizing: border-box; - position: relative; - margin-bottom: 1em; - - /* base font size for whole component */ - font-size: 1rem; - - /* base line height */ - line-height: normal; - - /* up uses default system font family */ - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, - 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - - /* will increase font weight a bit on Safari */ - font-weight: 450; - - /* default text alignment */ - text-align: left; - - /* better text rendering on Safari */ - text-rendering: optimizeLegibility; - - /* text direction is ltr for now */ - direction: ltr; - - /* optimize rendering */ - /* https://developer.mozilla.org/en-US/docs/Web/CSS/contain */ - contain: layout style size; - - /* correct box sizing, line-height and positioning on child elements */ -} -.filepond--root * { - box-sizing: inherit; - line-height: inherit; -} -.filepond--root *:not(text) { - font-size: inherit; -} -.filepond--root { - /* block everything */ -} -.filepond--root[data-disabled] { - pointer-events: none; -} -.filepond--root[data-disabled] .filepond--list-scroller { - pointer-events: all; -} -.filepond--root[data-disabled] .filepond--list { - pointer-events: none; -} -/** - * Root element children layout - */ -.filepond--root .filepond--drop-label { - min-height: 4.75em; -} -.filepond--root .filepond--list-scroller { - margin-top: 1em; - margin-bottom: 1em; -} -.filepond--root .filepond--credits { - position: absolute; - right: 0; - opacity: 0.175; - line-height: 0.85; - font-size: 11px; - color: inherit; - text-decoration: none; - z-index: 3; - bottom: -14px; -} -.filepond--root .filepond--credits[style] { - top: 0; - bottom: auto; - margin-top: 14px; -} diff --git a/resources/js/app.js b/resources/js/app.js index aae28427849..1f8f04d8b4b 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -1,7 +1,10 @@ -import 'lazysizes'; -import Mousetrap from 'mousetrap'; -import WebAuthn from './vendor/webauthn/webauthn.js' -import 'mousetrap-global-bind'; +import "lazysizes"; +import Mousetrap from "mousetrap"; +import "mousetrap-global-bind"; +// import WebAuthn from './vendor/webauthn/webauthn.js' +import { loginWebAuthn, registerWebAuthn } from "./lycheeOrg/webauthn.js"; +import { upload } from "./lycheeOrg/upload.js"; +import { albumView } from "./lycheeOrg/albumView.js"; // Keyboard Mousetrap.addKeycodes({ @@ -11,212 +14,13 @@ Mousetrap.addKeycodes({ 228: "forward", }); -document.addEventListener('alpine:init', () => { - - Alpine.data('loginWebAuthn', - (success_msg_val = "U2F_AUTHENTIFICATION_SUCCESS", error_msg_val = "ERROR_TEXT") => ({ - webAuthnOpen: false, - success_msg: success_msg_val, - error_msg: error_msg_val, - username: null, - userId: 1, - - isWebAuthnUnavailable() { - return !window.isSecureContext && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1'; - }, - - login() { - // work around because this does not refer to alpine anymore when inside WebAuthn then context. - let alpine = this; - let params = {}; - if (this.username !== '' && this.username !== null) { - params.username = this.username; - } - else if (this.userId !== null) { - params.user_id = this.userId; - } - new WebAuthn({ login: "/api/WebAuthn::login", loginOptions: "/api/WebAuthn::login/options" }, {}, false) - // .login({ user_id: 1 }) - .login(params) - .then(function () { - alpine.$dispatch("notify", [{ type: "success", msg: alpine.success_msg }]); - window.location.reload(); - }) - .catch(() => this.$dispatch("notify", [{ type: "error", msg: this.error_msg }])); - } - }) - ) - - Alpine.data('registerWebAuthn', - (success_msg_val = "U2F_REGISTRATION_SUCCESS", error_msg_val = "ERROR_TEXT") => ({ - success_msg: success_msg_val, - error_msg: error_msg_val, - - - isWebAuthnUnavailable() { - return !window.isSecureContext && window.location.hostname !== 'localhost' && window.location.hostname !== '127.0.0.1'; - }, - - register() { - // work around because this does not refer to alpine anymore when inside WebAuthn then context. - let alpine = this - new WebAuthn({ register: "/api/WebAuthn::register", registerOptions: "/api/WebAuthn::register/options" }, {}, false) - .register() - .then(function () { - // First reload then display - alpine.$dispatch("reload-component"); - alpine.$dispatch("notify", [{ type: "success", msg: alpine.success_msg }]); - }) - .catch((error) => { - console.log(error); - alpine.$dispatch("notify", [{ type: "error", msg: this.error_msg }]); - }); - } - }) - ) - - Alpine.data('upload', - (chunkSize_val, parallelism_val = 3) => ({ - isDropping: false, - - chunkSize: chunkSize_val, - hasErrorOccurred: false, - upload_processing_limit: parallelism_val, - chnkStarts: [], - fileList: [], - - /** - * The number of requests which are "on the fly", i.e. for which a - * response has not yet completely been received. - * - * Note, that Lychee supports a restricted kind of "parallelism" - * which is limited by the configuration option - * `lychee.upload_processing_limit`: - * While always only a single file is uploaded at once, upload of the - * next file already starts after transmission of the previous file - * has been finished, the response to the previous file might still be - * outstanding as the uploaded file is processed at the server-side. - * - * @type {number} - */ - outstandingResponsesCount: 0, - /** - * The latest (aka highest) index of a file which is being or has - * been uploaded to the server. - * - * @type {number} - */ - latestFileIdx: 0, - /** - * Semaphore whether a file is currently being uploaded. - * - * This is used as a semaphore to serialize the upload transmissions - * between several instances of the method {@link process}. - * - * @type {boolean} - */ - isUploadRunning: false, - - /** - * This callback is invoked when the last file has been processed. - * - * It closes the modal dialog or shows the close button and - * reloads the album. - */ - finish(wire, alpine = this) { - if (!alpine.hasErrorOccurred) { - console.log("Success!"); - wire.dispatch("reloadPage"); - wire.close(); - } else { - console.log("Well something went wrong..."); - wire.dispatch("reloadPage"); - // Error - } - - }, - - process(fileIdx, wire, alpine = this) { - alpine.outstandingResponsesCount++; - this.livewireUploadChunk(fileIdx, wire, alpine); - }, - - complete(wire, alpine = this) { - alpine.outstandingResponsesCount--; - - // Start the next one if possible. - if (alpine.outstandingResponsesCount < alpine.upload_processing_limit && - alpine.latestFileIdx + 1 < alpine.fileList.length) { - console.log("next file!"); - alpine.latestFileIdx++; - alpine.process(alpine.latestFileIdx, wire, alpine) - } - else if (alpine.outstandingResponsesCount === 0 && - alpine.latestFileIdx + 1 === alpine.fileList.length) { - console.log("Finish"); - alpine.finish(wire, alpine); - } - else { - console.log("Curent threads: " + alpine.outstandingResponsesCount); - console.log("Current index: " + alpine.latestFileIdx); - console.log("Number of files: " + alpine.fileList.length); - console.log("waiting..."); - } - }, - - /** - * Processes the upload and response for a single file. - * - * Note that up to `livewireUploadChunk` "instances" of - * this method can be "alive" simultaneously. - * The parameter `fileIdx` is limited by `latestFileIdx`. - * - * @param {number} fileIdx the index of the file being processed - * @param {Livewire} wire accessore to Livewire funtions - * @param {Alpine} alpine accessor to current Alpine object - */ - livewireUploadChunk(fileIdx, wire, alpine = this) { - // End of chunk is start + chunkSize OR file size, whichever is greater - const chunkEnd = Math.min(alpine.chnkStarts[fileIdx] + alpine.chunkSize, alpine.fileList[fileIdx].size); - const chunk = alpine.fileList[fileIdx].slice(alpine.chnkStarts[fileIdx], chunkEnd); - - wire.upload('uploads.' + fileIdx + '.fileChunk', chunk, - (success) => { - alpine.complete(wire, alpine); - }, - () => { - alpine.hasErrorOccurred = true; - alpine.complete(wire, alpine); - wire.set('uploads.' + fileIdx + '.stage', 'error'); - }, - (event) => { - console.log(event) - if (event.detail.progress == 100) { - alpine.chnkStarts[fileIdx] = - Math.min(alpine.chnkStarts[fileIdx] + alpine.chunkSize, alpine.fileList[fileIdx].size); - - if (alpine.chnkStarts[fileIdx] < alpine.fileList[fileIdx].size) { - let _time = Math.floor((Math.random() * 2000) + 1); - console.log('sleeping ', _time, 'before next chunk upload'); - setTimeout(alpine.livewireUploadChunk, _time, fileIdx, wire, alpine); - } - } - } - ); - }, - - start(wire, alpine = this) { - for (let index = 0; index < Math.min(alpine.upload_processing_limit, alpine.fileList.length); index++) { - alpine.process(index, wire, alpine); - alpine.latestFileIdx = index; - } - }, - }) - ) +document.addEventListener("alpine:init", () => { + Alpine.data("loginWebAuthn", loginWebAuthn); + Alpine.data("registerWebAuthn", registerWebAuthn); + Alpine.data("upload", upload); + Alpine.data("albumView", albumView); }); - - // Alpine.bind('openLeftMenu', () => ({ '@click'() { leftMenuOpen = ! leftMenuOpen }})) // }) // Mousetrap @@ -407,83 +211,3 @@ document.addEventListener('alpine:init', () => { // // } // return false; // }); - -// const u2f = { -// /** @type {?WebAuthnCredential[]} */ -// json: null, -// }; - -// /** -// * @returns {void} -// */ -// u2f.login = function () { - -// new WebAuthn( -// { -// login: "/api/WebAuthn::login", -// loginOptions: "/api/WebAuthn::login/options", -// }, -// {}, -// false -// ) -// .login({ -// user_id: 1, // for now it is only available to Admin user via a secret key shortcut. -// }) -// .then(function () { -// loadingBar.show("success", lychee.locale["U2F_AUTHENTIFICATION_SUCCESS"]); -// window.location.reload(); -// }) -// .catch(() => loadingBar.show("error", lychee.locale["ERROR_TEXT"])); -// }; - -// /** -// * @returns {void} -// */ -// u2f.register = function () { -// if (!u2f.is_available()) { -// return; -// } - -// const webauthn = new WebAuthn( -// { -// register: "/api/WebAuthn::register", -// registerOptions: "/api/WebAuthn::register/options", -// }, -// {}, -// false -// ); -// if (WebAuthn.supportsWebAuthn()) { -// webauthn -// .register() -// .then(function () { -// loadingBar.show("success", lychee.locale["U2F_REGISTRATION_SUCCESS"]); -// u2f.list(); // reload credential list -// }) -// .catch(() => loadingBar.show("error", lychee.locale["ERROR_TEXT"])); -// } else { -// loadingBar.show("error", lychee.locale["U2F_NOT_SUPPORTED"]); -// } -// }; - -// /** -// * @param {{id: string}} params - ID of WebAuthn credential -// */ -// u2f.delete = function (params) { -// api.post("WebAuthn::delete", params, function () { -// loadingBar.show("success", lychee.locale["U2F_CREDENTIALS_DELETED"]); -// u2f.list(); // reload credential list -// }); -// }; - -// u2f.list = function () { -// api.post( -// "WebAuthn::list", -// {}, -// /** @param {WebAuthnCredential[]} data*/ -// function (data) { -// u2f.json = data; -// view.u2f.init(); -// } -// ); -// }; - diff --git a/resources/js/lycheeOrg/albumView.js b/resources/js/lycheeOrg/albumView.js new file mode 100644 index 00000000000..719e150fdf7 --- /dev/null +++ b/resources/js/lycheeOrg/albumView.js @@ -0,0 +1,103 @@ +// import Livewire from + +export default { albumView }; + +export function albumView(nsfwAlbumsVisible_val, isFullscreen_val) { + return { + selectedPhotos: [], + selectedAlbums: [], + detailsOpen: false, + sharingLinksOpen: false, + nsfwAlbumsVisible: nsfwAlbumsVisible_val, + isFullscreen: isFullscreen_val, + + silentToggle(elem, wire) { + this[elem] = !this[elem]; + + wire.silentUpdate(); + }, + + handleContextPhoto(event, wire) { + this.selectedAlbums = []; + const photoId = event.currentTarget.dataset.id; + const index = this.selectedPhotos.indexOf(photoId); + if (index > -1 && this.selectedPhotos.length > 1) { + // found and more than one element + wire.openPhotosDropdown(event.clientX, event.clientY, this.selectedPhotos); + } else { + wire.openPhotoDropdown(event.clientX, event.clientY, event.currentTarget.dataset.id); + } + }, + + handleClickPhoto(event, wire) { + if (event.ctrlKey) { + event.preventDefault(); + this.selectedAlbums = []; + const photoId = event.currentTarget.dataset.id; + const index = this.selectedPhotos.indexOf(photoId); + if (index > -1) { + // found + this.selectedPhotos = this.selectedPhotos.filter((e) => e !== photoId); + } else { + // not found + this.selectedPhotos.push(photoId); + } + } + }, + + handleContextAlbum(event, wire) { + this.selectedPhotos = []; + const albumId = event.currentTarget.dataset.id; + const index = this.selectedAlbums.indexOf(albumId); + if (index > -1 && this.selectedAlbums.length > 1) { + // found and more than one element + wire.openAlbumsDropdown(event.clientX, event.clientY, this.selectedAlbums); + } else { + wire.openAlbumDropdown(event.clientX, event.clientY, event.currentTarget.dataset.id); + } + }, + + handleClickAlbum(event, wire) { + if (event.ctrlKey) { + event.preventDefault(); + this.selectedPhotos = []; + const albumId = event.currentTarget.dataset.id; + const index = this.selectedAlbums.indexOf(albumId); + if (index > -1) { + // found + this.selectedAlbums = this.selectedAlbums.filter((e) => e !== albumId); + } else { + // not found + this.selectedAlbums.push(albumId); + } + } + }, + + handleKeydown(event, wire, focus) { + const skipped = ["TEXTAREA", "INPUT"]; + + if (focus.focused() !== undefined && skipped.includes(focus.focused().nodeName)) { + console.log("skipped: " + focus.focused().nodeName); + return; + } + if (focus.focused() !== undefined) { + console.log(focus.focused().nodeName); + } + + if (event.keyCode === 72 && !this.detailsOpen) { + event.preventDefault(); + console.log("toggle hidden albums:", this.nsfwAlbumsVisible); + this.silentToggle("nsfwAlbumsVisible", wire); + } + + if (event.keyCode === 73 && focus.focused() === undefined) { + event.preventDefault(); + this.detailsOpen = !this.detailsOpen; + } + if (event.keyCode === 70 && focus.focused() === undefined) { + event.preventDefault(); + this.silentToggle("isFullscreen", wire); + } + }, + }; +} diff --git a/resources/js/lycheeOrg/upload.js b/resources/js/lycheeOrg/upload.js new file mode 100644 index 00000000000..75fc1ce8bff --- /dev/null +++ b/resources/js/lycheeOrg/upload.js @@ -0,0 +1,136 @@ +export default { upload }; + +export function upload(chunkSize_val, parallelism_val = 3) { + return { + isDropping: false, + + chunkSize: chunkSize_val, + hasErrorOccurred: false, + upload_processing_limit: parallelism_val, + chnkStarts: [], + fileList: [], + + /** + * The number of requests which are "on the fly", i.e. for which a + * response has not yet completely been received. + * + * Note, that Lychee supports a restricted kind of "parallelism" + * which is limited by the configuration option + * `lychee.upload_processing_limit`: + * While always only a single file is uploaded at once, upload of the + * next file already starts after transmission of the previous file + * has been finished, the response to the previous file might still be + * outstanding as the uploaded file is processed at the server-side. + * + * @type {number} + */ + outstandingResponsesCount: 0, + /** + * The latest (aka highest) index of a file which is being or has + * been uploaded to the server. + * + * @type {number} + */ + latestFileIdx: 0, + /** + * Semaphore whether a file is currently being uploaded. + * + * This is used as a semaphore to serialize the upload transmissions + * between several instances of the method {@link process}. + * + * @type {boolean} + */ + isUploadRunning: false, + + /** + * This callback is invoked when the last file has been processed. + * + * It closes the modal dialog or shows the close button and + * reloads the album. + */ + finish(wire, alpine = this) { + if (!alpine.hasErrorOccurred) { + console.log("Success!"); + wire.dispatch("reloadPage"); + wire.close(); + } else { + console.log("Well something went wrong..."); + wire.dispatch("reloadPage"); + // Error + } + }, + + process(fileIdx, wire, alpine = this) { + alpine.outstandingResponsesCount++; + this.livewireUploadChunk(fileIdx, wire, alpine); + }, + + complete(wire, alpine = this) { + alpine.outstandingResponsesCount--; + + // Start the next one if possible. + if (alpine.outstandingResponsesCount < alpine.upload_processing_limit && alpine.latestFileIdx + 1 < alpine.fileList.length) { + console.log("next file!"); + alpine.latestFileIdx++; + alpine.process(alpine.latestFileIdx, wire, alpine); + } else if (alpine.outstandingResponsesCount === 0 && alpine.latestFileIdx + 1 === alpine.fileList.length) { + console.log("Finish"); + alpine.finish(wire, alpine); + } else { + console.log("Curent threads: " + alpine.outstandingResponsesCount); + console.log("Current index: " + alpine.latestFileIdx); + console.log("Number of files: " + alpine.fileList.length); + console.log("waiting..."); + } + }, + + /** + * Processes the upload and response for a single file. + * + * Note that up to `livewireUploadChunk` "instances" of + * this method can be "alive" simultaneously. + * The parameter `fileIdx` is limited by `latestFileIdx`. + * + * @param {number} fileIdx the index of the file being processed + * @param {Livewire} wire accessore to Livewire funtions + * @param {Alpine} alpine accessor to current Alpine object + */ + livewireUploadChunk(fileIdx, wire, alpine = this) { + // End of chunk is start + chunkSize OR file size, whichever is greater + const chunkEnd = Math.min(alpine.chnkStarts[fileIdx] + alpine.chunkSize, alpine.fileList[fileIdx].size); + const chunk = alpine.fileList[fileIdx].slice(alpine.chnkStarts[fileIdx], chunkEnd); + + wire.upload( + "uploads." + fileIdx + ".fileChunk", + chunk, + (success) => { + alpine.complete(wire, alpine); + }, + () => { + alpine.hasErrorOccurred = true; + alpine.complete(wire, alpine); + wire.set("uploads." + fileIdx + ".stage", "error"); + }, + (event) => { + console.log(event); + if (event.detail.progress == 100) { + alpine.chnkStarts[fileIdx] = Math.min(alpine.chnkStarts[fileIdx] + alpine.chunkSize, alpine.fileList[fileIdx].size); + + if (alpine.chnkStarts[fileIdx] < alpine.fileList[fileIdx].size) { + let _time = Math.floor(Math.random() * 2000 + 1); + console.log("sleeping ", _time, "before next chunk upload"); + setTimeout(alpine.livewireUploadChunk, _time, fileIdx, wire, alpine); + } + } + } + ); + }, + + start(wire, alpine = this) { + for (let index = 0; index < Math.min(alpine.upload_processing_limit, alpine.fileList.length); index++) { + alpine.process(index, wire, alpine); + alpine.latestFileIdx = index; + } + }, + }; +} diff --git a/resources/js/lycheeOrg/webauthn.js b/resources/js/lycheeOrg/webauthn.js new file mode 100644 index 00000000000..3a08e32be19 --- /dev/null +++ b/resources/js/lycheeOrg/webauthn.js @@ -0,0 +1,62 @@ +import WebAuthn from "../vendor/webauthn/webauthn.js"; + +export default { loginWebAuthn, registerWebAuthn }; + +export function loginWebAuthn(success_msg_val = "U2F_AUTHENTIFICATION_SUCCESS", error_msg_val = "ERROR_TEXT") { + return { + webAuthnOpen: false, + success_msg: success_msg_val, + error_msg: error_msg_val, + username: null, + userId: 1, + + isWebAuthnUnavailable() { + return !window.isSecureContext && window.location.hostname !== "localhost" && window.location.hostname !== "127.0.0.1"; + }, + + login() { + // work around because this does not refer to alpine anymore when inside WebAuthn then context. + let alpine = this; + let params = {}; + if (this.username !== "" && this.username !== null) { + params.username = this.username; + } else if (this.userId !== null) { + params.user_id = this.userId; + } + new WebAuthn({ login: "/api/WebAuthn::login", loginOptions: "/api/WebAuthn::login/options" }, {}, false) + .login(params) + .then(function () { + alpine.$dispatch("notify", [{ type: "success", msg: alpine.success_msg }]); + window.location.reload(); + }) + .catch(() => this.$dispatch("notify", [{ type: "error", msg: this.error_msg }])); + }, + }; +} + +export function registerWebAuthn(success_msg_val = "U2F_REGISTRATION_SUCCESS", error_msg_val = "ERROR_TEXT") { + return { + success_msg: success_msg_val, + error_msg: error_msg_val, + + isWebAuthnUnavailable() { + return !window.isSecureContext && window.location.hostname !== "localhost" && window.location.hostname !== "127.0.0.1"; + }, + + register() { + // work around because this does not refer to alpine anymore when inside WebAuthn then context. + let alpine = this; + new WebAuthn({ register: "/api/WebAuthn::register", registerOptions: "/api/WebAuthn::register/options" }, {}, false) + .register() + .then(function () { + // First reload then display + alpine.$dispatch("reload-component"); + alpine.$dispatch("notify", [{ type: "success", msg: alpine.success_msg }]); + }) + .catch((error) => { + console.log(error); + alpine.$dispatch("notify", [{ type: "error", msg: this.error_msg }]); + }); + }, + }; +} diff --git a/resources/js/vendor/alpine.min.js b/resources/js/vendor/alpine.min.js deleted file mode 100644 index a5c58b64b22..00000000000 --- a/resources/js/vendor/alpine.min.js +++ /dev/null @@ -1,5 +0,0 @@ -(()=>{var Xe=!1,Ze=!1,V=[],Qe=-1;function Kt(e){En(e)}function En(e){V.includes(e)||V.push(e),Sn()}function ye(e){let t=V.indexOf(e);t!==-1&&t>Qe&&V.splice(t,1)}function Sn(){!Ze&&!Xe&&(Xe=!0,queueMicrotask(An))}function An(){Xe=!1,Ze=!0;for(let e=0;ee.effect(t,{scheduler:r=>{tt?Kt(r):r()}}),et=e.raw}function rt(e){D=e}function Ht(e){let t=()=>{};return[n=>{let i=D(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),$(i))},i},()=>{t()}]}var qt=[],Ut=[],Wt=[];function Gt(e){Wt.push(e)}function be(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Ut.push(t))}function Jt(e){qt.push(e)}function Yt(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function nt(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}var ot=new MutationObserver(it),st=!1;function se(){ot.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),st=!0}function at(){On(),ot.disconnect(),st=!1}var ae=[],ct=!1;function On(){ae=ae.concat(ot.takeRecords()),ae.length&&!ct&&(ct=!0,queueMicrotask(()=>{Tn(),ct=!1}))}function Tn(){it(ae),ae.length=0}function h(e){if(!st)return e();at();let t=e();return se(),t}var lt=!1,ve=[];function Xt(){lt=!0}function Zt(){lt=!1,it(ve),ve=[]}function it(e){if(lt){ve=ve.concat(e);return}let t=[],r=[],n=new Map,i=new Map;for(let o=0;os.nodeType===1&&t.push(s)),e[o].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{nt(s,o)}),n.forEach((o,s)=>{qt.forEach(a=>a(s,o))});for(let o of r)if(!t.includes(o)&&(Ut.forEach(s=>s(o)),o._x_cleanups))for(;o._x_cleanups.length;)o._x_cleanups.pop()();t.forEach(o=>{o._x_ignoreSelf=!0,o._x_ignore=!0});for(let o of t)r.includes(o)||!o.isConnected||(delete o._x_ignoreSelf,delete o._x_ignore,Wt.forEach(s=>s(o)),o._x_ignore=!0,o._x_ignoreSelf=!0);t.forEach(o=>{delete o._x_ignoreSelf,delete o._x_ignore}),t=null,r=null,n=null,i=null}function we(e){return F(L(e))}function N(e,t,r){return e._x_dataStack=[t,...L(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function L(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?L(e.host):e.parentNode?L(e.parentNode):[]}function F(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,n)=>e.some(i=>i.hasOwnProperty(n)),get:(r,n)=>(e.find(i=>{if(i.hasOwnProperty(n)){let o=Object.getOwnPropertyDescriptor(i,n);if(o.get&&o.get._x_alreadyBound||o.set&&o.set._x_alreadyBound)return!0;if((o.get||o.set)&&o.enumerable){let s=o.get,a=o.set,c=o;s=s&&s.bind(t),a=a&&a.bind(t),s&&(s._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(i,n,{...c,get:s,set:a})}return!0}return!1})||{})[n],set:(r,n,i)=>{let o=e.find(s=>s.hasOwnProperty(n));return o?o[n]=i:e[e.length-1][n]=i,!0}});return t}function Ee(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0)return;let c=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,c,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,c)})};return r(e)}function Se(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>Cn(n,i),s=>ut(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function Cn(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function ut(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),ut(e[t[0]],t.slice(1),r)}}var Qt={};function y(e,t){Qt[e]=t}function ce(e,t){return Object.entries(Qt).forEach(([r,n])=>{let i=null;function o(){if(i)return i;{let[s,a]=ft(t);return i={interceptor:Se,...s},be(t,a),i}}Object.defineProperty(e,`$${r}`,{get(){return n(t,o())},enumerable:!1})}),e}function er(e,t,r,...n){try{return r(...n)}catch(i){X(i,e,t)}}function X(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine Expression Error: ${e.message} - -${r?'Expression: "'+r+`" - -`:""}`,t),setTimeout(()=>{throw e},0)}var Ae=!0;function Oe(e){let t=Ae;Ae=!1;let r=e();return Ae=t,r}function R(e,t,r={}){let n;return x(e,t)(i=>n=i,r),n}function x(...e){return tr(...e)}var tr=dt;function rr(e){tr=e}function dt(e,t){let r={};ce(r,e);let n=[r,...L(e)],i=typeof t=="function"?Rn(n,t):Mn(n,t,e);return er.bind(null,e,t,i)}function Rn(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(F([n,...e]),i);Te(r,o)}}var pt={};function Nn(e,t){if(pt[e])return pt[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(async()=>{ ${e} })()`:e,o=(()=>{try{return new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`)}catch(s){return X(s,t,e),Promise.resolve()}})();return pt[e]=o,o}function Mn(e,t,r){let n=Nn(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=F([o,...e]);if(typeof n=="function"){let c=n(n,a).catch(l=>X(l,r,t));n.finished?(Te(i,n.result,a,s,r),n.result=void 0):c.then(l=>{Te(i,l,a,s,r)}).catch(l=>X(l,r,t)).finally(()=>n.result=void 0)}}}function Te(e,t,r,n,i){if(Ae&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>Te(e,s,r,n)).catch(s=>X(s,i,t)):e(o)}else typeof t=="object"&&t instanceof Promise?t.then(o=>e(o)):e(t)}var mt="x-";function O(e=""){return mt+e}function nr(e){mt=e}var ht={};function p(e,t){return ht[e]=t,{before(r){if(!ht[r]){console.warn("Cannot find directive `${directive}`. `${name}` will use the default order of execution");return}let n=H.indexOf(r);H.splice(n>=0?n:H.indexOf("DEFAULT"),0,e)}}}function le(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([a,c])=>({name:a,value:c})),s=_t(o);o=o.map(a=>s.find(c=>c.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(o)}let n={};return t.map(ir((o,s)=>n[o]=s)).filter(or).map(In(n,r)).sort(Dn).map(o=>Pn(e,o))}function _t(e){return Array.from(e).map(ir()).filter(t=>!or(t))}var gt=!1,ue=new Map,sr=Symbol();function ar(e){gt=!0;let t=Symbol();sr=t,ue.set(t,[]);let r=()=>{for(;ue.get(t).length;)ue.get(t).shift()();ue.delete(t)},n=()=>{gt=!1,r()};e(r),n()}function ft(e){let t=[],r=a=>t.push(a),[n,i]=Ht(e);return t.push(i),[{Alpine:j,effect:n,cleanup:r,evaluateLater:x.bind(x,e),evaluate:R.bind(R,e)},()=>t.forEach(a=>a())]}function Pn(e,t){let r=()=>{},n=ht[t.type]||r,[i,o]=ft(e);Yt(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),gt?ue.get(sr).push(n):n())};return s.runCleanups=o,s}var Ce=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Re=e=>e;function ir(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=cr.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var cr=[];function Z(e){cr.push(e)}function or({name:e}){return lr().test(e)}var lr=()=>new RegExp(`^${mt}([^:^.]+)\\b`);function In(e,t){return({name:r,value:n})=>{let i=r.match(lr()),o=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var xt="DEFAULT",H=["ignore","ref","data","id","bind","init","for","model","modelable","transition","show","if",xt,"teleport"];function Dn(e,t){let r=H.indexOf(e.type)===-1?xt:e.type,n=H.indexOf(t.type)===-1?xt:t.type;return H.indexOf(r)-H.indexOf(n)}function q(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}function T(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>T(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)T(n,t,!1),n=n.nextElementSibling}function S(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var ur=!1;function dr(){ur&&S("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),ur=!0,document.body||S("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's `